我是VHDL的新手,我想问一下我可以使用哪个通用术语如果我想编写可以开发的任何大小的输入向量?
GENERIC (n1 : integer);
x:IN BIT_VECTOR(n1-1 downto 0);
这是一个正确的例子吗?
答案 0 :(得分:1)
您的通用没有可见的默认值。
您对x
的声明不完整。它似乎是一个具有模式的实体声明项,而您没有端口声明。
此VHDL代码在语法和语义上都有效:
entity foo is
generic ( n1: integer);
port (
x: in bit_vector(n1-1 downto 0)
);
end entity;
architecture fum of foo is
begin
end architecture;
它会分析。如果不知道n1
的值,就无法详细说明:
entity foo_tb is
constant N_1: integer := 4;
end entity;
architecture fum of foo_tb is
signal x: bit_vector (N_1-1 downto 0);
begin
DUT:
entity work.foo
generic map (n1 => N_1)
port map ( x => x);
end architecture;
实体foo
本身不能成为详细模型的顶级,因为n1
未定义用于详细说明。
可以详细说明实体foo_tb
,它使用常量N_1
为n1
提供值。
foo_tb
甚至可以被模拟,但它会立即退出,因为初始化后没有待处理的信号分配。
foo
和foo_tb
都不能合成。 foo_tb
因为它没有端口,并且其中的任何逻辑设计层次结构都将被优化为未使用。 foo
因为它只有一个输出,并且最多只是一个常量。
如果foo
有多个端口,输出取决于输入,只要定义了通用,就可以进行合成或模拟。
(这里的道德是使用Minimal, Complete, and Verifiable example,所以有人不必挥手解决它的缺点。)
答案 1 :(得分:1)
您可以使用每个术语,只要它的结果不超过BIT_VECTORS的数组范围。
BIT_VECTOR定义:type BIT_VECTOR is array (NATURAL range <>) of BIT;
所以你的术语可以有0到2 ** 32 - 1
术语示例:
4*n1 - 1 downto 0
n1/4 + 8 downto 0
log2ceilnz(n1) - 1 downto 0
2**n1 - 1 downto 0
答案 2 :(得分:0)
根据“Paebbels”的评论,我编辑了这个答案:
每次你想要合成你的代码时,综合工具应该知道你使用的参数的大小,否则你想要合成什么?!!! (什么硬件?!)
如果要在其自己的实体中合成包含通用参数的顶层模块代码,可以为其分配默认值,例如以下代码:
ENTITY ... IS
GENERIC(n1 : INTEGER := 8);
PORT(
-- use generic parameter
);
END ENTITY;
您也可以在架构内使用泛型参数(信号大小,循环索引,......)。