主頁 > 後端開發 > 序列檢測器(兩種設計方法和四種檢測模式|verilog代碼|Testbench|仿真結果)

序列檢測器(兩種設計方法和四種檢測模式|verilog代碼|Testbench|仿真結果)

2023-05-16 10:05:24 後端開發

目錄
  • 一、前言
  • 二、狀態機法和暫存器法
    • 2.1狀態機法
      • 2.11 使用狀態機檢測“1001”
      • 2.12 verilog代碼
      • 2.13 testbench
      • 2.14仿真結果
    • 2.2移位暫存器法
      • 2.21 使用移位暫存器法檢測1001
      • 2.22 verilog代碼
      • 2.23 testbench
      • 2.24仿真結果
  • 三、重疊檢測與非重疊檢測(檢測序列1001)
    • 3.1重疊檢測
      • 3.11 重疊檢測方法
      • 3.12verilog代碼
      • 3.13Testbench
      • 3.14仿真結果
    • 3.2非重疊檢測
      • 3.21 非重疊檢測方法
      • 3.22verilog代碼
      • 3.23Testbench
      • 3.24仿真結果
  • 四、總結

image



數字IC經典電路設計

經典電路設計是數字IC設計里基礎中的基礎,蓋大房子的第一部是打造結實可靠的地基,每一篇筆者都會分門別類給出設計原理、設計方法、verilog代碼、Testbench、仿真波形,然而實際的數字IC設計程序中考慮的問題遠多于此,通過本系列希望大家對數字IC中一些經典電路的設計有初步入門了解,能力有限,紕漏難免,歡迎大家交流指正,

快速導航鏈接如下:

個人主頁鏈接

1.數字分頻器設計

2.序列檢測器設計

3.序列發生器設計

4.序列模三檢測器設計

5.奇偶校驗器設計

6.自然二進制數與格雷碼轉換



一、前言

在數字電路中,序列檢測器(Sequence Detector)是指一種特殊型別的電路,用于尋找輸入信號中一定模式的子序列,該模式可以是任意模式,包括重復模式、連續模式、間隔模式等等,通常的序列檢測方法有2種:有限狀態機法(FSM);移位暫存器法,

為什么需要設計序列檢測電路呢?

在數字集成電路中,序列檢測電路可以用于檢測輸入信號序列中是否存在特定的模式和序列,以及判斷實際輸出和理論輸出是否存在差異,序列檢測器是確保數字系統的正確運行不可或缺的一部分!

那么數字IC中哪些部分需要設計呢?

數字集成電路(Digital Integrated Circuit,簡稱DIC)中需要設計序列檢測電路的部分主要包括以下幾個方面:
資料輸入端:序列檢測電路可以用于檢測輸入資料是否符合特定的格式要求,或者是否存在錯誤或干擾,在數字集成電路中,輸入資料通常是通過輸入埠輸入的,因此需要在輸入埠處設計序列檢測電路,
控制信號:數字集成電路中的控制信號通常是用于控制數字系統的操作序列,以確保系統按照預期的順序執行操作,在這種情況下,序列檢測電路可以用于檢測控制信號是否按照預期的序列進行,
資料輸出端:序列檢測電路還可以用于檢測輸出資料是否符合特定的格式要求,或者是否存在錯誤或干擾,在數字集成電路中,輸出資料通常是通過輸出埠輸出的,因此需要在輸出埠處設計序列檢測電路,
內部信號:數字集成電路中的內部信號通常是在芯片內部傳遞的信號,例如時鐘信號、地址信號、資料信號等,在這種情況下,序列檢測電路可以用于檢測內部信號是否按照預期的序列進行,

在IC設計的程序中,不同的部分的序列檢測器檢測的序列和發揮的具體作用不盡心相同,因此在數字集成電路中,需要根據具體的應用場景,針對不同的部分設計相應的序列檢測電路,

二、狀態機法和暫存器法

