【问题标题】:VHDL, concurrent signal assignment wrong on FPGA but right in ModelsimVHDL,FPGA上的并发信号分配错误,但在Modelsim中正确
【发布时间】:2015-06-09 09:51:30
【问题描述】:

我正在修改一个乘法器,但在 FPGA 上运行它时遇到问题。在Modelsim中,仿真都是正确的。我有以下在 FPGA 上给出错误的结果: 在流程语句之外,我有以下并发语句

(我省略了信号声明)

architecture behavioral of multiplier is
 ...
 ...
begin
       a_argument <=       a1_neg when booth = "110"
                     else  a2_plus when booth = "011"; 

a1_neg 和 a2_plus 的值是在进入乘法状态时在过程语句中预先计算出来的:

when MULT_SIGNED_MULT =>
               a1_plus(33 downto 0) <= a(31) & a(31) & a;
               a1_neg(33 downto 0) <= not a(31) &  not a(31) &bv_negate(a);
               a2_plus(33 downto 0) <=   a(31) & a & "0";
               a2_neg(33 downto 0)<= not a(31) &bv_negate(a) & "0";

然后它进入乘数计算影响 a_argument 信号的 booth 新值的阶段

另一方面,当我不预先计算值并直接将所有内容输入并发语句时,如下所示:

a_argument <=      not a(31) &  not a(31) &bv_negate(a)   when booth = "110" 
              else not a(31) &bv_negate(a) & "0"          when booth = "011";

FPGA 将产生正确的结果。此外,无论这两者之间的差异如何,Modelsim 都会给出正确的结果。

我想知道为什么一个选项在 FPGA 上给出了正确的结果而另一个没有。

【问题讨论】:

  • 各种潜在原因。可能是赛跑。 “ModelSim 如何给出正确的结果”?整个进程如何运作?组合?计时?敏感度列表中有什么?
  • a_argument 是一个闩锁,因为您没有提供when others 条件。您应该研究它是如何在您的目标设备中合成的。您只需要一个 2 对 1 多路复用器,因此您可以将 when booth="011" 替换为 when others
  • 查看您的过程敏感度列表,尤其是当您认为综合实现正确而您的模拟错误时。您的代码 sn-ps 不是Minimal, Complete, and Verifiable example
  • 第二个a_argument 分配与booth="011" 案例中的第一个不同 - 它是a2_neg 而不是a2_plus。您发布的代码是否真正反映了您正在测试的内容?

标签: signals vhdl fpga modelsim


【解决方案1】:

我认为你的并发语句是错误的:

a_argument <=       a1_neg when booth = "110"
                     else  a2_plus when booth = "011";

当展位不同于“110”和“011”时,您应该有另一个 else 语句。一个好的并发语句的例子:

a_argument <= a1_neg when booth = "110"
              else a2_plus when booth = "011"
              else (others => '0');

但默认值(其他 => '0')可能不是您想要的。也许你真的想要一个latch,所以你应该把a_argument的赋值放到一个时钟进程中,当booth不是“110”和“011”时,a_argument的latch就完成了:

process(clk)
begin
  if rising_edge(clk) then
    if (booth = "110") then
      a_argument <= a1_neg;
    elsif (booth = "011") then
      a_argument <= a2_plus;
    end if;
end

【讨论】:

    猜你喜欢
    • 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
    相关资源
    最近更新 更多