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®, сгенерированном для этой функции, сдвига и, вращают карту функций непосредственно, чтобы переключить и вращать инструкции в 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
функции сопоставляют непосредственно, чтобы нарезать и конкатенировать операторы и в VHDL и в Verilog.
Можно использовать функции bitsliceget
и bitconcat
получить доступ и управлять секционированными микропроцессорами (поля) в фиксированной точке или целочисленном слове. Как пример, рассмотрите операцию свопинга верхнего и более низкого 4-битного откусывания 8-битного байта. Следующий пример выполняет эту задачу, не обращаясь к традиционным методам маски-и-сдвига.
function y = fcn(u) % NIBBLE SWAP y = bitconcat( … bitsliceget(u, 4, 1), bitsliceget(u, 8, 5));
Следующий листинг показывает соответствующий сгенерированный код 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