有限状态机FSM(自动售报机Verilog实现)
有限状态机FSM(自动售报机Verilog实现)
FSM
- 状态机就是一种能够描述具有逻辑顺序和时序顺序事件的方法。
状态机有两大类:Mealy型和Moore型。
Moore型状态机的输出只与当前状态有关,而Mealy型状态机的输出不仅取决于当前状态,还受到输入的直接控制,并且可能与状态无关。
当使用Verilog来描述一个简单状态机的设计时,应将状态寄存器的控制器的控制和状态机状态里的组合逻辑分开。

- 分离功能使得在逻辑部分的代码中可以使用阻塞赋值语句
状态更新逻辑包含状态寄存器,不能被外设读取。组合逻辑使用输入和当前状态值来对输出赋值,并改变状态机的下一状态。
同步时序电路的设计方法
- 逻辑抽象,得出电路的状态转换图或者状态转换表
- 状态化简
- 状态分配(状态编码:Binary,Gray,One-Hot)
- Verilog根据最简状态转换图编程,检查设计的电路能否自启动
四个要素
- 当前输入
- 当前状态
- 下一状态
- 当前输出值
代码风格
一段式
当前状态、下一状态、当前输出值都写在一个always块中
二段式
当前状态、下一状态、当前输出值写在两个always块中
- 注意:这样三种组合方式,及有三种方式写这两个always块。
三段式
当前状态、下一状态、当前输出值分别写在各自的always块中,这样需要3个always块。
自动售报机Verilog实现
设计说明
设计一个简单的数字电路用于电子的报纸售卖机的投币器。
- 假设报纸的价格为15分。
- 投币器只能接受5分和1角的硬币。
- 必须提供适当的数目的零钱,投币器不找零。
- 合法的硬币组合包括1个5分的硬币和1个一角的硬币,3个5分的硬币,1个1角的硬币和1个5分的硬币。2个1角的硬币是合法的,但是投币器不找零。
电路说明
- 当投入硬币时,一个两位的信号coin[1:0]被传送到数字电路。该信号在全局clock信号的下一个下降沿取值,并且准确地保持一个始终周期。
- 数字电路的输出是一位的。每次当投入硬币总数为15分或者超过15分时,输出信号newspaper变为高电平,并且保持一个时钟周期。售卖机的门也被打开。
- 可以用一个reset信号复位有限状态机。假设为同步复位。
有限状态机FSM
可以用有限状态机表示该数字电路的功能。
- 输入:2位,coin[1:0]。没有硬币时,x0 = 2'b00;有一个5分的硬币时,x5 = 2'b01;有一个1角的硬币时,x10 = 2'b10。
- 输出:1位,newspaper。当newspaper = 1'b1时,打开门。
- 状态:4个状态。s0 = 0分,s5 = 5分,s10 = 10分,s15 = 15分。
状态机转换图
| 状态 | 钱数 | 输入 | 硬币[1:0] |
|---|---|---|---|
| s0 | 0分 | x0 | 2'b00 |
| s5 | 5分 | x5 | 2'b01 |
| s10 | 10分 | x10 | 2'b10 |
| s15 | 15分 | - | 无关 |
verilog描述
design code
module vend(
input [1:0] coin,
input clock,
input reset,
output newspaper
);
//声明有限状态机的内部状态
wire [1:0] NEXT_STATE;
reg [1:0] PRES_STATE;
//状态编码
parameter s0 = 2'b00;
parameter s5 = 2'b01;
parameter s10 = 2'b10;
parameter s15 = 2'b11;
//用同步复位、时钟正跳变沿触发的状态触发器
always@(posedge clock)
begin
if(reset == 1'b1)
PRES_STATE <= s0;
else
PRES_STATE <= NEXT_STATE;
end
//组合逻辑
function [2:0] fsm; //状态变化及输出组合逻辑
input [1:0] fsm_coin;
input [1:0] fsm_PRES_STATE;
reg fsm_newspaper;
reg [1:0] fsm_NEXT_STATE;
begin
case(fsm_PRES_STATE)
s0: //状态为s0
begin
if(fsm_coin == 2'b10)
begin
fsm_newspaper = 1'b0;
fsm_NEXT_STATE = s10;
end
else if(fsm_coin == 2'b01)
begin
fsm_newspaper = 1'b0;
fsm_NEXT_STATE = s5;
end
else
begin
fsm_newspaper = 1'b0;
fsm_NEXT_STATE = s0;
end
end
s5: //状态为s5
begin
if(fsm_coin == 2'b10)
begin
fsm_newspaper = 1'b0;
fsm_NEXT_STATE = s15;
end
else if(fsm_coin == 2'b01)
begin
fsm_newspaper = 1'b0;
fsm_NEXT_STATE = s10;
end
else
begin
fsm_newspaper = 1'b0;
fsm_NEXT_STATE = s5;
end
end
s10: //状态为s10
begin
if(fsm_coin == 2'b10)
begin
fsm_newspaper = 1'b0;
fsm_NEXT_STATE = s15;
end
else if(fsm_coin == 2'b01)
begin
fsm_newspaper = 1'b0;
fsm_NEXT_STATE = s15;
end
else
begin
fsm_newspaper = 1'b0;
fsm_NEXT_STATE = s10;
end
end
s15: //状态为s15
begin
fsm_newspaper = 1'b1;
fsm_NEXT_STATE = s0;
end
endcase
fsm = {fsm_newspaper,fsm_NEXT_STATE};
end
endfunction
//每当硬币放入或当前状态改变时,组合逻辑动作
assign {newspaper,NEXT_STATE} = fsm(coin,PRES_STATE);
endmodule
testbench
module vend_tb;
reg clock;
reg reset;
reg [1:0] coin;
wire newspaper;
always #20 clock = ~clock;
initial
begin
clock = 0;
reset = 1;
#100;
reset = 0;
@(posedge clock) coin[1:0] = 2'b00;
@(posedge clock);
@(posedge clock) coin[1:0] = 2'b01;
@(posedge clock);
@(posedge clock) coin[1:0] = 2'b10;
@(posedge clock);
@(posedge clock) coin[1:0] = 2'b10;
@(posedge clock);
@(posedge clock) coin[1:0] = 2'b10;
@(posedge clock);
@(posedge clock) coin[1:0] = 2'b00;
@(posedge clock);
@(posedge clock) coin[1:0] = 2'b01;
@(posedge clock);
@(posedge clock) coin[1:0] = 2'b01;
@(posedge clock);
@(posedge clock) coin[1:0] = 2'b01;
#200 $finish;
end
initial begin
$fsdbDumpfile("test.fsdb");
$fsdbDumpvars();
end
vend u_vend(
.coin(coin),
.clock(clock),
.reset(reset),
.newspaper(newspaper)
);
endmodule
仿真结果
参考资料
[1]. Verilog HDL数字设计与综合(第二版) [美]Simir Palnitkar 著 夏宇闻 等译
[2]. Verilog 数字VLSI设计教程 [美] John Willianms 著 李林 等译
[3]. 有限状态机 FSM 设计
[4]. 有限狀態機FSM coding style整理 (SOC) (Verilog)
有限状态机FSM(自动售报机Verilog实现)的更多相关文章
- FSM自动售货机 verilog 实现及 code 细节讲解
1.题目: 饮料1.5 元, 可投入硬币1 元 0.5 元,输出饮料 零钱 2. 画出状态机. 3.仿真结果:coin=1 --> 0.5 元 coin=2-->1元 4.关键代码分析: ...
- Atitit. 有限状态机 fsm 状态模式
Atitit. 有限状态机 fsm 状态模式 1. 有限状态机 1 2. "状态表"和"状态轮换表" 1 3. 有限状态机概念(状态(State)事件(Even ...
- 玩转华为物联网IoTDA服务系列三-自动售货机销售分析场景示例
场景简介 通过收集自动售货机系统的销售数据,EI数据分析售货销量状况. 该场景主要描述的是设备可以通过MQTT协议与物联网平台进行交互,应用侧可以到物联网平台订阅设备侧变化的通知,用户可以在控制台或通 ...
- cocos2d-x 游戏开发之有限状态机(FSM) (四)
cocos2d-x 游戏开发之有限状态机(FSM) (四) 虽然我们了解了FSM,并且可以写自己的FSM,但是有更好的工具帮我们完成这个繁琐的工作.SMC(http://smc.sourceforge ...
- [原创][FPGA]有限状态机FSM学习笔记(一)
1. 概述--何为有限状态机FSM? 有限状态机-Finite State Machine,简写为FSM,是表示有限个状态及在这些状态之间的转移和动作等行为的数学模型,在计算机领域有着广泛的应用.通常 ...
- 09自动售货机综设实验(含按键消抖,led和状态机)
一设计功能 1.上次状态机的练习 2这次自动售货机综设 (一)对比两次的售货机 上次售货机的关键是画出状态转移图.明确输入分几种,输出是啥,有哪些状态.如下图所示 (二)系统或综合设计的经验: 既然这 ...
- 【BZOJ-4590】自动刷题机 二分 + 判定
4590: [Shoi2015]自动刷题机 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 156 Solved: 63[Submit][Status ...
- BZOJ4590 自动刷题机
Description 曾经发明了信号增幅仪的发明家SHTSC又公开了他的新发明:自动刷题机--一种可以自动AC题目的神秘装置.自动 刷题机刷题的方式非常简单:首先会瞬间得出题目的正确做法,然后开始写 ...
- AOI自动光学检测机技术在电路板检查中的应用
1.简述 AOI技术在许多不同的制造业领域使用,自从电子影像技术开始发展,就被各种人利用在不同的应用领域.大家最熟悉的数字相机.数字摄影机是大家生活中最常用到的器材之一,而工业产品的生产也大量使用这些 ...
随机推荐
- CSS 让标点符号不出现在行首
word-break:break-all; 这条语句的作用是让语句到达边界的时候自动换行,但是正是这个样式让标点符号跑到了行首. 语法: word-break : normal | break-all ...
- 下载文档时Safari浏览器下载后出现".html"问题
下载代码是需要设置 Response.ContentType = "application/octet-stream", 不要设为application/x-msdownload, ...
- CXF自动生成客户端
官网下载apache-cxf-3.1.6,bin目录下.配置环境变量,生成客户端 http://blog.csdn.net/jaune161/article/details/25499939 http ...
- Protocol Buffer Xcode 正确使用思路 成功安装 Xcode7.1
1. 下载protobuf编译工具 序列化是将数据转换为一个特定的类 http://pan.baidu.com/s/1qWrxHxU 下载解压,它不是用来放在你的项目里 2.打开终端 依次输入并等待指 ...
- Hibernate 环境搭建
Hibernate 工作流程 1.创建工程并导包 2.在src根目录下创建配置文件:hibernate.cfg.xml(也可以创建在src其他文件夹下,但是在后面的配置中,需要指明路径) <?x ...
- Oracle 体系结构及安全管理
1 oracle数据库服务器构成:数据库和实例2 oracle内部结构: 物理存储结构: 数据文件(xxx.dbf):存放数据 控制文件(xxx.ctl):控制数据库的完整性恢复数据或使用的日志文件 ...
- 《asp.net mvc3 高级编程》第三章 视图
一.视图的作用 视图的职责是向用户提供界面.从ASP.NET MVC3开始,视图数据也可以通过ViewBag属性访问.例如:ViewBag.Message 就等于ViewData["Mess ...
- wamp环境网站根目录更改
1.修改wampserver的默认目录 安装好wampserver后,网站根目录默认为:安装目录\wamp\www,也就是wampserver安装目录下的www文件夹. 我们以更改为:D\www为例. ...
- DeDe内容调用img
文章内容页调用缩略图方法如下两种.第一种没有大小设置.原图显示.第二种.可以设大小, {dede:field.image/} <img src="{dede:field.litpic ...
- thinkphp G方法的华丽升级
ThinkPHP长期以来需要通过debug_start.debug_end方法甚至Debug类才能完成的功能,3.1版本中被一个简单的G方法取代了,不可不谓是一次华丽升级. G方法的作用包括标记位置和 ...



