目录

  • 一、实验概述
  • 二、模块框图
  • 三、状态转移图
  • 四、波形图
    • 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语言通过状态机实现可乐机系统相关推荐

  1. verilog语言实现FPGA板的交通信号灯

    数字电子技术课程设计报告 设计题目: 交通信号灯 目录 一.概述 二.任务书(任务功能介绍) 三.系统设计 1.基本原理 2.系统设计框图 四.各单元设计(Verilog源代码及仿真图) 五.总体电路 ...

  2. 基于FPGA的数字电子琴——数电小系统设计【数字电子技术】(使用Vivado中的verilog语言)含piano代码文件(全)

    目录 一.电路功能描述 二.方案设计 1. 总体设计方案 2. 对原理框图或程序流程图做出简单解释 3. 各模块介绍 3.1 音频驱动模块 3.2 LED显示模块 3.3 数码管显示模块 3.4 矩阵 ...

  3. FPGA笔记之verilog语言(基础语法篇)

    文章目录 FPGA笔记之verilog语言(基础语法篇) 1. verilog 的基础结构 1.1 verilog设计的基本单元--module 1.2 module的使用 1.3 I/O的说明 1. ...

  4. 【fpga里Verilog语言的小知识点】

    提示:小白撰写,如有错误希望指出 目录 前言 总结 前言 记录一下学习fpga里Verilog语言的小知识点,持续更新. 提示:以下是本篇文章正文内容 1.A = B ? C : D 是一个条件运算符 ...

  5. FPGA学习之verilog语言入门指导

    本人985硕士,在此分享下学习过程,verilog通关!本人博客页也分享了很多课程设计和毕业设计,欢迎收藏观看订阅!谢谢支持! 在学习之前,要思考下为什么学习FPGA,老师要求?项目要求?课题组要求? ...

  6. (61)FPGA面试题-使用Verilog语言编写异步复位同步释放代码

    1.1 FPGA面试题-使用Verilog语言编写异步复位同步释放代码 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA面试题-使用Verilog语言编写异步复位 ...

  7. (53)FPGA面试题-利用任务task实现单字节乘法功能(Verilog语言实现)

    1.1 FPGA面试题-利用任务task实现单字节乘法功能(Verilog语言实现) 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA面试题-利用任务task实现 ...

  8. (52)FPGA面试题-利用函数function实现半字节加法功能(Verilog语言实现)

    1.1 FPGA面试题-利用函数function实现半字节加法功能(Verilog语言实现) 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA面试题-利用函数fu ...

  9. Verilog语言控制Xilinx FPGA引脚demo

    鉴于精力有限,虽然博主本科专业涉及到了一些硬件方面知识,但时间已经久远,所以博客的内容仅限于扫盲用,记录一下过程吧: 博主这边从Xilinx着手了解,一些信息可以从官网获取.Xilinx在2020年被 ...

最新文章

  1. 敏捷之父Martin Fowler作序推荐《演进式架构》
  2. 【边缘计算】对边缘计算的理解与思考
  3. nrf51822-广播模式
  4. Jlink commander、MCU GD32启动方式、Bootloader
  5. 电影混混天团经典的台词
  6. Guest与virtio netdev交互模式
  7. lucene创建索引的几种方式(一)
  8. C++ lock 加锁,解锁
  9. 怎么才能免费下载CSDN资源
  10. jsp项目如何定位当前页面是哪个jsp
  11. 救ANGEL出监狱BFS
  12. Widows Server 2012上无法安装.net framework 3.5
  13. i.MX283开发板第一个Linux驱动-LED驱动
  14. 出租车不需要司机了?带你体验无人驾驶出租车!|『智能产品家』第三期
  15. 《高效学习法》思维导图——Jan
  16. 2007女足世界杯 巴西 vs 美国 之后
  17. 在前端弹出后台的错误信息
  18. 一文搞懂什么是QPS PV 关于并发的面试
  19. 智能优化算法:爬行动物搜索算法-附代码
  20. 云计算:数据中心之虚拟机

热门文章

  1. 低代码与逐渐数字化的校园
  2. PanoSim仿真模型--驾驶员模型
  3. Mac安装虚拟机(parallels desk或者VmwareFusion)搭建Openstack服务器管理,安装开源的 pritunl 进行服务器连接
  4. 《我的青春谁做主》经典台词一网打尽 搞笑并霹雳
  5. 金属切削加工的基础知识
  6. js打包文件生成zip
  7. [NOI2015] 寿司晚宴(状压DP)
  8. 微信小程序自定义的导航栏
  9. Hive分析窗口函数
  10. android开发内存优化的那些事儿