什么';这个简单的VHDL for循环有什么问题?

什么';这个简单的VHDL for循环有什么问题?,vhdl,modelsim,quartus,Vhdl,Modelsim,Quartus,出于某种原因,OutputMP变量在模拟中总是未初始化。我可以让它在没有for循环的情况下工作,但我真的想让它自动化,这样我以后就可以转到更大的向量了。中间变量工作正常 注意:我是一名DBA和C程序员,对VHDL非常陌生,如果这是一个愚蠢的问题,请原谅 architecture Arch of VectorMultiplier4 is signal Intermediate : std_logic_vector(0 to 4); signal OutputTmp : std_logic; b

出于某种原因,OutputMP变量在模拟中总是未初始化。我可以让它在没有for循环的情况下工作,但我真的想让它自动化,这样我以后就可以转到更大的向量了。中间变量工作正常

注意:我是一名DBA和C程序员,对VHDL非常陌生,如果这是一个愚蠢的问题,请原谅

architecture Arch of VectorMultiplier4 is

signal Intermediate : std_logic_vector(0 to 4);
signal OutputTmp : std_logic;

begin

process (Intermediate)
begin

  for i in 0 to 4 loop
    Intermediate(i) <= (VectorA(i) AND VectorB_Reduced(i));    
  end loop;

  --THIS IS WHAT DOES NOT WORK APPARENTLY
  OutputTmp <= '0';
  for i in 0 to 4 loop
    OutputTmp <= OutputTmp XOR Intermediate(i);
  end loop;
Output <= OutputTmp;
end process;

end architecture;
矢量乘法器4的架构是
信号中间:标准逻辑向量(0到4);
信号输出MP:std_逻辑;
开始
工艺(中间)
开始
对于0到4循环中的i

中间(i)当您进入VHDL进程时,信号将保持其值,直到进程完成(或达到等待)。因此,分配OutputMP的所有行都可以替换为

OutputTmp <= OutputTmp XOR Intermediate(4);

OutputTmp当您进入VHDL进程时,信号将保持其值,直到进程完成(或达到等待)。因此,分配OutputMP的所有行都可以替换为

OutputTmp <= OutputTmp XOR Intermediate(4);

OutputTmp这与Fru1Bat指向的答案略有不同

信号分配的一个特征是,它被安排在当前或未来的模拟时间。当任何模拟过程处于挂起状态时,没有任何信号分配实际生效(所有涉及信号的语句都被分解为保留层次结构和过程的块语句或仅处理过程)

在同一模拟周期内,您不能依赖刚刚分配(计划更新)的信号值

新信号值在当前模拟周期中不可用

在下一个模拟周期(即增量周期)中,波形中无延迟的信号分配(时间后无<代码>)。您只能“看到”信号的当前值

由于
OutputTmp
似乎被命名为中间值,因此您可以在过程中将其声明为变量(删除信号声明,或重命名其中一个)

这将产生
中间
数组元素的奇偶校验值

请注意,
Intermediate
出于同样的原因也被设置为变量,
VectorA
VectorB\u Reduced
已被放置在灵敏度列表中,而不是
Intermediate

所有这些都可以进一步减少

    process (VectorA, VectorB_Reduced)
        variable OutputTmpvar:  std_logic;
    begin

      -- A variable assignment takes effect immediately
      OutputTmpvar := '0';
      for i in 0 to 4 loop
        OutputTmpvar := OutputTmpvar XOR (VectorA(i) AND VectorB_Reduced(i));
      end loop;
    Output <= OutputTmpvar;
    end process;
假设
VectorA
VectorB_
具有相同的维度(边界)

这样做的目的是为合成结果“netlist”的任何节点提供一个唯一的名称,并将生成一个由四个异或门组成的链,这些异或门由五个和门馈电

此过程还显示了如何使用属性处理任何大小匹配边界输入数组(
VectorA
VectorB\u Reduced
)。如果需要处理两个输入具有不同边界但长度相同的情况,可以创建 它们的变量副本具有相同的边界,如果这是在函数中实现的,则作为形式问题,您希望这样做

扁平化XOR链是使用性能约束在合成域中处理的事情。(对于许多FPGA架构,由于XOR的交换和关联特性,XOR将适合于一个LUT)


(以上过程已在VHDL模型中进行了分析、阐述和模拟)。

这与Fru1Bat的答案略有不同

信号分配的一个特征是,它被安排在当前或未来的模拟时间。当任何模拟过程处于挂起状态时,没有任何信号分配实际生效(所有涉及信号的语句都被分解为保留层次结构和过程的块语句或仅处理过程)

在同一模拟周期内,您不能依赖刚刚分配(计划更新)的信号值

新信号值在当前模拟周期中不可用

在下一个模拟周期(即增量周期)中,波形中无延迟的信号分配(时间后无<代码>)。您只能“看到”信号的当前值

由于
OutputTmp
似乎被命名为中间值,因此您可以在过程中将其声明为变量(删除信号声明,或重命名其中一个)

这将产生
中间
数组元素的奇偶校验值

请注意,
Intermediate
出于同样的原因也被设置为变量,
VectorA
VectorB\u Reduced
已被放置在灵敏度列表中,而不是
Intermediate

所有这些都可以进一步减少

    process (VectorA, VectorB_Reduced)
        variable OutputTmpvar:  std_logic;
    begin

      -- A variable assignment takes effect immediately
      OutputTmpvar := '0';
      for i in 0 to 4 loop
        OutputTmpvar := OutputTmpvar XOR (VectorA(i) AND VectorB_Reduced(i));
      end loop;
    Output <= OutputTmpvar;
    end process;
假设
VectorA
VectorB_
具有相同的维度(边界)

这样做的目的是为合成结果“netlist”的任何节点提供一个唯一的名称,并将生成一个由四个异或门组成的链,这些异或门由五个和门馈电

此过程还显示了如何使用属性处理任何大小匹配边界输入数组(
VectorA
VectorB\u Reduced
)。如果需要处理两个输入具有不同边界但长度相同的情况,可以创建 它们的变量副本具有相同的边界,如果这是在函数中实现的,则作为形式问题,您希望这样做

扁平化XOR链是使用性能约束在合成域中处理的事情。(对于许多FPGA架构,由于XOR的交换和关联特性,XOR将适合于一个LUT)


(以上过程已在VHDL模型中进行了分析、阐述和模拟)。

请参见-非常相似哇,我无法通过谷歌搜索找到,谢谢!看-非常相似哇,我无法通过谷歌搜索找到,谢谢!O