组合逻辑循环?新手求助
时间: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));
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这个信号应该是打拍得到的,这样就可以解释了。
组合循环在设计当中允许吗?
实际设计中坚决不允许循环逻辑,状态机都是尽量少用
下面的那段代码是组合循环吗?因为两段代码查表之后的结果都是返回状态机的?
