在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在这一次更时髦呢?
答案 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;
我假设您要保留的输入和输出向量之间存在某种关系。拥有与其他参数相关的通用参数似乎是一种不好的做法。