一、序列檢測發生器
以產生 11010 的序列為例,設計代碼如下:
1 module seq_gen( 2 input clk , 3 input reset , 4 output out 5 ); 6 7 reg [4:0] shift ; 8 9 always@(posedge clk or posedge rst_n) begin 10 if(reset) 11 shift <= 5'b11010; 12 else 13 shift <= {shift[3:0], shift[4]}; 14 end 15 16 assign out = shift[4]; 17 18 endmodule
仿真結果如下:
RTL視圖如下:
用了 5 位的移位寄存器,需要 5 個觸發器來實現。
二、序列檢測機——Moore型
檢測序列1101,檢測到輸出為1,否則輸出為0。
1、Moore型
(1)無重疊檢測的狀態轉移圖
無重疊檢測,即如果出現 1101101,只會檢測到一個1101。
(2)Verilog代碼
1 `timescale 1ns / 1ps 2 3 module seq_moore 4 //========================< 端口 >========================================== 5 ( 6 input clk , 7 input reset , 8 input din , 9 output dout 10 ); 11 //========================< 信號 >========================================== 12 localparam [4:0] s0 = 5'b00001 , 13 s1 = 5'b00010 , 14 s2 = 5'b00100 , 15 s3 = 5'b01000 , 16 s4 = 5'b10000 ; 17 reg [4:0] state_c ; 18 reg [4:0] state_n ; 19 //========================================================================== 20 //== 狀態機 21 //========================================================================== 22 always @(posedge clk, posedge reset) begin 23 if(reset) 24 state_c <= s0; 25 else 26 state_c <= state_n; 27 end 28 29 always @(*) begin 30 case(state_c) 31 s0: 32 if(din == 1'b1) 33 state_n = s1; 34 else 35 state_n = s0; 36 s1: 37 if(din == 1'b1) 38 state_n = s2; 39 else 40 state_n = s0; 41 s2: 42 if(din == 1'b0) 43 state_n = s3; 44 else 45 state_n = s2; 46 s3: 47 if(din == 1'b1) 48 state_n = s4; 49 else 50 state_n = s0; 51 s4: 52 if(din == 1'b1) 53 state_n = s1; 54 else 55 state_n = s0; 56 default: 57 state_n = s0; 58 endcase 59 end 60 //========================================================================== 61 //== 結果輸出 62 //========================================================================== 63 assign dout = (state_c == s4) ? 1'b1 : 1'b0; 64 65 66 endmodule
(3)有重疊檢測
無重疊檢測,即如果出現 1101101,會檢測到兩個1101。只需要將無重疊檢測的狀態轉移圖里的 S4 狀態轉移到 S2 狀態即可,代碼也是。
2、mealy型
(1)無重疊檢測的狀態轉移圖
無重疊檢測,即如果出現 1101101,只會檢測到一個1101。
(2)Verilog代碼
1 `timescale 1ns / 1ps 2 3 module seq_mealy 4 //========================< 端口 >========================================== 5 ( 6 input clk , 7 input reset , 8 input din , 9 output dout 10 ); 11 //========================< 信號 >========================================== 12 localparam [3:0] s0 = 4'b0001 , 13 s1 = 4'b0010 , 14 s2 = 4'b0100 , 15 s3 = 4'b1000 ; 16 reg [3:0] state_c ; 17 reg [3:0] state_n ; 18 //========================================================================== 19 //== 狀態機 20 //========================================================================== 21 always @(posedge clk, posedge reset) begin 22 if(reset) 23 state_c <= s0; 24 else 25 state_c <= state_n; 26 end 27 28 always @(*) begin 29 case(state_c) 30 s0: 31 if(din == 1'b1) 32 state_n = s1; 33 else 34 state_n = s0; 35 s1: 36 if(din == 1'b1) 37 state_n = s2; 38 else 39 state_n = s0; 40 s2: 41 if(din == 1'b0) 42 state_n = s3; 43 else 44 state_n = s2; 45 s3: 46 state_n = s0; 47 default: 48 state_n = s0; 49 endcase 50 end 51 //========================================================================== 52 //== 結果輸出 53 //========================================================================== 54 assign dout = ((state_c==s3) && (din==1'b1)) ? 1'b1 : 1'b0; 55 56 57 endmodule
(3)有重疊檢測
即如果出現 1101101,會檢測到兩個1101。只需要將無重疊檢測的狀態轉移圖里的 S3 狀態轉移到 S2 狀態即可,代碼也是。
三、例題1
有“101”序列輸入時,輸出為 1,其他輸入情況下,輸出為 0.畫出狀態轉移圖,並用 verilog 描述。

1 `timescale 1ns / 1ps 2 3 module seq_detect 4 //========================< 端口 >========================================== 5 ( 6 input clk , 7 input reset , 8 input din , 9 output dout 10 ); 11 //========================< 信號 >========================================== 12 localparam [3:0] s0 = 4'b0001 , 13 s1 = 4'b0010 , 14 s2 = 4'b0100 , 15 s3 = 4'b1000 ; 16 reg [3:0] state_c ; 17 reg [3:0] state_n ; 18 //========================================================================== 19 //== 狀態機 20 //========================================================================== 21 always @(posedge clk, posedge reset) begin 22 if(reset) 23 state_c <= s0; 24 else 25 state_c <= state_n; 26 end 27 28 always @(*) begin 29 case(state_c) 30 s0: 31 if(din == 1'b1) 32 state_n = s1; 33 else 34 state_n = s0; 35 s1: 36 if(din == 1'b0) 37 state_n = s2; 38 else 39 state_n = s1; 40 s2: 41 if(din == 1'b1) 42 state_n = s3; 43 else 44 state_n = s0; 45 s3: 46 if(din == 1'b1) 47 state_n = s1; 48 else 49 state_n = s2; 50 default: 51 state_n = s0; 52 endcase 53 end 54 //========================================================================== 55 //== 結果輸出 56 //========================================================================== 57 assign dout = (state_c==s3) ? 1'b1 : 1'b0; 58 59 60 endmodule
四、例題2
輸入口是1bit,每次進來一位數據,檢查當前序列是否能整除3,能則輸出1,否則輸出0。
答案參考博客:https://www.cnblogs.com/lyc-seu/p/12768321.html
參考資料: