【FPGA】Verilog语言通过状态机实现可乐机系统
目录
- 一、实验概述
- 二、模块框图
- 三、状态转移图
- 四、波形图
- 1、时钟与复位信号
- 2、投币信号
- 3、投币记录信号
- 4、状态变量信号
- 5、输出信号
- 五、代码部分
- 1、Verilog代码
- 2、tb仿真代码
- 六、结果及仿真
- 1、综合器综合出的状态转移图
- 2、仿真波形
- 七、总结
一、实验概述
上一篇博客实现了1元硬币的可乐机系统,
参考链接: 【FPGA】状态机的理论学习与实战演练(1元硬币可乐机系统)
此处提升难度,投入硬币的面值除了1元,还可投入0.5元,将可乐的售价定位2.5元。
投币如果不足2.5元,不吐出可乐。
投币如果超过2.5元,吐出可乐并找零钱。
二、模块框图
包含四个输入信号:系统时钟(sys_clk)、复位信号(sys_rst_n)、投币0.5元信号(pi_money_half)以及投币1元信号(pi_money_one)。
两个输出信号:输出可乐(po_cola)、找零(po_money)。
三、状态转移图
四、波形图
1、时钟与复位信号
2、投币信号
(随机画出)
3、投币记录信号
组合逻辑
4、状态变量信号
5、输出信号
五、代码部分
1、Verilog代码
module complex_fsm
(input wire sys_clk,input wire sys_rst_n,input wire pi_money_half,input wire pi_money_one,output reg po_cola,output reg po_money
);parameter IDLE = 5'b00001,HALF = 5'b00010,ONE = 5'b00100,ONE_HALF = 5'b01000,TWO = 5'b10000;wire [1:0] pi_money;
reg [4:0] state;assign pi_money = {pi_money_one,pi_money_half};always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)state <= IDLE;else case(state)IDLE: if(pi_money == 2'b01)state <= HALF;else if(pi_money == 2'b10)state <= ONE;elsestate <= IDLE;HALF: if(pi_money == 2'b01)state <= ONE;else if(pi_money == 2'b10)state <= ONE_HALF;elsestate <= HALF;ONE: if(pi_money == 2'b01)state <= ONE_HALF;else if(pi_money == 2'b10)state <= TWO;elsestate <= ONE;ONE_HALF:if(pi_money == 2'b01)state <= TWO;else if(pi_money == 2'b10)state <= IDLE;elsestate <= ONE_HALF;TWO: if(pi_money == 2'b01)state <= IDLE;else if(pi_money == 2'b10)state <= IDLE;elsestate <= TWO;default:state <= IDLE;endcasealways@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)po_cola <= 1'b0;else if((state == ONE_HALF && pi_money == 2'b10)|| (state == TWO && pi_money == 2'b01)|| (state == TWO && pi_money == 2'b10))po_cola <= 1'b1;elsepo_cola <= 1'b0;always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)po_money <= 1'b0;else if((state == TWO)&&(pi_money == 2'b10))po_money <= 1'b1;elsepo_money <= 1'b0;endmodule
2、tb仿真代码
因投币机同一时间只能投一枚硬币,故pi_money_half与pi_money_one不可能同时为高电平
因此仿真时引入random_date,令pi_money_half = random_date,
pi_money_one = ~random_date
`timescale 1ns/1ns
module tb_complex_fsm();
reg sys_clk;
reg sys_rst_n;
reg pi_money_half;
reg pi_money_one;
reg random_date;wire po_cola;
wire po_money;initialbeginsys_clk = 1'b1;sys_rst_n <= 1'b0;#20sys_rst_n <= 1'b1;endalways@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)random_date <= 1'b0;elserandom_date <= {$random} % 2;always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)pi_money_half <= 1'b0;elsepi_money_half <= random_date;always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)pi_money_one <= 1'b0;elsepi_money_one <= ~random_date;always #10 sys_clk = ~sys_clk;wire [1:0] pi_money = complex_fsm_inst.pi_money;
wire [4:0] state = complex_fsm_inst.state;initialbegin$timeformat(-9,0,"ns",6);$monitor("@time %t:pi_money_half=%b,pi_money_one=%b,pi_money=%b,state=%b,po_cola=%b,po_money=%b",$time,pi_money_half,pi_money_one,pi_money,state,po_cola,po_money);endcomplex_fsm complex_fsm_inst
(.sys_clk(sys_clk),.sys_rst_n(sys_rst_n),.pi_money_half(pi_money_half),.pi_money_one(pi_money_one),.po_cola(po_cola),.po_money(po_money)
);endmodule
六、结果及仿真
1、综合器综合出的状态转移图
2、仿真波形
经分析,与开始手动绘制的波形图吻合,结果正确,此处不再上传上板验证结果。
七、总结
通过这两个实验,我学会了如何绘制状态转移图,如何通过状态转移图来绘制波形,并用代码实现。了解了什么是状态机,以及其应用场景:事件的处理具有前后顺序。Moore型状态机与Mealy型状态机的区别以及在状态转移图中的区别。
在用状态机来解决事件时,需要先提取三要素:输入、输出、状态,以此来绘制状态转移图,并进行化简。
【FPGA】Verilog语言通过状态机实现可乐机系统相关推荐
- verilog语言实现FPGA板的交通信号灯
数字电子技术课程设计报告 设计题目: 交通信号灯 目录 一.概述 二.任务书(任务功能介绍) 三.系统设计 1.基本原理 2.系统设计框图 四.各单元设计(Verilog源代码及仿真图) 五.总体电路 ...
- 基于FPGA的数字电子琴——数电小系统设计【数字电子技术】(使用Vivado中的verilog语言)含piano代码文件(全)
目录 一.电路功能描述 二.方案设计 1. 总体设计方案 2. 对原理框图或程序流程图做出简单解释 3. 各模块介绍 3.1 音频驱动模块 3.2 LED显示模块 3.3 数码管显示模块 3.4 矩阵 ...
- FPGA笔记之verilog语言(基础语法篇)
文章目录 FPGA笔记之verilog语言(基础语法篇) 1. verilog 的基础结构 1.1 verilog设计的基本单元--module 1.2 module的使用 1.3 I/O的说明 1. ...
- 【fpga里Verilog语言的小知识点】
提示:小白撰写,如有错误希望指出 目录 前言 总结 前言 记录一下学习fpga里Verilog语言的小知识点,持续更新. 提示:以下是本篇文章正文内容 1.A = B ? C : D 是一个条件运算符 ...
- FPGA学习之verilog语言入门指导
本人985硕士,在此分享下学习过程,verilog通关!本人博客页也分享了很多课程设计和毕业设计,欢迎收藏观看订阅!谢谢支持! 在学习之前,要思考下为什么学习FPGA,老师要求?项目要求?课题组要求? ...
- (61)FPGA面试题-使用Verilog语言编写异步复位同步释放代码
1.1 FPGA面试题-使用Verilog语言编写异步复位同步释放代码 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA面试题-使用Verilog语言编写异步复位 ...
- (53)FPGA面试题-利用任务task实现单字节乘法功能(Verilog语言实现)
1.1 FPGA面试题-利用任务task实现单字节乘法功能(Verilog语言实现) 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA面试题-利用任务task实现 ...
- (52)FPGA面试题-利用函数function实现半字节加法功能(Verilog语言实现)
1.1 FPGA面试题-利用函数function实现半字节加法功能(Verilog语言实现) 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA面试题-利用函数fu ...
- Verilog语言控制Xilinx FPGA引脚demo
鉴于精力有限,虽然博主本科专业涉及到了一些硬件方面知识,但时间已经久远,所以博客的内容仅限于扫盲用,记录一下过程吧: 博主这边从Xilinx着手了解,一些信息可以从官网获取.Xilinx在2020年被 ...
最新文章
- 敏捷之父Martin Fowler作序推荐《演进式架构》
- 【边缘计算】对边缘计算的理解与思考
- nrf51822-广播模式
- Jlink commander、MCU GD32启动方式、Bootloader
- 电影混混天团经典的台词
- Guest与virtio netdev交互模式
- lucene创建索引的几种方式(一)
- C++ lock 加锁,解锁
- 怎么才能免费下载CSDN资源
- jsp项目如何定位当前页面是哪个jsp
- 救ANGEL出监狱BFS
- Widows Server 2012上无法安装.net framework 3.5
- i.MX283开发板第一个Linux驱动-LED驱动
- 出租车不需要司机了?带你体验无人驾驶出租车!|『智能产品家』第三期
- 《高效学习法》思维导图——Jan
- 2007女足世界杯 巴西 vs 美国 之后
- 在前端弹出后台的错误信息
- 一文搞懂什么是QPS PV 关于并发的面试
- 智能优化算法:爬行动物搜索算法-附代码
- 云计算:数据中心之虚拟机