對于序列檢測器的設計,常規的設計方法有兩種:狀態機法和移位暫存器法,

狀態機法最重要的是明白狀態機狀態的轉移程序:在資料輸入之后判斷是否匹配,若匹配則進入下一狀態,不匹配則根據輸入的資料具體判斷進入的下一狀態(也有可能保持在原來的狀態),狀態機設計程序一定要注重狀態的數量和狀態轉移以及狀態轉移條件,避免狀態的缺失以及狀態轉移的不合理回圈,

移位暫存器法法基本原理是資料的移位和移位資料的對比:首先將對應的初始資料快取在暫存器中作為一個陣列,資料輸入后置于于陣列的末尾,陣列其它元素左移,把最早輸入的資料移出,每輸入一個資料后重繪一次,然后將陣列和目標序列對比,如果陣列和目標序列相等,則說明出現目標序列,

2.1狀態機法

2.11 使用狀態機檢測“1001”

題目:設計一個序列檢測器,用來檢測序列1001,用_狀態機完成電路,可重復檢測_序列1001(即本文第三部分的重疊檢測),

第一步,分析狀態機狀態轉移,分析如下:

IDLE: 初始狀態,代表目前沒有接收到滿足要求的資料,
seq_in = 1時,等于1001中的第一個數,進入S1狀態;

seq_in = 0時,保持狀態,

S1:代表目前已經有了1個匹配的資料,

seq_in = 0時,當前序列為10,等于1001中的前兩個數,進入S2狀態;

seq_in = 1時,當前序列為11,不是1001的前兩個數,但1是1001的第一個數,所以保持S1狀態,

S2:代表目前已經有了2個匹配的資料,
seq_in = 0時,當前序列為100,等于1001中的前三個數,進入S3狀態;

seq_in = 1時,當前序列為101,不是1001的前三個數,但1是1001的第一個數,所以進入S1狀態,

S3:代表目前已經有了3個匹配的資料,
seq_in = 1時,當前序列為1001,與要求序列匹配,進入S4狀態;

seq_in = 0時,當前序列為1000,與要求序列不配,0與初始狀態匹配,所以進入IDLE狀態,

S4:最終狀態,代表目前已經得到了匹配的序列,輸出信號翻轉,
seq_in = 1時,當前序列為10011,1與要求序列的第一個數匹配,所以進入S1狀態;

seq_in = 0時,當前序列為10010,10與要求的前兩個數匹配,所以進入S2狀態,

第二步:根據流程轉換分析畫出狀態機的狀態轉移圖,如下圖所示:

image

第三步:根據狀態機轉移圖用經典三段式(或者二段式)寫出verilog代碼

2.12 verilog代碼

//使用狀態機設計檢測“1001”的序列檢測器
//可重疊檢測序列“1001”
module sequence_detect01(
     input  clk, 
     input  rst_n,
     input  seq_in, 
     output mismatch				//檢驗序列是否匹配,匹配輸出0,不匹配輸出0
     );

//采用獨熱碼編譯五個狀態,初始IDLE狀態為待機狀態
//獨熱碼相比二進制碼和格雷碼,方便電路設計判斷、狀態轉移,且邏輯更簡單        
parameter        IDLE = 5'b00001;
parameter        S1   = 5'b00010;
parameter 	     S2   = 5'b00100;
parameter        S3   = 5'b01000;
parameter        S4   = 5'b10000; 

//定義兩個暫存器表示狀態機的目前狀態和下一狀態
reg [4:0]		 curr_state;
reg [4:0] 		 next_state;

