HDL Coder™ поддерживает операции сдвига бит, вращения бит, среза бит, которые имитируют HDL-специфические операторы без логики насыщения и округления.
Следующий код реализует переключатель/вращатель баррелей, который выполняет выбранную операцию (на основе mode
аргумент) на входном операнде с фиксированной точкой.
function y = fcn(u, mode) % Multi Function Barrel Shifter/Rotator % fixed width shift operation fixed_width = uint8(3); switch mode case 1 % shift left logical y = bitsll(u, fixed_width); case 2 % shift right logical y = bitsrl(u, fixed_width); case 3 % shift right arithmetic y = bitsra(u, fixed_width); case 4 % rotate left y = bitrol(u, fixed_width); case 5 % rotate right y = bitror(u, fixed_width); otherwise % do nothing y = u; end
В этой таблице показан сгенерированный код VHDL и Verilog.
Сгенерированный VHDL код | Сгенерированный код Verilog |
---|---|
В VHDL® код, сгенерированный для этой функции, функции сдвига и вращения отображаются непосредственно, чтобы сдвинуть и повернуть инструкции в VHDL. CASE mode IS WHEN "00000001" => -- shift left logical --'<S2>:1:8' cr := signed(u) sll 3; y <= std_logic_vector(cr); WHEN "00000010" => -- shift right logical --'<S2>:1:11' b_cr := signed(u) srl 3; y <= std_logic_vector(b_cr); WHEN "00000011" => -- shift right arithmetic --'<S2>:1:14' c_cr := SHIFT_RIGHT(signed(u) , 3); y <= std_logic_vector(c_cr); WHEN "00000100" => -- rotate left --'<S2>:1:17' d_cr := signed(u) rol 3; y <= std_logic_vector(d_cr); WHEN "00000101" => -- rotate right --'<S2>:1:20' e_cr := signed(u) ror 3; y <= std_logic_vector(e_cr); WHEN OTHERS => -- do nothing --'<S2>:1:23' y <= u; END CASE; | Соответствующий Verilog® код аналогичен, за исключением того, что Verilog не имеет собственных операторов для команд вращения. case ( mode) 1 : begin // shift left logical //'<S2>:1:8' cr = u <<< 3; y = cr; end 2 : begin // shift right logical //'<S2>:1:11' b_cr = u >> 3; y = b_cr; end 3 : begin // shift right arithmetic //'<S2>:1:14' c_cr = u >>> 3; y = c_cr; end 4 : begin // rotate left //'<S2>:1:17' d_cr = {u[12:0], u[15:13]}; y = d_cr; end 5 : begin // rotate right //'<S2>:1:20' e_cr = {u[2:0], u[15:3]}; y = e_cr; end default : begin // do nothing //'<S2>:1:23' y = u; end endcase |
bitsliceget
и bitconcat
функции сопоставляются непосредственно с операторами slice и concatenate в VHDL и Verilog.
Можно использовать функции bitsliceget
и bitconcat
для доступа к битовым срезам (полям) и управления ими в виде слова с фиксированной точкой или целого числа. В качестве примера рассмотрим операцию смены верхнего и нижнего 4-битных сглаживаний 8-битного байта. Следующий пример выполняет эту задачу, не прибегая к традиционным методам маски и сдвига.
function y = fcn(u) % NIBBLE SWAP y = bitconcat( … bitsliceget(u, 4, 1), bitsliceget(u, 8, 5));
В этой таблице показан сгенерированный код VHDL и Verilog.
Сгенерированный VHDL код | Сгенерированный код Verilog |
---|---|
В следующем списке показаны соответствующие сгенерированные коды VHDL. ENTITY fcn IS PORT ( clk : IN std_logic; clk_enable : IN std_logic; reset : IN std_logic; u : IN std_logic_vector(7 DOWNTO 0); y : OUT std_logic_vector(7 DOWNTO 0)); END nibble_swap_7b; ARCHITECTURE fsm_SFHDL OF fcn IS BEGIN -- NIBBLE SWAP y <= u(3 DOWNTO 0) & u(7 DOWNTO 4); END fsm_SFHDL; | В следующем списке показан соответствующий сгенерированный код Verilog. module fcn (clk, clk_enable, reset, u, y ); input clk; input clk_enable; input reset; input [7:0] u; output [7:0] y; // NIBBLE SWAP assign y = {u[3:0], u[7:4]}; endmodule |