架构行为是
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循环中有几个语法错误。
感谢任何反馈,谢谢。
答案 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,就要在不同大小的数组之间进行分配,这是不允许的。