參加了幾次筆試,發現序列檢測器是常考的内容,而之前認為序列檢測器真的很簡單,但是這次X疆的筆試題做完之後,我懷疑自己了。
畫狀态轉移圖的時候,我開始猶豫了,我怕我會沒考慮全,甚至有點暈。
人家又問:
針對這個具體設計如何衡量驗證的完備性?
這是什麼鬼?
題目:
用Moore型狀态機實作序列“1101”從右到左的不重疊檢測。
1、請畫出狀态轉移圖,其中狀态用S1,S2,...來辨別。
2、針對這個具體設計,如何衡量驗證的完備性?
題目要求從右到左檢測序列1101,也就是說檢測序列1011,先畫出狀态轉移圖,後面我會用狀态機實作,練練狀态機的寫法,很久不寫會生疏。
還需要注意的一個點是不重疊檢測,什麼意思呢?大神告訴我,舉例:不重疊檢測1011011隻能檢測出來一個序列,如果是重疊檢測,則能檢測出來兩個1011.
如下圖,是我畫出的一個狀态轉移圖(測試當時畫出的圖并不是這樣的,哎,這混亂的思維呀)
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiATN381dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5COxYDN4QDOmZDNzQ2Y4U2YxYzX5MzM1ITMxMzLcJTMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
如果沒有要求不重疊檢測,則将S5狀态之後輸入1的下一個狀态跳轉到S3。
根據上面的狀态機,使用三段式狀态機來寫一段實作代碼:
`timescale 1ns / 1ps
//
// Company:
// Engineer: ljs
//
// Create Date: 2019/08/05 19:42:24
//
module Seq_Detect(
input clk,
input rst_n,
input seq_in,
output reg seq_valid
);
localparam S1 = 5'b10000, S2 = 5'b01000, S3 = 5'b00100, S4 = 5'b00010, S5 = 5'b00001;
reg [4 : 0] cur_state, nxt_state;
always @(posedge clk or negedge rst_n) begin
if(~rst_n) cur_state <= S1;
else cur_state <= nxt_state;
end
always@(*) begin
case(cur_state)
S1:
if(seq_in == 1'b0) nxt_state = S1;
else nxt_state = S2;
S2:
if(seq_in == 1'b0) nxt_state = S3;
else nxt_state = S2;
S3:
if(seq_in == 1'b1) nxt_state = S4;
else nxt_state = S1;
S4:
if(seq_in == 1'b1) nxt_state = S5;
else nxt_state = S3;
S5:
if(seq_in == 1'b1) nxt_state = S2;
else nxt_state = S1;
default: nxt_state = S1;
endcase
end
always@(*) begin
if(cur_state == S5) seq_valid = 1'b1;
else seq_valid = 1'b0;
end
endmodule
仿真驗證就不寫了,時間不是太充裕。應該不問題,請自行驗證吧。
歡迎評論。
至于第二問,應該屬于驗證類的東西,請教了下大佬,這樣說:
正常的狀态跳轉,各種出錯狀态的跳轉,輸出是否正确的驗證等。
例如:由于是不重疊檢測,是以1011011隻能檢測到1個有效序列,10111011則能檢測到兩個有效序列。