其他通用参数使用的vhdl通用参数(错误:通用“参数”在此处不可见)

时间:2019-05-02 20:25:01

标签: vhdl

在Verilog中,我可以定义一个参数,然后使用它来定义另一个参数。例如:

module stuff1 #(
   parameter AW = 16,
   parameter DW = 16,
   parameter FW = AW + DW + 2,
) (
    input   wire [AW-1:0]     adr,
    input   wire [DW-1:0]     dat,
    output  wire [FW-1:0]     fifo
);
endmodule

如何在VHDL泛型中做类似的事情?示例:

library ieee;
use ieee.std_logic_1164.all;

entity stuff1 is
    generic(
        AW          : integer := 15;
        DW          : integer := 15;
        FW          : integer := AW + DW + 2
    );
    port(
        adr   : in    std_logic_vector(AW-1 downto 0);
        dat   : in    std_logic_vector(DW-1 downto 0);
        fifo  : out   std_logic_vector(FW-1 downto 0)
    );
end entity;

architecture rtl of stuff1 is
begin

end architecture;

当我尝试编译此代码时,在VHDL中出现以下错误:

..\..\simtools\ghdl\bin\ghdl.exe -a bus_direct_server.vhdl
stuff1.vhdl: generic "aw" is not visible here
stuff1.vhdl: generic "dw" is not visible here

我想知道,在VHDL中是否可以通过AW和DW自动计算FW参数?还是Verilog在这一次更时髦呢?

2 个答案:

答案 0 :(得分:0)

我不知道技巧是否可以通过综合,但是它可以在GHDL模拟器中使用。首先创建一个具有通过aw和dw参数计算fw的函数的包:

library ieee;
use ieee.std_logic_1164.all;

package pkg_stuff1 is
    function fw_calc (aw: natural; dw: natural) return natural;
end package;

package body bus_direct is

    function fw_calc (aw: natural; dw: natural) return natural is
    begin
        return dw + aw + 2;
    end function;

end package body;

一旦我们设置了软件包,就可以使用它了:

library ieee;
use ieee.std_logic_1164.all;
using work.pkg_stuff1.all;

entity stuff1 is
    generic(
        AW          : integer := 15;
        DW          : integer := 15
    );
    port(
        adr   : in    std_logic_vector(AW-1 downto 0);
        dat   : in    std_logic_vector(DW-1 downto 0);
        fifo  : out   std_logic_vector(fw_calc(aw, dw)-1 downto 0)
    );
end entity;

architecture rtl of stuff1 is
begin

end architecture;

答案 1 :(得分:0)

为什么你不这样做呢?

library ieee;
use ieee.std_logic_1164.all;

entity stuff1 is
    generic(
        AW          : integer := 15;
        DW          : integer := 15;
    );
    port(
        adr   : in    std_logic_vector(AW-1 downto 0);
        dat   : in    std_logic_vector(DW-1 downto 0);
        fifo  : out   std_logic_vector(AW+DW+1 downto 0)
    );
end entity;

architecture rtl of stuff1 is
begin

end architecture;

我假设您要保留的输入和输出向量之间存在某种关系。拥有与其他参数相关的通用参数似乎是一种不好的做法。