VHDL中的融合AND门

时间:2014-04-09 23:50:50

标签: vhdl

and_44

架构行为

variable zero_out : integer := 0;
variable temp_store : std_logic_vector(0 to 43);
variable temp_store_size : integer := 43;

variable output_count : integer := 0;

variable temp_z : std_logic := '1';

begin

for (i in 0 to 43) loop
    if (fuse_map(i) = '1') then --fuse blown
        temp_store_size := tem_store_size - 1;
        temp_store := temp_store(0 to temp_store_size); --reduce temp storage by 1
    elsif (fuse_map(i) = '0') then --fuse not blown, add to list
        temp_store((43-temp_store_size)) <= and_44(i);
    end if  ;
end loop;


for j in 0 to temp_store_size loop
        temp_z <= temp_z and temp_store(j);
end;

z <= temp_z;

end behavioral; 

我试图创建一个 44输入 AND ,它具有保险丝,可以根据fuse_map选择输入。 我需要知道这条线是否正确并允许:

temp_store := temp_store(0 to temp_store_size); 

另外,我的编译器告诉我在第一个for循环中有几个语法错误。

感谢任何反馈,谢谢。

1 个答案:

答案 0 :(得分:2)

您的描述有点模糊,但您似乎想要一个多输入AND门,以控制哪些输入有助于输出。使用为std_logic_vector和相关数组类型定义的现有逻辑运算符,在硬件术语中考虑这些类型的逻辑问题通常很有用。

如果我们采用输入向量并使用从fuse_map派生的掩码对它们进行逻辑或运算,我们将强制使用未使用的输入到&#39; 1&#39;然后可以通过AND减少操作来执行多路AND。 VHDL-2002在ieee.reduce_pack中添加了一组reduce函数。 VHDL-2008将本机逻辑简化添加为一元运算符:and <vector>。对于VHDL-93,您必须提供自己的功能。这种技术的一个警告是你的AND门将评估为&#39; 1&#39;如果在fuse_map中禁用了所有输入。

您想要完成的任务可以通过以下连续分配完成:

output <= and_reduce(inputs or not fuse_map); -- VHDL-93 & 2002
output <= and (inputs or not fuse_map); -- VHDL-2008

以下实体提供了如何执行此操作的完整示例。在实际代码中,如果您不需要多次实现此逻辑,则可以跳过实体并直接使用相同的技术。

library ieee;
use ieee.std_logic_1164.all;

entity and_map is
  port (
    -- Using unconstrained arrays here to maintain flexibility
    -- The inputs and fuse_map signals must have the same width or
    -- you will get an error upon elaboration.
    inputs   : in std_logic_vector;
    fuse_map : in std_logic_vector; -- '1' for active inputs
    output   : out std_logic
  );
end entity;

architecture rtl of and_map is
  -- Use this and_reduce function for VHDL-93 or the and_reduce
  -- from ieee.reduce_pack if you are using VHDL-2002
  -- or the built-in reduction and from VHDL-2008
  function and_reduce(inputs : std_logic_vector) return std_logic is
    variable result : std_logic := '0';
  begin
    for i in inputs'range loop
      result := result and inputs(i);
    end loop;

    return result;
  end function;
begin
  -- Continuous assignment sets unused inputs to '1'
  -- and then uses and_reduce to evaluate them all.
  output <= and_reduce(inputs or not fuse_map);
end architecture;

样式说明: VHDL并不需要围绕控制结构中的表达式使用括​​号。

temp_store := temp_store(0 to temp_store_size);仅在temp_store_size为43时有效。将切片temp_store(0 to temp_store_size)视为在赋值之前临时创建的隐式数组变量。一旦减量temp_store_size,就要在不同大小的数组之间进行分配,这是不允许的。