3分钟快速通关Quarts的Verilog状态机硬件描述语言编程

        状态机的学习是学数电和Verilog的同学避不开的一大难点。而状态机的学习是有一套固定模板的,在本博客中将会简单讲解如何快速入门状态机编程。(所有内容均依赖于Quarts,如有不兼容,适当修改,思路不变。)

1.画状态图。

        状态机编程的优点就是只需要状态图便可以完成题目要求。因此,第一步无疑是画出程序的状态图。

        通过电路图画状态图分为4个步骤:1.判断输出的类型;2.写出激励方方程,状态转换方程和输出方程;3.画状态表;4.画状态图。以上内容在数电教程,csdn和网络上都有明确详细的教程。在本博客中就不一一赘述了。

        如果不是状态图,而是一个具体案例,也可以画一个类状态图,以达到快速替换代码实现状态机编程的目的,由此可见状态图的重要性。

        状态图内容的大致如下图:

 (本图与后文代码无具体关联)。

2.套用代码模板。

module Temp1(clk,A,Z);
input clk,A;	//时钟和输入
output reg Z;	//输出
parameter S0=2'b00,S1=2'b01,S2=2'b10,S3=2'b11;	//四个状态
//状态机第一段///(用于根据输入进入下一个状态)
reg [1:0] current_state, next_state;	//根据需要可更改位数
always@(posedge clk)	//时钟上升沿行动
begin
	current_state <= next_state;	//进入下一个状态
end
/状态机第二段///(用于根据输入和目前状态获得输出和下一个状态)
always@(current_state,A)
begin
	case(current_state)	//case语句进行寻找现状态的具体值
		S0:
		begin
			Z<=0;			//穆尔型不受输入影响,放在if外
			if(A==1)
			begin			//如果为米利型则把Z放在if内,根据状态图赋值
				next_state<=S1;	//根据状态图可修改
			end
			else
			begin
				next_state<=S0;	//根据状态图可修改
			end
		end
		
		S1:						//以下内容修改方式同上
		begin
			Z<=1;
			if(A==1)
			begin
				next_state<=S3;
			end
			else
			begin
				next_state<=S0;
			end
		end
		
		S2:
		begin
			Z<=0;
			if(A==1)
			begin
				next_state<=S3;
			end
			else
			begin
				next_state<=S0;			
			end
		end
		
		S3:
		begin
			Z<=0;
			if(A==1)
			begin
				next_state<=S2;
			end
			else
			begin
				next_state<=S0;
			end
		end
		endcase
end
endmodule

         代码的讲解已经放在注释里了,这里就不再重复了。

       考虑到快速解决问题,本代码模块没有使用复位。如果需要使用复位,可以参考网络和csdn上的其它博主的内容。就当练习一下吧。

        根据状态图可以直接把代码中的部分内容替换。

3.用状态机检查。

        点击Quarts中的Tools栏,选择Netlist Viewers,选择最下面的state machine viewers即可打开状态机栏。

 大致内容如上,可以通过状态机检查内容是否有误。

4.总结。

        状态机的硬件描述语言编程是有一套简单的万用模板的,学会后上手极其简单。

        弘扬开源精神,从大一做起~

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西南胶带の池上桜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值