FSM有限狀態(tài)機(jī),序列產(chǎn)生,序列檢測(cè),是FPGA和數(shù)字IC相關(guān)崗位必須要掌握的知識(shí)點(diǎn),在筆試和面試中都非常常見。
(1)了解狀態(tài)機(jī):什么是摩爾型狀態(tài)機(jī),什么是米利型狀態(tài)機(jī),兩者的區(qū)別是什么?一段式、二段式、三段式狀態(tài)機(jī)的區(qū)別?
(2)使用狀態(tài)機(jī)產(chǎn)生序列“11010110”,串行循環(huán)輸出該序列;
(3)使用狀態(tài)機(jī)檢測(cè)“1101”,串行輸入的測(cè)試序列為“11101101011010”,輸出信號(hào)為valid有效信號(hào),檢測(cè)到時(shí)輸出高,否則為低,考慮序列疊加情況,比如“1101101”,則有兩個(gè)“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個(gè)時(shí)鐘檢測(cè)到序列,下一個(gè)時(shí)鐘輸出高電平;
11101101011010,在第8個(gè)時(shí)鐘檢測(cè)到序列,下一個(gè)時(shí)鐘輸出高電平;
11101101011010,在第13個(gè)時(shí)鐘檢測(cè)到序列,下一個(gè)時(shí)鐘輸出高電平;
給出WORD或PDF版本的報(bào)告,包括但不限于文字說(shuō)明、代碼、仿真測(cè)試圖等。
【解答】:
狀態(tài)機(jī)類型
狀態(tài)機(jī)由狀態(tài)寄存器和組合邏輯電路構(gòu)成,能夠根據(jù)控制信號(hào)按照預(yù)先設(shè)定的狀態(tài)進(jìn)行狀態(tài)轉(zhuǎn)移,是協(xié)調(diào)相關(guān)信號(hào)動(dòng)作、完成特定操作的控制中心。有限狀態(tài)機(jī)簡(jiǎn)寫為FSM(Finite State Machine),主要分為2大類:
第一類,輸出只和狀態(tài)有關(guān)而與輸入無(wú)關(guān),則稱為Moore狀態(tài)機(jī);
第二類,輸出不僅和狀態(tài)有關(guān)而且和輸入有關(guān)系,則稱為Mealy狀態(tài)機(jī)。
Mealy型:輸出信號(hào)不僅取決于當(dāng)前狀態(tài),還取決于輸入;
Moore型:輸出信號(hào)只取決于當(dāng)前狀態(tài);
實(shí)現(xiàn)相同的功能時(shí),Mealy型比Moore型能節(jié)省一個(gè)狀態(tài)(大部分情況下能夠節(jié)省一個(gè)觸發(fā)器資源,其余情況下使用的資源相同,視狀態(tài)數(shù)和狀態(tài)編碼方式?jīng)Q定),Mealy型比Moore型輸出超前一個(gè)時(shí)鐘周期。
三段式狀態(tài)機(jī)
一段式:一個(gè)always塊,既描述狀態(tài)轉(zhuǎn)移,又描述狀態(tài)的輸入輸出,當(dāng)前狀態(tài)用寄存器輸出。一段式寫法簡(jiǎn)單,但是不利于維護(hù),狀態(tài)擴(kuò)展麻煩,狀態(tài)復(fù)雜時(shí)易出錯(cuò),不推薦;
二段式:兩個(gè)always塊,時(shí)序邏輯與組合邏輯分開,一個(gè)always塊采用同步時(shí)序描述狀態(tài)轉(zhuǎn)移;另一個(gè)always塊采用組合邏輯判斷狀態(tài)轉(zhuǎn)移條件,描述狀態(tài)轉(zhuǎn)移規(guī)律以及輸出,當(dāng)前狀態(tài)用組合邏輯輸出,可能出現(xiàn)競(jìng)爭(zhēng)冒險(xiǎn),產(chǎn)生毛刺,而且不利于約束,不利于綜合器和布局布線器實(shí)現(xiàn)高性能的設(shè)計(jì);
三段式:三個(gè)always塊,一個(gè)always模塊采用同步時(shí)序描述狀態(tài)轉(zhuǎn)移;一個(gè)always采用組合邏輯判斷狀態(tài)轉(zhuǎn)移條件,描述狀態(tài)轉(zhuǎn)移規(guī)律;第三個(gè)always塊使用同步時(shí)序描述狀態(tài)輸出,寄存器輸出。
三段式與二段式相比,關(guān)鍵在于根據(jù)狀態(tài)轉(zhuǎn)移規(guī)律,在上一狀態(tài)根據(jù)輸入條件判斷出當(dāng)前狀態(tài)的輸出,從而在不插入額外時(shí)鐘節(jié)拍的前提下,實(shí)現(xiàn)了寄存器輸出。
狀態(tài)機(jī)序列檢測(cè)
使用三段式FSM有限狀態(tài)機(jī)進(jìn)行序列檢測(cè),使用摩爾型狀態(tài)機(jī),最終輸出與輸入無(wú)關(guān)。
使用狀態(tài)機(jī)檢測(cè)“1101”,串行輸入的測(cè)試序列為“11101101011010”,輸出信號(hào)為valid有效信號(hào),檢測(cè)到時(shí)輸出高,否則為低,考慮序列疊加情況,比如“1101101”,則有兩個(gè)“1101”,
即:
|
時(shí)鐘 |
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個(gè)時(shí)鐘檢測(cè)到序列,下一個(gè)時(shí)鐘輸出高電平;
11101101011010,在第8個(gè)時(shí)鐘檢測(cè)到序列,下一個(gè)時(shí)鐘輸出高電平;
11101101011010,在第13個(gè)時(shí)鐘檢測(cè)到序列,下一個(gè)時(shí)鐘輸出高電平;
根據(jù)待檢測(cè)的序列“1101”確定狀態(tài),其中:
S1為檢測(cè)到第1個(gè)有效位“1”;
S2為檢測(cè)到2個(gè)有效位“11”;
S3為檢測(cè)到3個(gè)有效位“110”;
S4位檢測(cè)到4個(gè)有效位“1101”;
IDLE為其他狀態(tài);
IDLE:初始狀態(tài),除S1~S4外的其他所有狀態(tài)
S1:1, 來(lái)1則到S2(11),否則回到IDLE;
S2:11, 來(lái)0則到S3(110),否則保持S2(11);
S3:110, 來(lái)1則到S4(1101),否則回到IDLE;
S4:1101, 來(lái)1則到S2(11),否則回到IDLE;
摩爾型,輸出和輸入無(wú)關(guān),S4時(shí)無(wú)論輸入什么,都輸出1

