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版本的报告,包括但不限于文字说明、代码、仿真测试图等。
【解答】:
状态机类型
状态机由状态寄存器和组合逻辑电路构成,能够根据控制信号按照预先设定的状态进行状态转移,是协调相关信号动作、完成特定操作的控制中心。有限状态机简写为fsm(finite state machine),主要分为2大类:
第一类,输出只和状态有关而与输入无关,则称为moore状态机;
第二类,输出不仅和状态有关而且和输入有关系,则称为mealy状态机。
mealy型:输出信号不仅取决于当前状态,还取决于输入;
moore型:输出信号只取决于当前状态;
实现相同的功能时,mealy型比moore型能节省一个状态(大部分情况下能够节省一个触发器资源,其余情况下使用的资源相同,视状态数和状态编码方式决定),mealy型比moore型输出超前一个时钟周期。
三段式状态机
一段式:一个always块,既描述状态转移,又描述状态的输入输出,当前状态用寄存器输出。一段式写法简单,但是不利于维护,状态扩展麻烦,状态复杂时易出错,不推荐;
二段式:两个always块,时序逻辑与组合逻辑分开,一个always块采用同步时序描述状态转移;另一个always块采用组合逻辑判断状态转移条件,描述状态转移规律以及输出,当前状态用组合逻辑输出,可能出现竞争冒险,产生毛刺,而且不利于约束,不利于综合器和布局布线器实现高性能的设计;
三段式:三个always块,一个always模块采用同步时序描述状态转移;一个always采用组合逻辑判断状态转移条件,描述状态转移规律;第三个always块使用同步时序描述状态输出,寄存器输出。
三段式与二段式相比,关键在于根据状态转移规律,在上一状态根据输入条件判断出当前状态的输出,从而在不插入额外时钟节拍的前提下,实现了寄存器输出。
状态机序列检测
使用三段式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笔试题——序列检测(fsm状态机)【状态机序列检测】
文章出处:【微信公众号:fpga之家】欢迎添加关注!文章转载请注明出处。
赵社涛最近成功突破了碳纳米管导电剂的新世代生产技术
电子芯闻早报:京东方或为iPhone供应OLED屏 华为Mate9真机
英创信息技术EM335x精简ISA扩展总线地址总线介绍
stm8和stc单片机比较 单片机的输出信号是什么电平 stm8s单片机采用那种电平
阿贡实验室Chem发文再谈Zn2+配位环境
摩尔型状态机与米利型状态机的区别是什么
电热毯温控器电路及工作原理
希捷酷狼14T氦气硬盘评测 大容量NAS必备之作
电动式全焊接球阀介绍
固态继电器的动态功耗和设计考量
荣耀V30 PRO开启预售 提供三种配色售价3899元起
DC/DC转换厂商:东莞市长工微电子有限公司简介
想要WIFI破解,python+字典,这是是少不了的
使用LTC2874 CQ驱动保护输出的微型白炽灯的应用
微秒级限流式保护器是如何灭弧的
法拉第未来FF91正式亮相采用了130kWh电池包续航能力约595公里
新能汽车快速普及有难度,高补贴却卖不动
智能网联汽车蓬勃发展 西部数据持续引领创新
什么是无人机反制系统
基于无铅工艺的手机芯片UV胶绑定可靠性分析