试图模仿关于按位运算的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 =偶数为'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&插件。
通过创建一个使用原始Vand(vect : std_logic_vector; b: std_logic)
的子函数Vand
来解决第二个问题(并且在此过程中发现了我的Vnor中的一个错误)。仍然希望找到比这两个功能更好的解决方案。
答案 0 :(得分:1)
有一些名为or_reduce
和and_reduce
的功能可以满足您的需求。他们还会在输入上调用to_X01
,这意味着H
和L
将转换为1
和0
。
可以在std_logic_misc
std_logic_vector
中找到ieee.numeric_std
的{{1}},并为signed
unsigned
和std_logic_vector
向量的anded <= and v;
ored <= or v;
提出下一轮VHDL版本。< / p>
VHDL-2008也允许在{{1}} s:
上使用此语法{{1}}