校招Verilog——序列檢測機【轉】


一、序列檢測發生器

  以產生 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

 

參考資料:

https://blog.csdn.net/Reborn_Lee


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM