可乐机的设计验证

前言

状态机(State Machine)是一种数学模型,用于表示具有有限状态集合的系统。它通过定义状态、转移规则和事件,描述系统在不同条件下的行为。状态机的核心概念包括状态、事件、转移和动作。状态是系统的具体条件或配置,事件是引发状态变化的外部输入,而状态转移是系统从一个状态到另一个状态的过程。状态机广泛应用于计算机科学、电子工程和控制系统中,用于建模复杂的逻辑和行为,如网络协议、用户界面和自动化控制。通过将系统行为分解为离散状态和转移规则,状态机能够清晰地描述和管理系统的动态特性。

状态机(FSM),同步(与时钟)有限状态机,分Moore型状态机(输出仅与当前状态有关),Mealy型状态机(输出与当前状态和输入有关),二者的状态跳转与输入有关。

正文

一、XXXX的设计验证

1.项目需求

可乐机,每次只能投一元,可乐售价3元,当连续投入三枚一元硬币后可乐机吐出可乐。

2.技术介绍

使用 `parameter` 定义了三个状态:`wit`(等待状态),`one`(状态一),`two`(状态二)。设置状态寄存器:`stater` 是一个 3 位宽的寄存器,用于存储当前状态。在时钟上升沿或复位信号的下降沿触发时,状态机根据当前状态和 `po_money` 的值决定状态转移。

`wit` 状态下,若收到投币信号,则转到 `one` 状态,否则保持在 `wit`。

`one` 状态下,若再次收到投币信号,则转到 `two` 状态,否则保持在 `one`。

`two` 状态下,若再一次收到投币信号,则转回 `wit` 状态,否则保持在 `two`。

po_cola` 输出信号,在 `two` 状态且 `po_money` 为1时设为1,表示可以取到饮料;否则设为取不到饮料。

模拟一个饮料自动售货机的基本功能,即在接收到两次投币信号后,允许取到饮料。每个状态的转移逻辑确保了系统能够在不同的状态间正确地转换,并在达到条件时输出正确的信号。

3.顶层架构

4.端口描述

|----------|-------------|
| clk | 时钟信号(50Mhz) |
| rst_n | 复位信号(低电平有效) |
| pi_money | 一元硬币投入 |
| po_cola | 可乐输出 |

二、代码验证

复制代码
module cola_ji(

	input			clk,
	input			rst_n,
	input			po_money,//一元输入
	
	output  reg	    po_cola//可乐输出,alwaya中赋值用reg
	
);

parameter wit = 3'b001;//等待
parameter one = 3'b010;//一元
parameter two = 3'b100;//两元

reg [2:0]stater;

always @(posedge clk,negedge rst_n)
begin
	if(rst_n == 0)
		stater <= wit;
	else case(stater)
		wit : if(po_money == 1'b1)//一元输入,状态跳转
					stater <= one;
				else
					stater <= wit;
		one : if(po_money == 1'b1)//一元输入,状态跳转
					stater <= two;
				else
					stater <= one;
		two : if(po_money == 1'b1)//一元输入,状态跳转
					stater <= wit;
				else
					stater <= two;
		default : stater <= wit;
	endcase
end

always @(posedge clk,negedge rst_n)
begin
	if(rst_n == 0)
		po_cola <= 1'b0;
	else
		if((stater == two)&&(po_money == 1'b1))//二元时一元输入,可乐输出
			po_cola <= 1'b1;
		else
			po_cola <= 1'b0;
end

endmodule

仿真代码

复制代码
`timescale 1ns/1ps
module  cola_ji_tb;

	reg			clk;
	reg			rst_n;
	reg			po_money;
	
	wire			po_cola;


cola_ji cola_ji_inst(

	.clk			(clk		),
	.rst_n		(rst_n	),
	.po_money	(po_money),
	             
	.po_cola		(po_cola	)
	
);
	
initial clk = 1;
always #10 clk = ~clk;

initial begin 
	rst_n = 0;
	po_money = 1'b0;
	#20
	rst_n = 1;
	#20
	po_money = 1'b1;
	#20
	po_money = 1'b0;
	#20
	po_money = 1'b1;
	#20
	po_money = 1'b0;
	#20
	po_money = 1'b1;
	#20
	po_money = 1'b0;//三元硬币投入
	#20
	
	
	po_money = 1'b1;
	#20
	po_money = 1'b0;
	#20
	po_money = 1'b1;
	#20
	po_money = 1'b0;
	#20
	po_money = 1'b1;
	#20
	po_money = 1'b0;//三元硬币投入
	#20
	
	po_money = 1'b1;
	#20
	po_money = 1'b0;
	#20
	po_money = 1'b1;
	#20
	po_money = 1'b0;
	#20
	po_money = 1'b1;
	#20
	po_money = 1'b0;//三元硬币投入
	#200
	$stop;
end

endmodule

三、仿真验证

代码编译通过,观察状态转移图,点击如下图位置

可以看到与理论绘制的状态转移图相同

观察rtl电路图,stater为上图的状态转移图

运行仿真,可乐输出正常,按照理论逻辑输出,调出中间信号观察

可乐在二元状态下检测到再次投入的一元硬币时,可乐投出。

参考资料

状态机

相关推荐
Joshua-a2 小时前
Quartus命令行烧录FPGA
fpga开发
FPGA_无线通信5 小时前
OFDM FFT 时频域转换
fpga开发
XINVRY-FPGA7 小时前
EP4CE30F23I7N Altera Cyclone IV E SRAM FPGA
嵌入式硬件·fpga开发·云计算·硬件工程·信息与通信·信号处理·fpga
156082072198 小时前
FPGA(采用RGMII接口)逻辑实现千兆网TCP/IP协议栈调试记录
网络协议·tcp/ip·fpga开发
9527华安8 小时前
FPGA纯verilog实现JESD204B协议,基于AD9250数据接收,提供3套工程源码和技术支持
fpga开发·jesd204b·ad9250
FPGA_无线通信9 小时前
OFDM 精频偏补偿
算法·fpga开发
我爱C编程10 小时前
【仿真测试】基于FPGA的完整16QAM软解调链路实现,含频偏锁定,帧同步,定时点,Viterbi译码,信道,误码统计
fpga开发·16qam·软解调·帧同步·维特比译码·频偏估计·定时点提取
高速上的乌龟11 小时前
Lattice LFCPNX-100 Fpga开发+源码:基于spi协议的flash驱动控制
fpga开发
ehiway12 小时前
中科亿海微SoM模组——FPGA高速信号采集解决方案
fpga开发
tiantianuser19 小时前
RDMA设计13:融合以太网协议栈设计2
fpga开发·rdma·高速传输·cmac·roce v2