1

试图模仿有关按位运算的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 中发现了一个错误)。仍然希望有比这两个功能更好的解决方案。

4

1 回答 1

1

有一些函数被调用or_reduceand_reduce它们可以做你想做的事情。他们还调用to_X01输入,这意味着Hand Ls 将被转换为1and 0

它们可以在std_logic_miscfor s 中找到,并被提议用于for和向量std_logic_vector的 VHDL 的下一个版本。ieee.numeric_stdsignedunsigned

VHDL-2008 还允许在std_logic_vectors 上使用这种语法:

anded <= and v;
ored <= or v;
于 2013-07-29T14:43:32.057 回答