微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 组合逻辑循环?新手求助

组合逻辑循环?新手求助

时间:10-02 整理:3721RD 点击:
always @(*)
begin
   case(state)
   ...
   calcu:
     begin
       address1=tk0;
       address2=tk1;
       add1=data;
       add2=tk3;
       sum=temp;
     end
   ...
    endcase..
end
assign addr = address1 ^ address2;
rom rom(.addr(addr),.data(data));
assign temp=add1+add2;
addr是rom模块的输入地址,data是查表之后的输出。rom模块里也是组合逻辑,就给一个地址,一个输出。状态机输出地址之后经过异或送入查找表,然
后输出值反馈到状态机,作为加法器的一个输入。
这两段代码为什么仿真结果会不一样?下面的这段代码把加法器放在状态机里的仿真结果是正确的,上面的这段代码把加法器放在外面怎么就不对了,最
后的sum为什么不等于temp,这是为什么?是不是因为组合逻辑循环的问题?
个人感觉两段代码都是有组合逻辑循环的,不过上面的这段代码应该有两段组合逻辑的循环。
这是一段示意的代码。实际代码类似
always @(*)
begin
   case(state)
   ...
   calcu:
     begin
       address1=tk0;
       address2=tk1;
       sum=data+tk3;
     end
   ...
    endcase..
end
assign addr = address1 ^ address2;
rom rom(.addr(addr),.data(data));

会不会是always模块里面综合出来了reg,导致sum和temp的值差了一拍

从你给的这些代码看,第一个代码的加法是随便更新结果的,第二个代码的加法只有在state变化的时候才会更新结果。



   
        首先,谢谢你的回复!
但是为什么在上面的代码里,add1是等于查表之后的结果data,data是由状态机的输出变量作为地址查表之后的结果,这也应该是一个组合逻辑循环吧?这里是不是也有可能出问题

是否因为查找rom时,data需要在下一个时钟才能输出。而此时已经不在本状态了呢?你这个状态机非常乱,建议写成时序逻辑的。

上面一段代码是明显的组合回环。
至于为何放到状态机内部就是正确的你想要的结果这个问题。应该是你所列出的代码不是全部,State这个信号应该是打拍得到的,这样就可以解释了。



    组合循环在设计当中允许吗?



    实际设计中坚决不允许循环逻辑,状态机都是尽量少用



    下面的那段代码是组合循环吗?因为两段代码查表之后的结果都是返回状态机的?

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top