VHDL:对向量的各个位进行“或”运算


11

我想将向量的位或在一起。所以说我有一个向量example(23 downto 0),我想把所有的位或到另一个向量中,有没有办法做到这一点而不涉及example(0) or example(1) or ...example(23)去呢?


您可以简单地与零进行比较吗?那会产生相同的效果。
大卫,

要扩展David的注释(使用32位向量),请执行以下操作:or_result <= '0' when input=X"00000000" else '1';更改零数以匹配所讨论向量的长度。

vhdl 2008中提供了逻辑简化,请参见stackoverflow.com/questions/20296276/…–
Moberg

1
您也可以使用更通用的方法:result <= '0' when (example=(example'range=>'0')) else '1';
Miguel Risco

Answers:



5

Verilog有一个方便的“归约运算符”,它可以完全满足您的要求:|example[23:0]给出对example向量的所有位进行“或”运算的结果。

不幸的是,VHDL没有此运算符。根据comp.lang.vhdl的FAQ

没有预定义的VHDL运算符可对向量的所有位执行归约运算(例如,“或”向量的所有位)。但是,归约运算符可以轻松实现:

[跳过不处理'X'和'Z'值的示例]

    function or_reduce( V: std_logic_vector )
                return std_ulogic is
      variable result: std_ulogic;
    begin
      for i in V'range loop
        if i = V'left then
          result := V(i);
        else
          result := result OR V(i);
        end if;
        exit when result = '1';
      end loop;
      return result;
    end or_reduce;
    ...
    b <= or_reduce( b_vec ); 

谁投票否决,为什么要解释一下?
Photon

这是可综合的吗?
Johannes Schaub-litb

@ JohannesSchaub-litb当然可以将其合成为一个很大的“或”门(或一棵较小的树)。可能,标准库中的版本(在Aaron D. Marasco的回答中)将比动态生成的东西更好地进行优化。
Photon

VHDL-2008确实具有一元归约运算符。常见问题解答已过时。此外,由于早期退出,某些工具可能会阻塞,因此所提出的功能具有可疑的综合性,除了作为仿真的微优化之外,其他工具没有必要。
KevinThibedeau
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.