VHDL,FPGA上的并发信号分配错误,但在Modelsim中

时间:2015-06-09 09:51:31

标签: signals vhdl fpga modelsim

我正在修改乘法器,我在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";

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

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

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上提供正确的结果而另一个选项没有。

1 个答案:

答案 0 :(得分:1)

我认为您的并发声明是错误的:

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

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

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

但默认值(其他=&gt;'0')可能不是你想要的。也许你真的想要一个锁存器,所以你应该将a_argument的赋值放入一个时钟进程中,当booth与“110”和“011”不同时,a_argument的锁存就完成了:

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