欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 艺术 > Verilog刷题笔记57

Verilog刷题笔记57

2024/10/24 21:20:36 来源:https://blog.csdn.net/shikuanlong/article/details/141474748  浏览:    关键词:Verilog刷题笔记57

题目:
Exams/2014 q3bfsm
Given the state-assigned table shown below, implement the finite-state machine. Reset should reset the FSM to state 000.
在这里插入图片描述
解题:

module top_module (input clk,input reset,   // Synchronous resetinput x,output z
);parameter s0=3'd000,s1=3'd001,s2=3'd010,s3=3'd011,s4=3'd100;reg [2:0]state,next_state;always@(posedge clk)beginif(reset)state=s0;elsestate=next_state;endalways@(*)begincase(state)s0:next_state=x?s1:s0;s1:next_state=x?s4:s1;s2:next_state=x?s1:s2;s3:next_state=x?s2:s1;s4:next_state=x?s4:s3;endcaseendalways@(posedge clk)beginif(reset)z=0;else begincase(next_state)s0:z=0;s1:z=0;s2:z=0;s3:z=1;s4:z=1;default:z=0;endcaseendendendmodule

结果正确:
在这里插入图片描述
注意点:
我一开始编写的代码如下:

module top_module (input clk,input reset,   // Synchronous resetinput x,output z
);parameter s0=3'd000,s1=3'd001,s2=3'd010,s3=3'd011,s4=3'd100;reg [2:0]state,next_state;always@(posedge clk)beginif(reset)state=s0;elsestate=next_state;endalways@(*)begincase(state)s0:next_state=x?s1:s0;s1:next_state=x?s4:s1;s2:next_state=x?s1:s2;s3:next_state=x?s2:s1;s4:next_state=x?s4:s3;endcaseendassign z=next_state==s3|next_state==s4;endmodule

但是这种跑出来的结果错误。
原因分析:

z 的生成方式:
1、第一段代码:z 是在一个 always 块中根据 next_state 的值来决定的。这个 always 块在时钟上升沿触发,使用了同步逻辑来更新 z 的值。
2、第二段代码:z 是通过一个组合逻辑 assign 语句直接从 next_state 的值计算得到的。这种方法是异步的,不依赖于时钟信号。

同步与异步逻辑:
1、第一段代码:z 是通过时钟同步的方式进行更新的,因此它是同步信号。这个设计确保了 z 的更新与时钟边沿对齐,并且和 state 的更新在同一时钟周期内完成。
2、第二段代码:z 是组合逻辑,直接依赖 next_state 的值进行计算。这个设计意味着 z 的值会随 next_state 的改变而立即改变,而不需要等待时钟边沿。

总结
第一段代码中的 z 是同步更新的,而第二段代码中的 z 是组合逻辑生成的。
如果 z 需要在时钟周期内同步更新,第一段代码更为合适。如果 z 可以即时响应 next_state 的变化,第二段代码则更为简洁和高效。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com