vhdl对向量的按位运算

时间:2013-07-29 12:49:33

标签: function vector vhdl bitwise-operators

试图模仿关于按位运算的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&插件。

编辑2

通过创建一个使用原始Vand(vect : std_logic_vector; b: std_logic)的子函数Vand来解决第二个问题(并且在此过程中发现了我的Vnor中的一个错误)。仍然希望找到比这两个功能更好的解决方案。

1 个答案:

答案 0 :(得分:1)

有一些名为or_reduceand_reduce的功能可以满足您的需求。他们还会在输入上调用to_X01,这意味着HL将转换为10

可以在std_logic_misc std_logic_vector中找到ieee.numeric_std的{​​{1}},并为signed unsignedstd_logic_vector向量的anded <= and v; ored <= or v; 提出下一轮VHDL版本。< / p>

VHDL-2008也允许在{{1}} s:

上使用此语法
{{1}}