FPGA数字IC笔试面试006——FSM有限状态机


牛客好文:

序列产生与序列检测

(1)了解状态机:什么是摩尔型状态机,什么是米利型状态机,两者的区别是什么?一段式、二段式、三段式状态机的区别?

(2)使用状态机检测“1101”,串行输入的测试序列为“11101101011010”,输出信号为valid有效信号,检测到时输出高,否则为低,考虑序列叠加情况,比如“1101101”,则有两个“1101”,

序列产生与序列检测

(1)了解状态机:什么是摩尔型状态机,什么是米利型状态机,两者的区别是什么?一段式、二段式、三段式状态机的区别?

(2)使用状态机检测“1101”,串行输入的测试序列为“11101101011010”,输出信号为valid有效信号,检测到时输出高,否则为低,考虑序列叠加情况,比如“1101101”,则有两个“1101”,


【解答】:

(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”,

根据待检测的序列“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


/************************************************************
** 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 
 else begin
 current_state <= next_state;
 end 
end 
 
//三段式FSM,第二段,组合逻辑,判断状态转移条件,描述状态转移规律
//这里面用"="赋值和用"<="没区别
always @ (*)
begin 
 if( !rst_n ) begin 
 next_state <= IDLE;
 end
 else begin 
 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
 end 
end 
 
//三段式FSM,第三段,同步时序逻辑,描述状态输出,摩尔型输出
always @ ( posedge clk )
begin 
 if( !rst_n ) begin 
 data_valid <= 1'b0;
 end 
 else begin
 case( next_state )
 S4 : data_valid <= 1'b1;
 default : data_valid <= 1'b0;
 endcase
 end 
end 
 
endmodule






状态机的编码风格包括一段式、两段式和三段式,下列描述正确的是
A、一段式寄存器输出,易产生毛刺,不利于时序约束;
B、二段式组合逻辑输出,不产生毛刺,有利于时序约束;
C、三段式寄存器输出,不产生毛刺,有利于时序约束;
D、所有描述风格都是寄存器输出,易产生毛刺,有利于时序约束。

答案:C

解析:

1)一段式:一个always块,既描述状态转移,又描述状态的输入输出,当前状态用寄存器输出

2)二段式:两个always块,时序逻辑与组合逻辑分开,一个always块采用同步时序描述状态转移另一个always块采用组合逻辑判断状态转移条件,描述状态转移规律以及输出当前状态用组合逻辑输出,可能出现竞争冒险,产生毛刺,而且不利于约束,不利于综合器和布局布线器实现高性能的设计

3)三段式:三个always块,一个always模块采用同步时序描述状态转移一个always采用组合逻辑判断状态转移条件,描述状态转移规律第三always使用同步时序描述状态输出寄存器输出

三段式二段式相比,关键在于根据状态转移规律,在上一状态根据输入条件判断出当前状态的输出,从而在不插入额外时钟节拍的前提下,实现了寄存器输出

状态机编码

二进制Binary Code格雷码Gray Code占用的位宽少,相应的使用的触发器资源少,但是状态对比时需要比较多个bit消耗的组合逻辑比较多适用于组合电路资源丰富的情况(CPLD

独热码One-Hot Code状态比较时只比较1bit,节省逻辑资源,使用的触发器资源比较多适用于触发器资源丰富的情况(FPGA);总体来讲,状态较少时4-24个状态用独热码效果好,状态多时格雷码(状态数大于24效果好。

对四个状态编码:

二进制码

S0 = 2'b00; S1 = 2'b01; S2 = 2'b10; S3 = 2'b11;

格雷码相邻码元之间有且只有一位不同:

S0 = 2'b00; S1 = 2'b01; S2 = 2'b11; S3 = 2'b10;

独热码只有一位是“1”

S0 = 2'b0001; S1 = 2'b0010; S2 = 2'b0100; S3 = 2'b1000;

有时候也用连续编码,状态值连续:

S0 = 2'd0; S1 = 2'd1; S2 = 2'd2; S3 = 2'd3;



本文首发于【知乎——FPGA探索者】。


#笔经#
FPGA数字IC笔试100道题 文章被收录于专栏

笔试刷题及解析,FPGA和数字IC类的笔试题汇总、解析,助力实习、提前批、秋招

全部评论
【收藏!】FPGA数字IC求职必备知识点目录——持续更新 https://www.nowcoder.com/discuss/959891 秋招提前批开始,不懂这些可能会错过满意offer! https://www.nowcoder.com/discuss/958964?source_id=profile_create_nctrack&;channel=-1
点赞 回复 分享
发布于 2022-05-29 15:55
现在每天都要看一看面试相关的东西
点赞 回复 分享
发布于 2022-04-27 15:38

相关推荐

迷茫的大四🐶:都收获五个了,兄弟那还说啥,不用改了,去玩吧
点赞 评论 收藏
分享
头像
10-13 18:10
已编辑
东南大学 C++
。收拾收拾心情下一家吧————————————————10.12更新上面不知道怎么的,每次在手机上编辑都会只有最后一行才会显示。原本不想写凉经的,太伤感情了,但过了一天想了想,凉经的拿起来好好整理,就像象棋一样,你进步最快的时候不是你赢棋的时候,而是在输棋的时候。那废话不多说,就做个复盘吧。一面:1,经典自我介绍2,项目盘问,没啥好说的,感觉问的不是很多3,八股问的比较奇怪,他会深挖性地问一些,比如,我知道MMU,那你知不知道QMMU(记得是这个,总之就是MMU前面加一个字母)4,知不知道slab内存分配器-&gt;这个我清楚5,知不知道排序算法,排序算法一般怎么用6,写一道力扣的,最长回文子串反问:1,工作内容2,工作强度3,关于友商的问题-&gt;后面这个问题问HR去了,和中兴有关,数通这个行业和友商相关的不要提,这个行业和别的行业不同,别的行业干同一行的都是竞争关系,数通这个行业的不同企业的关系比较微妙。特别细节的问题我确实不知道,但一面没挂我。接下来是我被挂的二面,先说说我挂在哪里,技术性问题我应该没啥问题,主要是一些解决问题思路上的回答,一方面是这方面我准备的不多,另一方面是这个面试写的是“专业面试二面”,但是感觉问的问题都是一些主管面/综合面才会问的问题,就是不问技术问方法论。我以前形成的思维定式就是专业面会就是会,不会就直说不会,但事实上如果问到方法论性质的问题的话得扯一下皮,不能按照上面这个模式。刚到位置上就看到面试官叹了一口气,有一些不详的预感。我是下午1点45左右面的。1,经典自我介绍2,你是怎么完成这个项目的,分成几个步骤。我大致说了一下。你有没有觉得你的步骤里面缺了一些什么,(这里已经在引导我往他想的那个方向走了),比如你一个人的能力永远是不够的,,,我们平时会有一些组内的会议来沟通我们的所思所想。。。。3,你在项目中遇到的最困难的地方在什么方面4,说一下你知道的TCP/IP协议网络模型中的网络层有关的协议......5,接着4问,你觉得现在的socket有什么样的缺点,有什么样的优化方向?6,中间手撕了一道很简单的快慢指针的问题。大概是在链表的倒数第N个位置插入一个节点。————————————————————————————————————10.13晚更新补充一下一面说的一些奇怪的概念:1,提到了RPC2,提到了fu(第四声)拷贝,我当时说我只知道零拷贝,知道mmap,然后他说mmap是其中的一种方式,然后他问我知不知道DPDK,我说不知道,他说这个是一个高性能的拷贝方式3,MMU这个前面加了一个什么字母我这里没记,别问我了4,后面还提到了LTU,VFIO,孩子真的不会。
走呀走:华子二面可能会有场景题的,是有些开放性的问题了
点赞 评论 收藏
分享
评论
8
23
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务