首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FPGA上并发信号分配错误但Modelsim中正确的VHDL

FPGA上并发信号分配错误但Modelsim中正确的VHDL
EN

Stack Overflow用户
提问于 2015-06-09 09:51:30
回答 1查看 183关注 0票数 0

我正在修改一个乘法器,我在FPGA上运行它有困难。在Modelsim中,仿真结果都是正确的。我在FPGA上得到了以下错误结果:在process语句之外,我有以下并发语句

(我已略去讯号声明)

代码语言:javascript
复制
architecture behavioral of multiplier is
 ...
 ...
begin
       a_argument <=       a1_neg when booth = "110"
                     else  a2_plus when booth = "011"; 

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

代码语言:javascript
复制
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新值的阶段。

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

代码语言:javascript
复制
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上给出了正确的结果,而另一个却没有。

EN

回答 1

Stack Overflow用户

发布于 2015-06-20 00:26:09

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

代码语言:javascript
复制
a_argument <=       a1_neg when booth = "110"
                     else  a2_plus when booth = "011";

当booth与"110“和"011”不同时,您应该有另一条语句。一个好的并发语句的示例:

代码语言:javascript
复制
a_argument <= a1_neg when booth = "110"
              else a2_plus when booth = "011"
              else (others => '0');

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

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30728699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档