【问题标题】:AND all elements of an n-bit array in VHDL与 VHDL 中 n 位数组的所有元素
【发布时间】:2013-11-30 03:47:18
【问题描述】:

假设我有一个 n 位数组。我想 AND 数组中的所有元素。类似于将每个元素连接到 n 位与门。

如何在 VHDL 中实现这一点?

注意:我正在尝试使用可重复使用的 VHDL 代码,因此我想避免像这样的硬编码

    result <= array(0) and array(1) and array(2)....and array(n); 

谢谢 奥沙拉

【问题讨论】:

标签: vhdl digital-design


【解决方案1】:

解决方案 1:使用一元运算符

VHDL-2008 定义了一元运算符,如下所示:

outp <= and "11011";
outp <= xor "11011";
outp <= and inp; --this would be your case

但是,您的编译器可能还不支持它们。

解决方案 2:使用纯组合(和传统)代码

由于在并发代码中您不能多次为信号赋值,因此您可以创建一个具有“额外”维度的临时信号。在您的情况下,输出是一位,因此 temp 信号应该是一维数组,如下所示。

-------------------------------------------
entity unary_AND IS
    generic (N: positive := 8); --array size
    port (
        inp: in bit_vector(N-1 downto 0);
        outp: out bit);
end entity;
-------------------------------------------
architecture unary_AND of unary_AND is
    signal temp: bit_vector(N-1 downto 0);
begin
    temp(0) <= inp(0);
    gen: for i in 1 to N-1 generate
        temp(i) <= temp(i-1) and inp(i);
    end generate; 
    outp <= temp(N-1); 
end architecture;
-------------------------------------------

推断电路如下图所示。

解决方案 3:使用顺序代码

这比解决方案 2 更简单,尽管您现在使用顺序代码来解决纯粹的组合问题(但硬件将是相同的)。您可以编写类似于解决方案 2 中的代码,但使用 processloop(后者代替 generate)或使用函数。因为在顺序代码中,您可以多次为信号赋值,所以这里不需要解决方案 2 的 temp 信号。

【讨论】:

  • 如果您的编译器支持 VHDL-2008,请提出一个错误...他们已经有 5 年的时间来整合它!
【解决方案2】:

如果你有 VHDL-2008 可用,那么减少 and 被内置到 正如 David Koontz 和 Pedroni 所解释的那样。

如果您只有 VHDL-2003 和先前版本可用,那么您可以使用函数 喜欢:

function and_reduct(slv : in std_logic_vector) return std_logic is
  variable res_v : std_logic := '1';  -- Null slv vector will also return '1'
begin
  for i in slv'range loop
    res_v := res_v and slv(i);
  end loop;
  return res_v;
end function;

然后您可以在内部和外部函数中使用该函数:

signal arg : std_logic_vector(7 downto 0);
signal res : std_logic;
...
res <= and_reduct(arg);

【讨论】:

    【解决方案3】:

    我最喜欢的非 VHDL-2008 解决方案是:

    use ieee.std_logic_unsigned.all ;  -- assuming not VHDL-2008
    . . . 
    result <= '1' when not MyArray = 0 else '0' ; 
    

    对于 VHDL-2008,我建议您使用内置的“and”归约(参见 Pedroni 的帖子)并使用 IEEE 标准包“ieee.numeric_std_unsigned.all”而不是共享软件包“std_logic_unsigned”。

    【讨论】:

    • 出于好奇,使用 std_logic_unsigned 的示例有效,因为有一个相等运算符在标准逻辑向量左参数和整数右参数之间进行计算。此方法也依赖于非标准包 std_logic_arith 并且不会像逻辑归约 AND 那样传递“X”或“Z”来产生结果,只需评估 std_logic_vector 的每个左右元素的相等性,将 0 转换为等价STD_LOGIC 元素的签名数组。为了一个简单的表达,在幕后发生了很多震动。
    • 您可以通过使用来自 MyArray 的范围约束并使用为所有一维数组(离散数组)预定义的两个 std_logic_vector 之间的相等运算符声明一个常量 std_logic_vector 为 '1',从而以更少的工作获得相同的结果类型。这种更简单的方法还取决于不需要传递'X' or or 'Z'
    • @大卫。该语言还允许使用更易读的表达式“MyArray = (MyArray'range => '1')”,但是,虽然这是合法的 VHDL,但我最后一次使用 Synopsys DesignCompiler 检查它不起作用 - 所以它不是一种可移植的方法.值得庆幸的是,我们无需过多担心这些事情,因为 VHDL-2008 已经创建了一个首选的解决方案。
    • 所有在场使用符合 -2008 标准工具集的人举手。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多