第一次verilog實驗——序列檢測器的實現


  第一次用verilog上機建模,深刻體會到看書所掌握不到的體會。有時候看書無法細心觀察到的東西,在敲實驗代碼的時候,或許能夠體現出來。現將第一次的體會記錄如下。

還是先將verilog代碼寫下

 1 /************************************************************************
 2 模塊作者:灰色的魚
 3 編寫時間:13:52 2013/2/13
 4 模塊功能:對串行輸入的數據流進行檢測。只要發現10010序列,就立即輸出高電平。
 5 *************************************************************************/
 6 module seqdet(x,z,clk,rst_n);
 7 input clk,rst_n;
 8 input x;
 9 output z;
10 
11 reg z;
12 reg [2:0] pstate,nstate;
13 
14 parameter s1=3'd0,
15           s2=3'd1,
16           s3=3'd2,
17           s4=3'd3,
18           s5=3'd4,
19           s6=3'd5;
20           
21 always @(posedge clk or negedge rst_n)
22 begin
23     if(!rst_n)
24         pstate<=s1;
25     else
26         pstate<=nstate;
27 end
28 
29 always @(pstate or x)
30 begin
31     case(pstate)
32         s1:
33             if(x==1)
34                 nstate=s2;
35             else
36                 nstate=s1;
37         s2:
38             nstate=x?s2:s3;
39         s3:
40             nstate=x?s2:s4;
41         s4:
42             nstate=x?s5:s1;
43         s5:
44             nstate=x?s2:s6;
45         s6:
46             nstate=x?s2:s4;
47         default:
48             nstate=s1;
49         endcase
50 end
51 
52 always @(pstate or x or rst_n)
53 begin
54     if(!rst_n==1)
55         z=1'b0;
56     else if(pstate==s5 && x==0)
57                 z=1'b1;
58          else
59             z=1'b0;
60 end
61 
62 endmodule

然后是testbench的代碼:

 1 `timescale 1 ns/ 1 ps
 2 module seqdet_vlg_tst();
 3 
 4 reg clk;
 5 reg rst_n;
 6 wire x;                                             
 7 wire z;
 8 
 9 reg[19:0] data;
10 
11 assign x=data[19];
12                           
13 seqdet i1 (
14   
15     .clk(clk),
16     .rst_n(rst_n),
17     .x(x),
18     .z(z)
19 );
20 
21 initial                                                
22 begin                                                  
23                         
24     clk=0;
25     rst_n=0;
26     #500 rst_n=1; 
27     data=20'b1100_1001_0000_1001_0100;                                                                                              
28     #(100*100) $stop;                     
29 end 
30                                                    
31 always                                                                                                                                        
32     #50 clk=~clk; 
33                                                                                                                                                    
34 always @(posedge clk)
35 begin
36     #2 data={data[18:0],data[19]};
37 end 
38                                                
39 endmodule

用Modelsim進行綜合前仿真,波形如下:(波形從上到下依次是clk,rst_n,x,z),x用於序列輸入,z為檢測到"10010"序列之后的輸出。

從第一次實驗中得到了幾點經驗,當然在以后的學習之中還需好好注意:

  1. 寫testbench時候,`timescale輸入問題,t前面的符號是鍵盤左上角‘1’左邊那個鍵。而3'd0中的符號是引號那個鍵。這在看書的時候,不細心發現,還不容易察覺。重點是作者也沒強調。
  2. 軟件問題。話了挺長時間弄軟件(指的是Modelsim),加上本身對自己寫的代碼不是特別自信,所以到了后來才發現軟件有問題。按照網絡上各種方法醫治,都無果。沒有辦法了,自豪使用免費版本的Modelsim(不過,學習的話真的夠用了)。
  3. Verilog的相關語法:

    A. 關於阻塞賦值與非阻塞賦值的用法區別。

    B. assign語句賦值號左邊只能是wire類型(只在wire與reg型之中做討論)。而always快語句中,被賦值的只能是reg類型。

  4.在Quartus II中進行中文注釋時,往往不能直接輸入。最好的方法是先在記事本里將注釋寫好,然后copy到Quartus II里去。

  5.對數字的寫法不要忘記是<位數>’<進制><數字>。


免責聲明!

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



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