三段式状态机_FPGA笔试题——序列检测(FSM状态机)
FSM有限状态机,是FPGA和数字IC相关岗位必须要掌握的知识点,在笔试和面试中都非常常见。
(1)了解状态机:什么是摩尔型状态机,什么是米利型状态机,两者的区别是什么?一段式、二段式、三段式状态机的区别?
(2)使用状态机产生序列“11010110”,串行循环输出该序列;
(3)使用状态机检测“1101”,串行输入的测试序列为“11101101011010”,输出信号为valid有效信号,检测到时输出高,否则为低,考虑序列叠加情况,比如“1101101”,则有两个“1101”,
即:
时钟 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
… |
输入 |
1 |
1 |
1 |
0 |
1 |
1 |
0 |
1 |
0 |
1 |
1 |
0 |
1 |
0 |
… |
输出 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
1 |
… |
11101101011010,在第5个时钟检测到序列,下一个时钟输出高电平;
11101101011010,在第8个时钟检测到序列,下一个时钟输出高电平;
11101101011010,在第13个时钟检测到序列,下一个时钟输出高电平;
给出WORD或PDF版本的报告,包括但不限于文字说明、代码、仿真测试图等。
【解答】:
(1)状态机
状态机由状态寄存器和组合逻辑电路构成,能够根据控制信号按照预先设定的状态进行状态转移,是协调相关信号动作、完成特定操作的控制中心。有限状态机简写为FSM(Finite State Machine),主要分为2大类:
第一类,输出只和状态有关而与输入无关,则称为Moore状态机;
第二类,输出不仅和状态有关而且和输入有关系,则称为Mealy状态机。
Mealy型:输出信号不仅取决于当前状态,还取决于输入;
Moore型:输出信号只取决于当前状态;
实现相同的功能时,Mealy型比Moore型能节省一个状态(大部分情况下能够节省一个触发器资源,其余情况下使用的资源相同,视状态数和状态编码方式决定),Mealy型比Moore型输出超前一个时钟周期。
(2)状态机写法
一段式:一个always块,既描述状态转移,又描述状态的输入输出,当前状态用寄存器输出。一段式写法简单,但是不利于维护,状态扩展麻烦,状态复杂时易出错,不推荐;
二段式:两个always块,时序逻辑与组合逻辑分开,一个always块采用同步时序描述状态转移;另一个always块采用组合逻辑判断状态转移条件,描述状态转移规律以及输出,当前状态用组合逻辑输出,可能出现竞争冒险,产生毛刺,而且不利于约束,不利于综合器和布局布线器实现高性能的设计;
三段式:三个always块,一个always模块采用同步时序描述状态转移;一个always采用组合逻辑判断状态转移条件,描述状态转移规律;第三个always块使用同步时序描述状态输出,寄存器输出。
三段式与二段式相比,关键在于根据状态转移规律,在上一状态根据输入条件判断出当前状态的输出,从而在不插入额外时钟节拍的前提下,实现了寄存器输出。
(3)状态机序列检测
使用三段式FSM有限状态机进行序列检测,使用摩尔型状态机,最终输出与输入无关。
使用状态机检测“1101”,串行输入的测试序列为“11101101011010”,输出信号为valid有效信号,检测到时输出高,否则为低,考虑序列叠加情况,比如“1101101”,则有两个“1101”,
即:
时钟 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
… |
输入 |
1 |
1 |
1 |
0 |
1 |
1 |
0 |
1 |
0 |
1 |
1 |
0 |
1 |
0 |
… |
输出 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
1 |
… |
11101101011010,在第5个时钟检测到序列,下一个时钟输出高电平;
11101101011010,在第8个时钟检测到序列,下一个时钟输出高电平;
11101101011010,在第13个时钟检测到序列,下一个时钟输出高电平;
根据待检测的序列“1101”确定状态,其中S1为检测到第1个有效位“1”,S2为检测到2个有效位“11”,S3为检测到3个有效位“110”,S4位检测到4个有效位“1101”,IDLE为其他状态;
IDLE:初始状态,除S1~S4外的其他所有状态
S1:1, 来1则到S2(11),否则回到IDLE;
S2:11, 来0则到S3(110),否则保持S2(11);
S3:110, 来1则到S4(1101),否则回到IDLE;
S4:1101, 来1则到S2(11),否则回到IDLE;
摩尔型,输出和输入无关,S4时无论输入什么,都输出1
即
三段式FSM的代码:
/************************************************************** Author :FPGA探索者公众号** Times :2020-7-7************************************************************/module FSM_SequDetection_1( clk, rst_n, data_in, data_valid); input clk;input rst_n;input data_in;output reg data_valid; //定义状态,这里采用的独热码(One-Hot),FPGA中推荐用独热码和格雷码(Gray)//状态较少时(4-24个状态)用独热码效果好,状态多时格雷码(状态数大于24)效果好parameter IDLE = 5'b00001;parameter S1 = 5'b00010;parameter S2 = 5'b00100;parameter S3 = 5'b01000;parameter S4 = 5'b10000; reg [4:0] current_state; //现态reg [4:0] next_state; //次态 //三段式FSM,第一段,同步时序逻辑,描述状态切换,这里的写法固定always @ ( posedge clk )begin if(!rst_n ) begin current_state<= IDLE; end elsebegin current_state<= next_state; endend //三段式FSM,第二段,组合逻辑,判断状态转移条件,描述状态转移规律//这里面用"="赋值和用"<="没区别always @ (*)begin if(!rst_n ) begin next_state<= IDLE; end elsebegin case(current_state ) IDLE: begin if(data_in == 1 ) next_state<= S1; else next_state<= IDLE; end S1 : begin if(data_in == 1 ) next_state<= S2; else next_state<= IDLE; end S2 : begin if(data_in == 0 ) next_state<= S3; else next_state<= S2; end S3 : begin if(data_in == 1 ) next_state<= S4; else next_state<= IDLE; end S4 : begin if(data_in == 1 ) next_state<= S2; else next_state<= IDLE; end default : begin next_state<= IDLE; end endcase endend //三段式FSM,第三段,同步时序逻辑,描述状态输出,摩尔型输出always @ ( posedge clk )begin if(!rst_n ) begin data_valid<= 1'b0; end elsebegin case(next_state ) S4 : data_valid <= 1'b1; default : data_valid <= 1'b0; endcase endend endmodule
综合后的RTL图:
其中,状态机部分为:
这里的状态机考虑到复位的情况,不论处在哪个状态,当复位信号有效时,均回到IDLE初始状态。
仿真测试文件(TestBench):
/************************************************************** Author :FPGA探索者公众号** Times :2020-7-7************************************************************/`timescale 1 ns/1 nsmodule FSM_2_tb();reg clk;reg rst_n;reg data_in;wire data_valid;FSM_SequDetection U1( .clk(clk), .rst_n(rst_n), .data_in(data_in), .data_valid(data_valid));initial begin clk = 0; rst_n = 0; #15; rst_n = 1; data_in = 1;#10; data_in = 1;#10; data_in = 1;#10; data_in = 0;#10; data_in = 1;#10; data_in = 1;#10; data_in = 0;#10; data_in = 1;#10; data_in = 0;#10; data_in = 1;#10; data_in = 1;#10; data_in = 0;#10; data_in = 1;#10; data_in = 0;#10; #50; $stop; //停止仿真end always #5 clk = ~clk;endmodule
ModelSim仿真如下,输入“1_1101101_0_1101”,检测到3次有效的“1101”。
欢迎关注:
FPGA、数字IC系列(2)——电子科大与北航部分Verilog题目与解析
数字电路与Verilog相关题目汇总(1)
三段式状态机_FPGA笔试题——序列检测(FSM状态机)相关推荐
- java面试题总结(三)----本文都是笔试题,值得学习
1. 下面哪些是Thread类的方法() A start() B run() C exit() D getPriority() 答案:ABD 解析:看Java AP ...
- 百度笔试题面试题集总
1:堆和栈的区别,什么时候用堆什么时候用栈? 2:树的深度优先搜索算法 按照某种条件往前试探搜索,如果前进中遭到失败(正如老鼠钻迷宫老鼠遇到死胡同)则退 回头另选通路继续搜索,直到找到条件的目标为止. ...
- 状态机fsm_Verilog专题(三十二)101 Sequence Recognition Mealy FSM(101序列识别状态机)...
HDLBits网址:https://hdlbits.01xz.net/wiki/Main_Page 题目 实现一个Mealy型有限状态机,该机可以识别输入信号x上的序列" 101" ...
- Java工程师笔试题整理[校招篇]
Java工程师笔试题整理[校招篇] 阿里巴巴 2016 阿里巴巴2016研发工程师笔试题(四) 阿里巴巴2016研发工程师笔试题(三) 阿里巴巴2016研发工程师笔试题(二) 2015 阿里巴巴201 ...
- 【转】IT公司求职宝典(二十大IT公司薪资待遇及面试笔试题合集)
转载自 bdjingchao 最终编辑 bdjingchao 一.谷歌 工资:google(谷歌) 18W+,会有股票 应聘资料:google2011年校园招聘大礼包 Google笔试题 谷歌笔试 ...
- 【零基础玩转BLDC系列】无刷直流电机无位置传感器三段式启动法详细介绍及代码分享
无刷直流电动机基本转动原理等内容请参考<基于霍尔传感器的无刷直流电机控制原理>.<基于反电动势过零检测法的无刷直流电机控制原理>与<以GD32F30x为例定时器相关功能详 ...
- FSM状态机的学习与实现
最近,学习了一下FSM状态机,觉得挺有意思的. 百科上得来的解释为:有限状态机,(英语:Finite-state machine, FSM),又称有限状态自动机,简称状态机,是表示有限个状态以及在这些 ...
- 重迭式三段式状态机序列检测器-检测10110110
重迭式三段式状态机序列检测器-检测10110110 要求:序列检测器 clk input clock input rst_n input asynchronous reset, low active ...
- IC/FPGA校招笔试题分析(四)再看Moore状态机实现序列检测器
参加了几次笔试,发现序列检测器是常考的内容,而之前认为序列检测器真的很简单,但是这次X疆的笔试题做完之后,我怀疑自己了. 画状态转移图的时候,我开始犹豫了,我怕我会没考虑全,甚至有点晕. 人家又问: ...
最新文章
- 保证计算机网络的稳定运行,厦门大学校园网管理保证网络稳定运行
- nmake构建Geos库
- Google Chrome —— 使用 PowerShell 命令安装 Google Chrome 浏览器
- wxWidgets:wxTaskBarButton 示例
- 关于计算机专业的作文800字,我的电脑作文800字范文
- mysql8.0.11 zip安装教程
- sp_executesql介绍和使用 转
- 标称型数据和数值型数据_统计信息中的数据类型-标称,有序,间隔和比率数据类型,并举例说明
- Mybatis的基本步骤
- Docker学习--基本docker命令
- asp.net中控制反转的理解
- 数据库系统概念 第四章 习题答案
- iperf3网络测速
- linux能远程开机么,Linux下如何实现远程开机
- 转换uptime_王者荣耀角色转换什么时候正式上线_王者荣耀角色转换上线时间-超分手游网...
- php sku颜色,PHP 产品库 SPU、SKU 如何设计?
- 微信小程序之三元操作符
- ios获取所有相册的视频并播放
- android 模拟器 blue,Win下的Android模拟器BlueStacks
- hacking 麦步手表之(4)制作一个大数字表盘xzy-big-number
热门文章
- android 进程有时间片运行,kernel笔记——进程调度
- GStreamer基础教程04 - 动态连接Pipeline
- Redis常用数据类型和事物以及并发
- 基于WebQQ3.0协议写一个QQ机器人
- docker run 与docker start的区别
- Topcoder SRM 655 DIV1 250 CountryGroupHard
- Oracle Golden Gate 系列十六 -- 配置 GG 安全 说明 与 示例
- asp.net学习之扩展GridView
- 为什么[]比list()更快?
- Google浏览器开发者工具:CSSViewer(一个Css查看器)