我正在使用先前设计的一位ALU从事VHDL项目设计8位ALU。为此,我使用generate语句生成ALU的1-6位,而在该块之外处理位0和7。发生的事情是当我去模拟ALU时,无论输入是什么,1-6位都不会改变值。我知道一位ALU工作正常,因为实例化8位一位ALU手动按预期工作。
我认为发生的事情无论出于何种原因,生成块内的组件实例化都没有正确编译。当我在ModelSim中运行模拟时,消息显示在脚本中,表示"组件实例bit1_6:bitslice未绑定"。为了说明发生了什么,我为架构发布的代码firstGen没有编译,说"没有找到标签bit1_6:bitslice的语句" (使用FOR ALL:...掩盖不良行为,因为lsb和msb被实例化很好)。有谁知道发生了什么?
ENTITY alu8bit IS
PORT( A, B : IN bit_vector(7 downto 0);
P,K,R : IN bit_vector(3 downto 0);
ci : IN bit;
Z : OUT bit_vector(7 downto 0);
co : OUT bit);
END;
ARCHITECTURE firstGen of alu8bit IS
COMPONENT bitslice
PORT(a, b, ci: IN bit;
P, K, R : IN bit_vector(3 downto 0);
ri, cn: OUT bit);
END COMPONENT;
FOR bit1_6: bitslice USE ENTITY work.one_bit_alu(alu_1_bit);
FOR others : bitslice USE ENTITY work.one_bit_alu(alu_1_bit);
signal c : bit_vector(7 downto 1);
BEGIN
lsb : bitslice PORT MAP(A(0), B(0), ci, P, K, R, Z(0), c(1));
GEN_MIDDLE_BITS: FOR I IN 1 TO 6 GENERATE
bit1_6 : bitslice PORT MAP(A(I), B(I), c(I), P, K, R, Z(I), c(I+1));
end generate;
msb : bitslice PORT MAP(A(7), B(7), c(7), P, K, R, Z(7), co);
END;
答案 0 :(得分:3)
generate语句为命名空间添加了一层额外的层次结构。使用内部配置规范时,您仅限于在直接范围内配置组件。生成(或块)内的任何内容都变得无法访问。您可以使用generate语句的声明性区域来指定中间切片的配置绑定:
GEN_MIDDLE_BITS: FOR I IN 1 TO 6 GENERATE
for bit1_6 : bitslice use entity work.one_bit_alu(alu_1_bit);
begin
bit1_6 : bitslice PORT MAP(A(I), B(I), c(I), P, K, R, Z(I), c(I+1));
end generate;
您还可以考虑使用外部配置声明将所有内容保存在一起。如果需要,可以类似于VHDL-93直接实体实例化来实例化配置。