即
三段式FSM的代碼:
/************************************************************** Author :FPGA探索者公眾號(hào)** 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;//定義狀態(tài),這里采用的獨(dú)熱碼(One-Hot),F(xiàn)PGA中推薦用獨(dú)熱碼和格雷碼(Gray)//狀態(tài)較少時(shí)(4-24個(gè)狀態(tài))用獨(dú)熱碼效果好,狀態(tài)多時(shí)格雷碼(狀態(tài)數(shù)大于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; //現(xiàn)態(tài)reg [4:0] next_state; //次態(tài)//三段式FSM,第一段,同步時(shí)序邏輯,描述狀態(tài)切換,這里的寫法固定always @ ( posedge clk )beginif(!rst_n ) begincurrent_state<= IDLE;endelsebegincurrent_state<= next_state;endend//三段式FSM,第二段,組合邏輯,判斷狀態(tài)轉(zhuǎn)移條件,描述狀態(tài)轉(zhuǎn)移規(guī)律//這里面用"="賦值和用"<="沒區(qū)別always @ (*)beginif(!rst_n ) beginnext_state<= IDLE;endelsebegincase(current_state )IDLE: beginif(data_in == 1 )next_state<= S1;elsenext_state<= IDLE;endS1 : beginif(data_in == 1 )next_state<= S2;elsenext_state<= IDLE;endS2 : beginif(data_in == 0 )next_state<= S3;elsenext_state<= S2;endS3 : beginif(data_in == 1 )next_state<= S4;elsenext_state<= IDLE;endS4 : beginif(data_in == 1 )next_state<= S2;elsenext_state<= IDLE;enddefault : beginnext_state<= IDLE;endendcaseendend//三段式FSM,第三段,同步時(shí)序邏輯,描述狀態(tài)輸出,摩爾型輸出always @ ( posedge clk )beginif(!rst_n ) begindata_valid<= 1'b0;endelsebegincase(next_state )S4 : data_valid <= 1'b1;default : data_valid <= 1'b0;endcaseendendendmodule
綜合后的RTL圖:

其中,狀態(tài)機(jī)部分為:

這里的狀態(tài)機(jī)考慮到復(fù)位的情況,不論處在哪個(gè)狀態(tài),當(dāng)復(fù)位信號(hào)有效時(shí),均回到IDLE初始狀態(tài)。
仿真測(cè)試文件(TestBench):
/************************************************************Author :FPGA探索者公眾號(hào)Times :2020-7-7************************************************************/1 ns/1 nsmoduleFSM_2_tb();reg clk;reg rst_n;reg data_in;wire data_valid;U1(.clk(clk),.rst_n(rst_n),.data_in(data_in),.data_valid(data_valid));initialbeginclk = 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;//停止仿真end=~clk;endmodule
ModelSim仿真如下,輸入“1_1101101_0_1101”,檢測(cè)到3次有效的“1101”。

原文標(biāo)題:FPGA/數(shù)字IC筆試題——序列檢測(cè)(FSM狀態(tài)機(jī))【狀態(tài)機(jī)序列檢測(cè)】
文章出處:【微信公眾號(hào):FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
-
狀態(tài)機(jī)
+關(guān)注
關(guān)注
2文章
495瀏覽量
28719 -
摩爾
+關(guān)注
關(guān)注
0文章
11瀏覽量
8752 -
狀態(tài)寄存器
+關(guān)注
關(guān)注
0文章
39瀏覽量
7370
原文標(biāo)題:FPGA/數(shù)字IC筆試題——序列檢測(cè)(FSM狀態(tài)機(jī))【狀態(tài)機(jī)序列檢測(cè)】
文章出處:【微信號(hào):zhuyandz,微信公眾號(hào):FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
采用米利型的狀態(tài)機(jī)電路設(shè)計(jì)
Spring狀態(tài)機(jī)的實(shí)現(xiàn)原理和使用方法
Verilog狀態(tài)機(jī)+設(shè)計(jì)實(shí)例
玩轉(zhuǎn)Spring狀態(tài)機(jī)
狀態(tài)機(jī)舉例
狀態(tài)機(jī)和組合邏輯的冒險(xiǎn)競(jìng)爭(zhēng)淺析
正點(diǎn)原子開拓者FPGA視頻:狀態(tài)機(jī)
FPGA之狀態(tài)機(jī)的功能簡(jiǎn)述與學(xué)習(xí)建議
FPGA之狀態(tài)機(jī)練習(xí):設(shè)計(jì)思路(4)
什么是狀態(tài)機(jī) 狀態(tài)機(jī)的描述三種方法
FPGA:狀態(tài)機(jī)簡(jiǎn)述

摩爾型狀態(tài)機(jī)與米利型狀態(tài)機(jī)的區(qū)別是什么
評(píng)論