天天看點

IC/FPGA校招筆試題分析(四)再看Moore狀态機實作序列檢測器

參加了幾次筆試,發現序列檢測器是常考的内容,而之前認為序列檢測器真的很簡單,但是這次X疆的筆試題做完之後,我懷疑自己了。

畫狀态轉移圖的時候,我開始猶豫了,我怕我會沒考慮全,甚至有點暈。

人家又問:

針對這個具體設計如何衡量驗證的完備性?

這是什麼鬼?

題目:

用Moore型狀态機實作序列“1101”從右到左的不重疊檢測。

1、請畫出狀态轉移圖,其中狀态用S1,S2,...來辨別。

2、針對這個具體設計,如何衡量驗證的完備性?

題目要求從右到左檢測序列1101,也就是說檢測序列1011,先畫出狀态轉移圖,後面我會用狀态機實作,練練狀态機的寫法,很久不寫會生疏。

還需要注意的一個點是不重疊檢測,什麼意思呢?大神告訴我,舉例:不重疊檢測1011011隻能檢測出來一個序列,如果是重疊檢測,則能檢測出來兩個1011.

如下圖,是我畫出的一個狀态轉移圖(測試當時畫出的圖并不是這樣的,哎,這混亂的思維呀)

IC/FPGA校招筆試題分析(四)再看Moore狀态機實作序列檢測器

如果沒有要求不重疊檢測,則将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則能檢測到兩個有效序列。