假设我有一个 n 位数组。我想 AND 数组中的所有元素。类似于将每个元素连接到 n 位与门。
如何在 VHDL 中实现这一点?
注意:我正在尝试使用可重复使用的 VHDL 代码,所以我想避免硬编码之类的东西
result <= array(0) and array(1) and array(2)....and array(n);
谢谢奥莎拉
假设我有一个 n 位数组。我想 AND 数组中的所有元素。类似于将每个元素连接到 n 位与门。
如何在 VHDL 中实现这一点?
注意:我正在尝试使用可重复使用的 VHDL 代码,所以我想避免硬编码之类的东西
result <= array(0) and array(1) and array(2)....and array(n);
谢谢奥莎拉
解决方案 1:使用一元运算符
VHDL-2008 定义了一元运算符,如下所示:
outp <= and "11011";
outp <= xor "11011";
outp <= and inp; --this would be your case
但是,您的编译器可能还不支持它们。
解决方案 2:使用纯组合(和传统)代码
因为在并发代码中,您不能多次为信号分配值,所以您可以创建一个具有“额外”维度的临时信号。在您的情况下,输出是一位,因此 temp 信号应该是一维数组,如下所示。
-------------------------------------------
entity unary_AND IS
generic (N: positive := 8); --array size
port (
inp: in bit_vector(N-1 downto 0);
outp: out bit);
end entity;
-------------------------------------------
architecture unary_AND of unary_AND is
signal temp: bit_vector(N-1 downto 0);
begin
temp(0) <= inp(0);
gen: for i in 1 to N-1 generate
temp(i) <= temp(i-1) and inp(i);
end generate;
outp <= temp(N-1);
end architecture;
-------------------------------------------
推断电路如下图所示。
解决方案 3:使用顺序代码
这比解决方案 2 更简单,尽管您现在使用顺序代码来解决纯粹的组合问题(但硬件将是相同的)。您可以编写类似于解决方案 2 中的代码,但使用进程和循环(后者代替generate)或使用函数。因为在顺序代码中,您可以多次为信号赋值,所以这里不需要解决方案 2 的 temp 信号。
如果您有可用的 VHDL-2008,那么and
正如 David Koontz 和 Pedroni 所解释的那样,该语言中内置了简化功能。
如果您只有 VHDL-2003 和之前可用的版本,那么您可以使用如下函数:
function and_reduct(slv : in std_logic_vector) return std_logic is
variable res_v : std_logic := '1'; -- Null slv vector will also return '1'
begin
for i in slv'range loop
res_v := res_v and slv(i);
end loop;
return res_v;
end function;
然后,您可以在内部和外部函数中使用该函数:
signal arg : std_logic_vector(7 downto 0);
signal res : std_logic;
...
res <= and_reduct(arg);
我最喜欢的非 VHDL-2008 解决方案是:
use ieee.std_logic_unsigned.all ; -- assuming not VHDL-2008
. . .
result <= '1' when not MyArray = 0 else '0' ;
对于 VHDL-2008,我建议您使用内置的“and”归约(参见 Pedroni 的帖子)并使用 IEEE 标准包“ieee.numeric_std_unsigned.all”而不是共享软件包“std_logic_unsigned”。