verilog实现状态机
如愿
- 一、使用工具
- 二、要求
- 三、需求分析
- 四、时序切换
- 五、检测10010串
- 六、总结
一、使用工具
Quartus 18.1
二、要求
1、根据以下描述功能用verilog编写一段代码, 并用状态机来实现该功能。
(1)状态机:实现一个测试过程,该过程包括启动准备状态、启动测试、停止测试、查询测试结果、显示测试结果、测试结束返回初始化6个状态;用时间来控制该过程,90秒内完成该过程;
(2)描述状态跳转时间;
(3)编码实现。
2. 画出可以检测10010串的状态图, 并用verilog编程实现之。
三、需求分析
对于第一个要求,是实现六个状态,并且用时间来控制这个过程,说简单一点,就是根据时间切换六个状态
对于第二个要求,需要检测10010的数据串,只有当10010依次输入时,才能通过检测,而实现这个功能,可以通过按键来模拟0和1的值,并且使用6个状态,只有当输入的值正确之后,才能进入下一个状态,不然就会回到出事状态
四、时序切换
- 状态切换代码
module six_state (//90s内六个状态切换input wire clk, //时钟,50Minput wire rst_n, //复位信号output wire [3:0] led //1s脉冲信号
);
//6个切换状态
parameter s1= 1;
parameter s2= 2;
parameter s3= 3;
parameter s4= 4;
parameter s5= 5;
parameter s6= 6;
//切换时间状态为1s
parameter MAX_NUM=26'd50_000_000;reg [3:0] led_r;
reg [2:0] cstate;//现在的状态
reg [25:0] cnt;//计数模块
always @(posedge clk or negedge rst_n) beginif(!rst_n)cnt <= 26'd0;else if (cnt == MAX_NUM)cnt <= 26'd0;else cnt <= cnt + 1'd1;
end//状态切换模块
always @(posedge clk or negedge rst_n) beginif(!rst_n)cstate <= 3'b0;else if (cnt == MAX_NUM) beginif (cstate == 3'd6) begincstate <= 3'b0;end else begincstate <= cstate + 1'b1;end end else cstate <= cstate ;
end//状态输出模块
always @(posedge clk or negedge rst_n) beginif(!rst_n)led_r <= 4'b0;else begincase (cstate)s1: led_r <= 4'b0001;s2: led_r <= 4'b0010;s3: led_r <= 4'b0100;s4: led_r <= 4'b1000;s5: led_r <= 4'b0011;s6: led_r <= 4'b0111;default : led_r <= led_r ;endcaseend
endassign led = led_r ;endmodule
- 效果
五、检测10010串
- 按键消抖模块
module key_debounce( //按键消抖模块input wire clk,input wire rst_n,input wire key,output wire key_value, //按键稳定信号output wire flag //按键稳定标志
);parameter delay_time = 1_000_000;reg [22:0] delay_cnt;
reg key_reg;
reg flag_r;
reg key_value_r;
//0.2ms计时器
always@(posedge clk or negedge rst_n)beginif(!rst_n)key_reg <= 1'b0;else beginkey_reg <= key;if(key_reg == 1'b1 && key == 1'b0)begindelay_cnt <= delay_time;endelse if (delay_cnt == 20'd0) delay_cnt <= 20'd0;else if (key_reg == 1'b0 && key == 1'b0)delay_cnt <= delay_cnt -1'd1;end
end//控制flag
always@(posedge clk or negedge rst_n)beginif(!rst_n)flag_r <= 1'b0;else if (delay_cnt == 20'd1)flag_r <= 1'b1;else flag_r <= 1'b0;
endassign flag = flag_r;
//得到输出值
always@(posedge clk or negedge rst_n)beginif(!rst_n)key_value_r <= 1'b0;else if (delay_cnt == 20'd1)key_value_r <= ~key ;else key_value_r <= key_value_r;
endassign key_value =key_value_r;endmodule
- 密码模块
/* 密码:10010 */
module password(input wire clk,input wire rst_n,input wire [1:0] key,output wire [3:0] led);//转态空间parameter IDLE = 3'd0;
parameter S1 = 3'd1;//按对一个
parameter S2 = 3'd2;//按对两个
parameter S3 = 3'd3;//按对三个
parameter S4 = 3'd4;//按对四个
parameter S5 = 3'd5;//按对五个
parameter MAX_NUM=26'd49_999_999;reg [2:0] cstate;
reg [3:0] led_r;
reg [25:0] cnt;//1s计时器
always@(posedge clk or negedge rst_n)beginif(!rst_n)cnt <= 26'd0;else if (cnt == MAX_NUM)cnt <= 26'd0;else cnt <= cnt + 1'd1;
endalways@(posedge clk or negedge rst_n)beginif(!rst_n) begincstate <= IDLE;endelse begincase(cstate)IDLE:beginif(key[1])begincstate <= S1;endelse if(key[0])cstate <= IDLE;elsecstate <= cstate;endS1:beginif(key[0])begincstate <= S2;endelse if(key[1])cstate <= IDLE;elsecstate <= cstate;endS2:beginif(key[0])begincstate <= S3;endelse if(key[1])cstate <= IDLE;elsecstate <= cstate;endS3:beginif(key[1])begincstate <= S4;endelse if(key[0])cstate <= IDLE;elsecstate <= cstate;endS4:beginif(key[0])begincstate <= S5;endelse if(key[1])cstate <= IDLE;elsecstate <= cstate;enddefault:cstate <= cstate;endcaseendend//状态输出
always@(posedge clk or negedge rst_n)beginif(!rst_n)led_r <= 4'b0;else begincase(cstate)IDLE: led_r <= 4'b0001;S1: led_r <= 4'b0010;S2: led_r <= 4'b0100;S3: led_r <= 4'b1000;S4: led_r <= 4'b1110;S5: led_r <= 4'b1111;default led_r <= led_r;endcaseendendassign led =led_r;endmodule
- 状态检测顶层模块
module state_judge_top(input wire clk,input wire rst_n,input wire [1:0] key,output wire [3:0] led
);wire [1:0] key_value;
wire [1:0] flag;key_debounce i0_key_debounce(
.clk (clk),
.rst_n (rst_n),
.key (key[0]),.key_value (key_value[0]), //按键稳定信号
.flag (flag[0])//按键稳定标志
);
key_debounce i1_key_debounce(
.clk (clk),
.rst_n (rst_n),
.key (key[1]),.key_value (key_value[1]), //按键稳定信号
.flag (flag[1])//按键稳定标志
);password i_password(
.clk (clk),
.rst_n (rst_n),
.key ({key_value[1]&&flag[1],key_value[0]&&flag[0]}),.led (led));endmodule
- 效果
六、总结
- 在序列串较短的时候,用状态切换不仅思路清晰,而且比较简单,但是在序列串比较长的时候,这种方法就不适用了,是否可以考虑存储之后再进行比较,但这样又怎么发挥FPGA并行的优势呢。
verilog实现状态机相关推荐
- Verilog写状态机的三种描述方式之三段式
Verilog写状态机的三段式描述方式1 1,RTL代码 2,门级网表 3,测试前仿真代码 4,前仿真波形+验证 状态机的设计思路: 一是从状态机变量入手,分析各个状态的输入.状态转移和输出: 二是先 ...
- Verilog中状态机编码方式的选择:二进制编码(Binary)、格雷码(Gray-code)编码、独热码(One-hot)编码
一般的,在Verilog中最常用的编码方式有二进制编码(Binary).格雷码(Gray-code)编码.独热码(One-hot)编码. 二进制码和格雷码是压缩状态编码. 若使用格雷编码,则相邻状态转 ...
- verilog之状态机详细解释(二)
一.有限状态机设计的一般步骤: 1) 逻辑抽象,得出状态转换图 就是把给出的一个实际逻辑关系表示为时序逻辑函数,可以用状态转换表来描述,也可以用状态转换图来描述.这就需要: • 分析给定的逻辑问题,确 ...
- verilog之状态机详细解释(一)
一.有限状态机定义 有限状态机(Finite-State Machine,FSM),又成为有限状态自动机,简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型.笔者常在电机控制. ...
- 基于Verilog用状态机设计交通灯控制器
1.题目:用状态机设计交通灯控制器,设计要求:A路和B路都有红.黄.绿三种灯,持续时间为红灯45s.黄灯5s.绿灯40s.A路和B路交通灯的状态转移为 (1)A红,B绿(持续时间40s): (2)A红 ...
- Verilog实现状态机与状态机经典示例——序列检测器、自动饮料售卖机
原文链接:https://blog.csdn.net/qq_34070723/article/details/100737225 作者:King阿金 目录 1.状态机原理与三段式状态机 2.状态机示例 ...
- verilog基础-状态机之FPGA独立按键消抖设计与验证(熟练testbench的写法)
独立按键消抖设计与验证 本实验主要是为了锻炼状态机的思维模式以及熟练掌握TB的写法 本节主要收获了:define的用法,另外就是,顶层的input在TB中是reg的真正含义,其实就是把激励当做寄存器来 ...
- Verilog利用状态机实现的交通灯控制
设计要求: A路和B路,每路都有红.黄.绿三种灯,持续时间为:红灯45s,黄灯5s,绿灯40s.A路和B路灯的状态转换是: (1)A红,B绿 (2)A红,B黄 (3)A绿,B红 (4)A黄,B红 Ve ...
- verilog中状态机的三种编码方式的比较(二进制码、独热码、格雷码)
最近做了一个小项目,是关于状态机中三种编码方式的比较,总结了一下三种编码方式的不同,可以会在以后IC笔试面试过程中用到,简单记录一下三种编码方式的优缺点. 三种编码方式如下图所示:其中独热码只有一位为 ...
- verilog之状态机的结构
最新文章
- 一种实时轻量级3D人脸对齐方法
- thinkphp mysql json数据类型_ThinkPHP:JSON字段类型的使用(ORM)
- 双向循环链表的插入排序
- linux字符驱动之概念介绍
- 剖析 Apache 顶级项目 SkyWalking 的源码 ,看看它有什么好?
- SQLServer 2008 r2 下载地址(百度云)及安装图解
- jarsigner 命令对 apk 加密
- ppt模板怎样用到html中,手把手教你怎么选用PPT模板
- Pulseaudio入门介绍(一)
- JavaScript 数组方法find()
- 实验十三——DD和S-MAC协议仿真实验
- 小米拒绝权限_手机用户隐私保护升级:小米MIUI 11支持“空信息授权”
- 分享Silverlight/WPF/Windows Phone一周学习导读(06月06日-06月11日)
- YUV转RGB查表方式的代码
- [乱搞 树状数组] BZOJ 4548 小奇的糖果 BZOJ 3658 Jabberwocky
- 朴素贝叶斯-后验概率最大化的含义(公式最后的推导)
- spark任务运行源码
- position详解
- 计算机网络基础名词,计算机网络基础名词解释
- 用Eicon接口卡来连接帧中继线路(转)