第一次用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"序列之后的輸出。
從第一次實驗中得到了幾點經驗,當然在以后的學習之中還需好好注意:
- 寫testbench時候,`timescale輸入問題,t前面的符號是鍵盤左上角‘1’左邊那個鍵。而3'd0中的符號是引號那個鍵。這在看書的時候,不細心發現,還不容易察覺。重點是作者也沒強調。
- 軟件問題。話了挺長時間弄軟件(指的是Modelsim),加上本身對自己寫的代碼不是特別自信,所以到了后來才發現軟件有問題。按照網絡上各種方法醫治,都無果。沒有辦法了,自豪使用免費版本的Modelsim(不過,學習的話真的夠用了)。
- Verilog的相關語法:
A. 關於阻塞賦值與非阻塞賦值的用法區別。
B. assign語句賦值號左邊只能是wire類型(只在wire與reg型之中做討論)。而always快語句中,被賦值的只能是reg類型。
4.在Quartus II中進行中文注釋時,往往不能直接輸入。最好的方法是先在記事本里將注釋寫好,然后copy到Quartus II里去。
5.對數字的寫法不要忘記是<位數>’<進制><數字>。