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
|