Битовые операции в MATLAB для генерации HDL-кода

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

См. также

|

Похожие темы