可乐售卖状态机 verilog FPGA 基础练习4.1

可乐售卖状态机 verilog FPGA 基础练习9.1

发现问题,用技术解决问题。兴趣是自己的源动力 !

前言

状态机其核心就是状态的转换,由以下几个要点。在理解一下几个要素之后就明白状态机设计的核心思维了

  • 输入
  • 输入后得到的状态
  • 该状态对应的输出

一、可乐机-状态机实现

状态机简写为FSM(Finite State Machine),也称为同步有限状态机,我们一般简称为状态机,之所以说“同步”是因为状态机中所有的状态跳转都是在时钟的作用下进行的,而“有限”则是说状态的个数是有限的。状态机根据影响输出的原因分为两大类,即Moore型状态机和Mealy型状态机,其共同点 是:状态的跳转都只和输入有关。区别主要是在输出的时候:

  • 若最后的输出只和当前状态有关而与输入无关则称为Moore型状态机;也就说当前如数会决定输出的
  • 若最后的输出不仅和当前状态有关还和输入有关则称为Mealy型状态机。会延迟

1.1 问题

可乐机每次只能投入1枚1元硬币,且每瓶可乐卖3元钱,即投入3个硬币就可以让可乐机出可乐,如果投币不够3元想放弃投币需要按复位键,否则之前投入的钱不能退回。
下面是状态机跳转图:其中1/0,表示为:输入/输出 ; IDLE、ONE、TWO表示状态
在这里插入图片描述

1.1.1 功能代码

module simple_fsm
(
input wire sys_clk , //系统时钟50MHz
input wire sys_rst_n , //全局复位
input wire pi_money , //投币方式可以为:不投币(0)、投1元(1)

output reg po_cola //po_cola为1时出可乐,po_cola为0时不出可乐

);

// 状态机三要素:输入、状态、输出,这里使用新二段式来写状态机(Mealy状态机更节省资源)

// 输入:是投币,每次1元
// 状态:是当前有多少钱
// 输出:是最终的结果,是否要输出可乐

// 使用独热码定义参数
parameter IDLE = 3'b000;
parameter ONE  = 3'b010;
parameter TWO  = 3'b100;
reg [2:0]state;

// 用时序逻辑写输入和状态跳转的关系
 always@(posedge sys_clk or negedge sys_rst_n) begin
	if(sys_rst_n == 1'b0)
		state <= IDLE;
	else case(state)   // 根据当前状态和输入这两个要素来进行状态的跳转
		IDLE:	if(pi_money == 1'b1)  
					state <= ONE;  
				else	
					state <= IDLE;
		ONE:	if(pi_money == 1'b1)  
					state <= TWO;  
				else	
					state <= ONE;
		TWO:	if(pi_money == 1'b1)   // 因为是Mealy状态机,所以最后一个状态直接跳转,而不写最后一个状态THREE
					state <= IDLE;  
				else	
					state <= TWO;						
		default: state <= IDLE; // 注意要写default
	endcase
 end

// 用时序逻辑写输出
 always@(posedge sys_clk or negedge sys_rst_n) begin
	if(sys_rst_n ==1'b0)
		po_cola <= 1'b0;
	else if(state == TWO & pi_money == 1'b1)
		po_cola <= 1'b1;
	else	
		po_cola <= 1'b0;
end	

endmodule

1.1.2 仿真代码

`timescale 1ns/1ns
module tb_top();


//\* Parameter and Internal Signal \//

//wire define

 //reg define
 reg sys_clk ;
 reg sys_rst_n ;
 
// **********begin:u0_simple_fsm 参数定义**********
reg pi_money;
wire po_cola ;
// **********end:u0_simple_fsm 参数定义**********
 ///
 //\* Main Code \//
 
 //初始化系统时钟、全局复位
 initial begin
 sys_clk = 1'b1;
 sys_rst_n <= 1'b0;
 #20
 sys_rst_n <= 1'b1;
 end

 //sys_clk:模拟系统时钟,每10ns电平翻转一次,周期为20ns,频率为50MHz
 always #10 sys_clk = ~sys_clk;

 always@(posedge sys_clk or negedge sys_rst_n)
	if(sys_rst_n == 1'b0)
		pi_money <= 1'b0;
	else
		pi_money <= {$random} % 2; //取模求余数,产生非负随机数0、1


simple_fsm u0_simple_fsm
(
.sys_clk 		(sys_clk 	), //系统时钟50MHz
.sys_rst_n 		(sys_rst_n 	), //全局复位
.pi_money 		(pi_money 	), //投币方式可以为:不投币(0)、投1元(1)
.po_cola 		(po_cola 	)//po_cola为1时出可乐,po_cola为0时不出可乐

);
 endmodule

1.1.3 仿真结果

在这里插入图片描述

总结

以上就是简单状态机的实现,后续实现一个相对复杂的状态机。

  • 吃透输入、状态、输出之间的关系
  • 欢迎一起交流学习,如有错误之处,还请各位指正。

参考资料

[1] FPGA系列教学

  • 11
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Verilog自动售货机数码管显示是一种使用Verilog语言编写的数字逻辑设计。该设计可以通过Verilog代码实现自动售货机的数码管显示功能,实现对售货机产品信息、价格等进行显示和控制。 Verilog是一种硬件描述语言(HDL),可以用于数字电路的逻辑设计和仿真。通过Verilog的硬件描述能力,可以实现自动售货机数码管的数字显示功能。通过Verilog编写的代码,可以定义数码管控制器、数码管显示模式、数据输入等功能,从而实现对售货机中产品信息的显示。 在Verilog自动售货机数码管显示设计中,需要考虑数码管的类型(比如七段数码管)、数码管控制信号的生成、数据输入端口的定义等关键因素。通过Verilog代码,可以对这些因素进行详细描述,并通过逻辑门、寄存器等数字逻辑元件进行连接和控制,最终实现对数码管显示的控制。 Verilog自动售货机数码管显示设计不仅可以满足售货机对产品信息的显示需求,还可以通过Verilog代码实现显示模式切换、信号输入检测等功能,提高了售货机的用户体验和智能化水平。同时,通过Verilog代码的模块化设计,可以实现对数码管显示部分的灵活扩展和修改,提高了系统的可维护性和可扩展性。 Verilog自动售货机数码管显示设计是数字逻辑设计工程中的一个实际应用,也是Verilog语言在嵌入式系统和数字电路设计中的重要应用之一。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值