необходимо преобразовать функцию серого кода Verilog в VHDL - PullRequest
0 голосов
/ 29 апреля 2019

Сначала Verilog:

function [ADDR_WIDTH-1:0] gray_conv;
    input [ADDR_WIDTH-1:0] in;
begin
    gray_conv = {in[ADDR_WIDTH-1],
         in[ADDR_WIDTH-2:0] ^ in[ADDR_WIDTH-1:1]};
end
endfunction

Вот моя попытка преобразовать функцию серого кода Verilog в vhdl:

library ieee;
use ieee.std_logic_1164.all;

entity bus_fifo_async is
    generic(
        ADDR_WIDTH                : integer := 3;   
        DATA_WIDTH                : integer := 32
    );
    port(
        wr_rst_i                  : in    std_logic;
        wr_clk_i                  : in    std_logic
    );
end entity;

architecture rtl of fifty_shades_of_vhdl is

    function gray_conv(din: std_logic_vector(ADDR_WIDTH-1 downto 0))
        return std_logic_vector(ADDR_WIDTH-1 downto 0) is
    begin
        return ( din(ADDR_WIDTH-1) & (din(ADDR_WIDTH-2 downto 0) 
            xor din(ADDR_WIDTH-1 downto 1)));
    end function;
begin

end architecture;

Компилятор VHDL "barfs" на меня ... говорит ##$ @ # $. vhdl: 44: 35: ограничение индекса здесь не разрешено.

1 Ответ

1 голос
/ 30 апреля 2019

Ответ заключается в том, что VHDL требует, чтобы при возврате std_logic_vector из функции возвращаемая длина std_logic_vector была неограниченной. В этом отличие от verilog, который требует ограниченного типа возвращаемого значения из функции.

«вернуть std_logic_vector» вместо «вернуть std_logic_vector (ADDR_WIDTH-1 до 0)»

library ieee;
use ieee.std_logic_1164.all;

entity bus_fifo_async is
    generic(
        ADDR_WIDTH                : integer := 3;   
        DATA_WIDTH                : integer := 32
    );
    port(
        wr_rst_i                  : in    std_logic;
        wr_clk_i                  : in    std_logic
    );
end entity;

architecture rtl of fifty_shades_of_vhdl is

    function gray_conv(din: std_logic_vector(ADDR_WIDTH-1 downto 0))
        return std_logic_vector is
    begin
        return ( din(ADDR_WIDTH-1) & (din(ADDR_WIDTH-2 downto 0) 
            xor din(ADDR_WIDTH-1 downto 1)));
    end function;
begin

end architecture;
...