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 функции сопоставляют непосредственно, чтобы нарезать и конкатенировать операторы и в 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
|