//第一段使用時序邏輯描述狀態轉移
always@(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
	    curr_state <= IDLE;
    end
    else begin
	    curr_state <= next_state;
    end
end

//第二段使用組合邏輯判斷狀態轉移條件
always@(*) begin
    if(!rst_n) begin
	    next_state <= IDLE;
    end
    else begin
	    case(curr_state)
	        IDLE  :next_state = seq_in?S1:IDLE;
	        S1	  :next_state = seq_in?S1:S2;
	        S2	  :next_state = seq_in?S1:S3;
	        S3	  :next_state = seq_in?S4:IDLE;
	        S4	  :next_state = seq_in?S1:S2;
	        default:next_state = IDLE;	//養成良好代碼風格,不能遺漏,防生成latch,也可以通過賦初值避免
	    endcase
    end
end

//第三段描述狀態輸出(可以使用組合邏輯,也可以用時序邏輯)
//此處采用組合邏輯,同時也提供時序邏輯代碼示例
assign mismatch = (curr_state ==S4) ? 1'b0 : 1'b1;		//組合邏輯描述輸出

/*
//時序邏輯描述輸出
always@(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
	     mismatch <= 1'b1;
    end
         else if(next_state == S4) begin
	     mismatch <= 1'b0;
    end
    else begin
	     mismatch <= 1'b1;
    end
end
*/
endmodule

2.13 testbench

`timescale 1ns/1ps		//仿真時間單位1ns 仿真時間精度1ps
module sequence_detect01_tb();

//信號申明
reg		 clk;
reg 	 rst_n;
reg 	 seq_in;
wire 	 mismatch; 

//生成復位信號
//為時鐘信號和復位信號賦初值
initial begin
    clk       = 0;
    rst_n     = 1;
    seq_in    = 1;
    #5  rst_n = 0;
    #10 rst_n = 1;
end

always #6  seq_in = $random;	//生成亂數作為信號輸入
always #5  clk = ~clk;			//生成時鐘信號

//模塊實體化(將申明的信號連接起來即可)
sequence_detect01 u_sequence_detect01
    (.clk        	 (clk),
     .rst_n			 (rst_n), 
     .seq_in		 (seq_in),
     .mismatch		 (mismatch)
    );

endmodule

2.14仿真結果

image
)

Testbench中采用亂數來驗證序列檢測器的準確性,當時間來到705ns,亂數連續輸出1001,mismatch在接收四位數字進行信號翻轉,

2.2移位暫存器法

2.21 使用移位暫存器法檢測1001

題目:設計一個序列檢測器,用來檢測序列 1001,用_移位暫存器_完成電路設計,

移位暫存器方法比較簡單,設定一個和序列等長的暫存器,在資料輸入后將輸入移入暫存器的最低位,并判斷暫存器中的值是否與序列相同,因為移位暫存器的作業原理,設計出來的序列檢測器可以重疊檢測序列,

2.22 verilog代碼

//使用移位暫存器設計檢測“1001”的序列檢測器
//可重疊檢測序列“1001”
module sequence_detect02(
    input    	clk,
    input    	rst_n,
    input    	seq_in,
    output reg	mismatch	//時序邏輯中需要定義為reg型
    );

reg [3:0]    	seq_in_r;	//定義一個暫存器快取資料

//使用時序邏輯完成復位和移位暫存器移位程序
always@(posedge clk or negedge rst_n) begin
    if (!rst_n) begin 
	    seq_in_r <= 4'b0;							//中間暫存器復位
    end
    else begin
	    seq_in_r <= {seq_in_r[2:0],seq_in};			//輸入資料置于陣列右端,移位暫存器左移位
    end
end

//使用時序邏輯完成復位與輸出	
always@(posedge clk or negedge rst_n) begin
    if (!rst_n) begin 
	    mismatch <= 1'b1;
    end
    else if (seq_in_r == 4'b1001) begin		//若檢測到1001則將mismatch置1,表明檢測到序列1001
	    mismatch <= 1'b0;
    end
    else begin	
	    mismatch <= 1'b1;					//養成良好代碼風格,不能遺漏,防生成latch,可通過賦初值避免
    end 
end

endmodule

2.23 testbench

`timescale 1ns/1ps		//仿真時間單位1ns 仿真時間精度1ps
module sequence_detect02_tb;

//信號申明
reg		clk;
reg 	rst_n;
reg		seq_in;
wire 	mismatch; 

//復位信號生成
//時鐘信號與復位信號賦初值
initial begin
    clk       = 0;
    rst_n     = 1;
    seq_in    = 1;
    #5  rst_n = 0;
    #10 rst_n = 1;
end

always #6  seq_in = $random;	//生成亂數作為信號輸入
always #5  clk = ~clk;			//生成時鐘信號

//模塊實體化(將申明的信號連接起來即可)
sequence_detect01 u_sequence_detect01
    (.clk        	 (clk),
     .rst_n		 	 (rst_n), 
     .seq_in		 (seq_in),
     .mismatch		 (mismatch)
    );

endmodule

2.24仿真結果

image

Testbench中采用亂數來驗證序列檢測器的準確性,當時間來到705ns,亂數連續輸出1001,mismatch在接收四位數字且在時鐘上升沿進行信號翻轉,

三、重疊檢測與非重疊檢測(檢測序列1001)

數字IC序列檢測中的重疊檢測和非重疊檢測是兩種不同的檢測方式,
重疊檢測是指在一個序列中,子序列之間會有部分重疊的情況,而重疊區域也需要進行檢測,并被判定為單獨的子序列,
非重疊檢測則是指在一個序列中,每個子序列之間沒有重疊部分,因此只需要檢測每個子序列本身是否滿足特定的條件即可,

3.1重疊檢測

3.11 重疊檢測方法

題目:設計一個序列檢測器,用來檢測序列 1001,用_狀態機完成電路,可重復檢測_序列1001

第一步,分析狀態機狀態轉移,分析如下:

IDLE: 初始狀態,代表目前沒有接收到滿足要求的資料,
seq_in = 1時,等于1001中的第一個數,進入S1狀態;

seq_in = 0時,保持狀態,

S1:代表目前已經有了1個匹配的資料,

seq_in = 0時,當前序列為10,等于1001中的前兩個數,進入S2狀態;

seq_in = 1時,當前序列為11,不是1001的前兩個數,但1是1001的第一個數,所以保持S1狀態,

S2:代表目前已經有了2個匹配的資料,
seq_in = 0時,當前序列為100,等于1001中的前三個數,進入S3狀態;

seq_in = 1時,當前序列為101,不是1001的前三個數,但1是1001的第一個數,所以進入S1狀態,

S3:代表目前已經有了3個匹配的資料,
seq_in = 1時,當前序列為1001,與要求序列匹配,進入S4狀態;

seq_in = 0時,當前序列為1000,與要求序列不配,0與初始狀態匹配,所以進入IDLE狀態,

S4:最終狀態,代表目前已經得到了匹配的序列,輸出信號翻轉,
seq_in = 1時,當前序列為10011,1與要求序列的第一個數匹配,所以進入S1狀態;

seq_in = 0時,當前序列為10010,10與要求的前兩個數匹配,所以進入S2狀態,

第二步:根據流程轉換分析畫出狀態機的狀態轉移圖,如下圖所示:

image

第三步:根據狀態機轉移圖用經典三段式(或者二段式)寫出verilog代碼

3.12verilog代碼

//使用狀態機設計檢測“1001”的序列檢測器
//可重疊檢測序列“1001”
module sequence_detect03(
    input			clk ,
    input			rst_n,
    input			seq_in,
    output reg 		mismatch		//檢驗序列是否匹配,匹配輸出0,不匹配輸出0
    );

//采用獨熱碼編譯五個狀態,初始IDLE狀態為待機狀態
//獨熱碼相比二進制碼和格雷碼,方便電路設計判斷、狀態轉移,且邏輯更簡單  
parameter		IDLE = 5'b00001;
parameter 	 	S1 	 = 5'b00010;
parameter  		S2 	 = 5'b00100;
parameter  		S3   = 5'b01000;
parameter  		S4   = 5'b10000;

//定義兩個暫存器表示狀態機的目前狀態和下一狀態
reg [4:0] curr_state;
reg [4:0] next_state;

//第一段使用時序邏輯描述狀態轉移
always@(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
	    curr_state <= IDLE;
    end
    else begin
	    curr_state <= next_state;
    end
end

//第二段使用組合邏輯判斷狀態轉移條件
always@(*) begin
    if(!rst_n) begin
	    next_state <= IDLE;
    end
    else begin
	    case(curr_state)
	        IDLE  :next_state = seq_in?S1:IDLE;
	        S1	  :next_state = seq_in?S1:S2;
	        S2	  :next_state = seq_in?S1:S3;
	        S3	  :next_state = seq_in?S4:IDLE;
	        S4	  :next_state = seq_in?S1:S2;
	        default:next_state = IDLE;		//養成良好代碼風格,不能遺漏,防生成latch,也可以通過賦初值避免
	endcase
    end
end

//第三段描述狀態輸出(可以使用組合邏輯,也可以用時序邏輯)
//此處采用時序邏輯,同時也提供組合邏輯代碼示例
always@(posedge clk or negedge rst_n) begin			//時序邏輯描述輸出
    if(!rst_n) begin
	    mismatch <= 1'b1;
    end
    else if(next_state == S4) begin
	    mismatch <= 1'b0;
    end
    else begin
	    mismatch <= 1'b1;
    end
end

//assign mismatch = (curr_state ==S4) ? 1'b0 : 1'b1;	//組合邏輯描述輸出

endmodule

3.13Testbench

`timescale 1ns/1ps		//仿真時間單位1ns 仿真時間精度1ps
module sequence_detect03_tb();

//信號申明
reg		clk;
reg		rst_n;
reg		seq_in;
wire	mismatch;

//復位信號生成
//輸入信號生成,輸入信號為“1001001001001”
//時鐘信號與復位信號賦初值
initial begin 
    clk = 0;
    rst_n = 1;
    #5  rst_n = 0;
    #10 rst_n = 1;
    seq_in = 1;#10;
    seq_in = 0;#10;
    seq_in = 0;#10;
    seq_in = 1;#10;
    seq_in = 0;#10;
    seq_in = 0;#10;
    seq_in = 1;#10;
    seq_in = 0;#10;
    seq_in = 0;#10;
    seq_in = 1;#10;
    seq_in = 0;#10;
    seq_in = 0;#10;
    seq_in = 1;#10;
end 

//時鐘信號生成
always #5 clk = ~clk;

//模塊實體化(將申明的信號連接起來即可)
sequence_detect03 u_sequence_detect03(
    .clk			(clk),
    .rst_n			(rst_n),
    .seq_in			(seq_in),
    .mismatch		(mismatch)
    );

endmodule

3.14仿真結果

image

輸入序列1001001001001,根據可重復檢測理論上可檢測四次信號翻轉,從仿真結果可以看到mismatch發生四次翻轉,且第二次翻轉的1001中的第一個1來自第一組1001中最后一個1,即發生重疊亦可檢測,

3.2非重疊檢測

3.21 非重疊檢測方法

題目:設計一個序列檢測器,用來檢測序列 1001,用狀態機完成電路,可重復檢測序列1001

第一步,分析狀態機狀態轉移,分析如下:

IDLE: 初始狀態,代表目前沒有接收到滿足要求的資料,
seq_in = 1時,等于1001中的第一個數,進入S1狀態;

seq_in = 0時,保持狀態,

S1:代表目前已經有了1個匹配的資料,

seq_in = 0時,當前序列為10,等于1001中的前兩個數,進入S2狀態;

seq_in = 1時,當前序列為11,不是1001的前兩個數,但1是1001的第一個數,所以保持S1狀態,

S2:代表目前已經有了2個匹配的資料,
seq_in = 0時,當前序列為100,等于1001中的前三個數,進入S3狀態;

seq_in = 1時,當前序列為101,不是1001的前三個數,但1是1001的第一個數,所以進入S1狀態,

S3:代表目前已經有了3個匹配的資料,
seq_in = 1時,當前序列為1001,與要求序列匹配,進入S4狀態;

seq_in = 0時,當前序列為1000,與要求序列不配,0與初始狀態匹配,所以進入IDLE狀態,

S4:最終狀態,代表目前已經得到了匹配的序列,輸出信號翻轉,
seq_in = 1時,當前序列為10011,1與要求序列的第一個數匹配,所以進入S1狀態;

seq_in = 0時,當前序列為10010,10與要求的前兩個數匹配,但是要求非重疊檢測,所以進入IDLE狀態,

第二步:根據流程轉換分析畫出狀態機的狀態轉移圖,如下圖所示

image

第三步:根據狀態機轉移圖用經典三段式(或者二段式)寫出verilog代碼

3.22verilog代碼

//使用狀態機設計檢測“1001”的序列檢測器
//非重疊檢測序列“1001”
module sequence_detect04(
    input			clk ,
    input			rst_n,
    input			seq_in,
    output reg 		mismatch		//檢驗序列是否匹配,匹配輸出0,不匹配輸出0
    );

//采用獨熱碼編譯五個狀態,初始IDLE狀態為待機狀態
//獨熱碼相比二進制碼和格雷碼,方便電路設計判斷、狀態轉移,且邏輯更簡單  
parameter 		IDLE = 5'b00001;
parameter  		S1   = 5'b00010;
parameter  		S2   = 5'b00100;
parameter  		S3   = 5'b01000;
parameter 		S4   = 5'b10000;

//定義兩個暫存器表示狀態機的目前狀態和下一狀態
reg [4:0] curr_state;
reg [4:0] next_state;

//第一段使用時序邏輯描述狀態轉移
always@(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
	    curr_state <= IDLE;
    end
    else begin
	    curr_state <= next_state;
    end
end

//第二段使用組合邏輯判斷狀態轉移條件
always@(*) begin
    if(!rst_n) begin
	    next_state <= IDLE;
    end
    else begin
	    case(curr_state)
	        IDLE  :next_state = seq_in?S1:IDLE;
	        S1	  :next_state = seq_in?S1:S2;
	        S2	  :next_state = seq_in?S1:S3;
	        S3	  :next_state = seq_in?S4:IDLE;
	        S4	  :next_state = seq_in?S1:IDLE;
	        default:next_state = IDLE;		//養成良好代碼風格,不能遺漏,防生成latch,也可以通過賦初值避免
	endcase
    end
end

//第三段描述狀態輸出(可以使用組合邏輯,也可以用時序邏輯)
//此處采用時序邏輯,同時也提供組合邏輯代碼示例
always@(posedge clk or negedge rst_n) begin			//時序邏輯描述輸出
    if(!rst_n) begin
	    mismatch <= 1'b1;
    end
    else if(next_state == S4) begin
	    mismatch <= 1'b0;
    end
    else begin
	    mismatch <= 1'b1;
    end
end

//assign mismatch = (curr_state ==S4) ? 1'b0 : 1'b1;	//組合邏輯描述輸出

endmodule

3.23Testbench

`timescale 1ns/1ps		//仿真時間單位1ns 仿真時間精度1ps
module sequence_detect04_tb();

//信號申明
reg		clk;
reg		rst_n;
reg		seq_in;
wire	mismatch;

//復位信號生成
//輸入信號生成,輸入信號為“1001001001001”
//時鐘信號與復位信號賦初值
initial begin 
    clk = 0;
    rst_n = 1;
    #5  rst_n = 0;
    #10 rst_n = 1;
    seq_in = 1;#10;
    seq_in = 0;#10;
    seq_in = 0;#10;
    seq_in = 1;#10;
    seq_in = 0;#10;
    seq_in = 0;#10;
    seq_in = 1;#10;
    seq_in = 0;#10;
    seq_in = 0;#10;
    seq_in = 1;#10;
    seq_in = 0;#10;
    seq_in = 0;#10;
    seq_in = 1;#10;
end 

//時鐘信號生成
always #5 clk = ~clk;

//模塊實體化(將申明的信號連接起來即可)
sequence_detect04 u_sequence_detect04(
    .clk			(clk),
    .rst_n			(rst_n),
    .seq_in			(seq_in),
    .mismatch		(mismatch)
    );

endmodule

3.24仿真結果

image

輸入序列1001001001001,根據可不重疊檢測理論上可檢測兩次信號翻轉,從仿真結果可以看到mismatch發生兩次翻轉,且第二組的1001中的第一個1來自第一組1001中最后一個1,即發生重疊不可檢測,所以相比于重疊檢測少了第二次翻轉(同理第四次翻轉同樣不可發生),

四、總結

狀態機法序列檢測器:一句話概括就是設計復雜、不易擴展但是檢測模式靈活,相比使用移位暫存器來說的話,狀態機稍稍復雜些,主要體現在不易擴展(重新檢測不同序列需重新設計狀態轉移)和狀態機的狀態轉移判斷上;但是這樣也給狀態機帶來了優點 ,就是靈活性好,可以靈活處理輸入和輸出,因為狀態機具有可編程性,同時可以處理較為復雜的序列檢測任務,因為狀態機可以支持多個狀態和轉換,
移位暫存器法:一句話概括就是設計簡單、易于擴展但是檢測模式呆板,相比于使用狀態機來說的話,只能處理簡單的序列檢測任務,因為它沒有狀態機的多狀態和轉換功能,且輸入和輸出的靈活性差,因為暫存器序列移位暫存器是固定的,檢測模式固定,但是優勢很明顯,就是設計和開發相對簡單,只需要幾個暫存器和邏輯門,且易于擴展,如果要檢測另一個序列,只需要修改輸入資料,
模式選擇:前言部分提到了檢測模式包括重疊模式、連續模式、間隔模式等等,本文著重分析重疊與非重疊檢測模式,結論是重疊檢測模式可以用狀態機和移位暫存器設計,非重疊檢測模式可以用靈活的狀態機設計;本文都是基于默認的連續檢測模式設計,如果采用間隔檢測模式,處理方法是添加指示信號使能端,可以用狀態機和移位暫存器設計,因為設計邏輯簡單,所以這部分省略,可自行參照第二部分代碼設計,

綜上所述,狀態機序列檢測器適用于處理較為復雜的序列檢測任務,而暫存器序列移位暫存器適用于處理簡單的序列檢測任務,在實際應用中,應根據具體的需求來選擇合適的序列檢測方法,

不定期檢查、補充、糾錯,歡迎隨時交流糾錯

最后修改日期:2023.4.22

軟體版本:

仿真軟體:Modelsim 10.6c

繪圖軟體:億圖圖示

描述語言:verilog

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/552480.html

標籤:Verilog

上一篇:AccessToken、for_user、get_token

下一篇:返回列表

標籤雲
其他(159041) Python(38137) JavaScript(25421) Java(18044) C(15226) 區塊鏈(8265) C#(7972) AI(7469) 爪哇(7425) MySQL(7186) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5871) 数组(5741) R(5409) Linux(5340) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4572) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2433) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1973) 功能(1967) Web開發(1951) HtmlCss(1936) python-3.x(1918) C++(1917) 弹簧靴(1913) xml(1889) PostgreSQL(1876) .NETCore(1860) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • 序列檢測器(兩種設計方法和四種檢測模式|verilog代碼|Testbench|

    數字IC經典電路設計 經典電路設計是數字IC設計里基礎中的基礎,蓋大房子的第一部是打造結實可靠的地基,每一篇筆者都會分門別類給出設計原理、設計方法、verilog代碼、Testbench、仿真波形。然而實際的數字IC設計程序中考慮的問題遠多于此,通過本系列希望大家對數字IC中一些經典電路的設計有初步 ......

    uj5u.com 2023-05-16 10:05:24 more
  • AccessToken、for_user、get_token

    在Django REST framework的SimpleJWT庫中,AccessToken是一個類,用于表示一個JSON Web Token (JWT)中的訪問令牌部分。訪問令牌是一種常見的身份驗證令牌,通常用于保護API端點。 通過SimpleJWT庫,您可以使用AccessToken類創建、解 ......

    uj5u.com 2023-05-16 09:59:47 more
  • TokenObtainPairSerialize和TokenObtainPairView

    TokenObtainPairSerializer和TokenObtainPairView是Django REST framework的SimpleJWT庫提供的兩個相關的類。 TokenObtainPairSerializer是一個用于序列化和驗證用戶憑證以生成JSON Web Token(JWT ......

    uj5u.com 2023-05-16 09:59:43 more
  • SICP:元回圈求值器(Python實作)

    元語言抽象就是建立新的語言。它在工程設計的所有分支中都扮演著重要的角色,在計算機程式設計領域更是特別重要。因為這個領域中,我們不僅可以設計新的語言,還可以通過構造求值器的方式實作這些語言。對某個程式設計語言的求值器(或者解釋器)也是一個程序,在應用于這個語言的一個運算式時,它能夠執行求值這個運算式所... ......

    uj5u.com 2023-05-16 09:59:34 more
  • < Python全景系列-2 > Python資料型別大盤點

    Python作為一門強大且靈活的編程語言,擁有豐富的資料型別系統。本文詳細介紹了Python中的每一種資料型別,包括數值、序列、映射、集合、布爾和None型別。每種資料型別的特性、使用方式,以及在實際問題中的應用都將被深入探討。此外,我們還將探討Python的動態型別特性,以及如何在實際編程中充分利... ......

    uj5u.com 2023-05-16 09:59:27 more
  • Pytest - 概述&入門

    Pytest - 概述&入門 簡介 Pytest是一款強大的python自動化測驗工具,可以勝任各種型別或者級別的軟體測驗作業; pytest提供了豐富的功能,包括assert重寫,第三方插件,以及其他測驗工具無法比擬的fixture模型; pytest是一個軟體測驗框架,是一款命令列工具,可以自動 ......

    uj5u.com 2023-05-16 09:59:20 more
  • Python工具箱系列(三十二)

    Elasticsearch是一個基于Lucene的搜索引擎。它提供了一個分布式多用戶能力的全文搜索引擎,基于RESTful 的API介面。Elasticsearch是用Java語言開發的,并作為Apache許可條款下的開放原始碼發布,是非常流行的企業級搜索引擎。 ......

    uj5u.com 2023-05-16 09:59:16 more
  • Python忽略NoData計算多張遙感影像的像元平均值:whitebox庫

    本文介紹基于Python中whitebox模塊,對大量長時間序列柵格遙感影像的每一個像元進行忽略NoData值的多時序平均值求取~ ......

    uj5u.com 2023-05-16 09:59:02 more
  • pycharm-professional-2023 下載安裝

    PyCharm Professional 是一款針對 Python 編程的集成開發環境 (IDE),由 JetBrains 公司開發和維護。它是 PyCharm 社區版的升級版,提供了更多的功能和工具,旨在提高 Python 開發人員的生產力和效率。 以下是 PyCharm Professional ......

    uj5u.com 2023-05-16 09:53:28 more
  • 訊息推送平臺有沒有保證資料不丟?

    我們在使用mq的時候,就會很自然思考一個問題:怎么保證資料不丟失? 現在austin接入層是把訊息發到mq,下發邏輯層從mq消費資料,隨后呼叫對應渠道介面來下發訊息。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.c ......

    uj5u.com 2023-05-16 09:51:00 more