试图模仿有关按位运算的verilog行为(意思是-一种适用于向量的所有位并输出1位答案的操作。
例子:
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
...
signal vect : std_logic_vector (length -1 downto 0);
signal ans : std_logic;
signal addin : std_logic;
当 vect = all '0' 我希望 ans 为 '1' (也不是)
当 vect = all '1' 我希望 ans 是 '1' (和)
当 vect = even num of '1' 我希望 ans 是 '1' (xor) 等。
我做了以下功能(这里只显示一个):
function vand (vect :std_logic_vector) return std_logic is
variable temp : std_logic;
begin
temp := '1';
for I in (vect'length -1) downto 0 loop
temp := temp and vect(I);
end loop;
return temp;
end;
这个函数应该在所有位上给出“AND”。所以,我的问题来了:
一个。有没有更简单的方法来进行这样的操作?
湾。我正在使用这样的 Vand,if Vand(vect & addin) = '1' do something...
但是当 vect 为 '0H' 而 addin 为 'H' 时,条件已满,我不知道为什么。有人能想到为什么这种操作有问题吗?该函数在其他情况下会表现自己,但在这里我测试了它的快速变化免疫并得到了这种不需要的行为。
编辑
我不知道向量“vect”或向量“vect & addin”的长度。
编辑 2
Vand(vect : std_logic_vector; b: std_logic)
通过创建一个使用原始函数的子函数解决了第二个问题Vand
(并在我的 Vnor 中发现了一个错误)。仍然希望有比这两个功能更好的解决方案。