Verilog的序列信号检测器实现及其testbench仿真
終于邁向了testbench的學(xué)習(xí),第一個(gè)就拿簡(jiǎn)單的練練手,沒(méi)想這都遇到了好幾個(gè)問(wèn)題,在一番折騰下,終于把問(wèn)題調(diào)試完畢,趁熱乎過(guò)來(lái)寫下本人的第一篇博客。。序列信號(hào)檢測(cè)器對(duì)串行輸出進(jìn)行檢測(cè),如果檢測(cè)到連續(xù)的1001,則輸出1,否則輸出0。
程序采用兩段式狀態(tài)機(jī)寫法。兩段式狀態(tài)機(jī)即:用兩個(gè)always模塊來(lái)描述狀態(tài)機(jī),其中一個(gè)always模塊采用同步時(shí)序描述狀態(tài)轉(zhuǎn)移,另外一個(gè)模塊采用組合邏輯判斷狀態(tài)轉(zhuǎn)移條件,描述狀態(tài)轉(zhuǎn)移規(guī)律以及輸出。狀態(tài)機(jī)編碼方式采用獨(dú)熱碼方式,《Verilog數(shù)字系統(tǒng)設(shè)計(jì)與FPGA應(yīng)用》【趙倩、林麗萍】一書中說(shuō):“CPLD器件更多地提供組合邏輯資源,而FPGA器件更多的提供觸發(fā)器資源,所以對(duì)于CPLD的數(shù)字系統(tǒng)設(shè)計(jì)多使用格雷碼編碼,而基于FPGA的數(shù)字系統(tǒng)設(shè)計(jì)多使用獨(dú)熱碼編碼。”代碼如下:
Detected_1001.v
1 module Detected_1001(Data_in,Clock,Reset,Detected); 2 3 input Data_in,Clock,Reset; 4 output Detected; 5 reg Detected; 6 reg [4:0]state; 7 parameter s0=5'b10000, 8 s1=5'b01000, 9 s2=5'b00100, 10 s3=5'b00010, 11 s4=5'b00001; 12 always@(state) 13 begin 14 case(state) 15 s0: 16 Detected=1'b0; 17 s1: 18 Detected=1'b0; 19 s2: 20 Detected=1'b0; 21 s3: 22 Detected=1'b0; 23 s4: 24 Detected=1'b1; 25 26 default:Detected=1'b0; 27 endcase 28 end 29 /*assign Detected=(state==s4)?1:0;*/ 30 always@(posedge Clock or negedge Reset) 31 begin 32 if(!Reset) 33 begin 34 state<=s0; 35 end 36 else 37 case(state) 38 s0:if(Data_in==1'b0)state<=s0; 39 else state<=s1; 40 41 s1:if(Data_in==1'b0)state<=s2; 42 else state<=s0; 43 44 s2:if(Data_in==1'b0)state<=s3; 45 else state<=s0; 46 47 s3:if(Data_in==1'b0)state<=s0; 48 else state<=s4; 49 50 s4:if(Data_in==1'b0)state<=s0; 51 else state<=s1; 52 53 default:state<=s0; 54 endcase 55 end 56 endmodule
View Code
Detected_1001_tb.v
1 `timescale 1ns/1ps 2 module Detected_1001_tb; 3 reg Clock,Reset,Data_in; 4 wire Detected; 5 reg [4:0] i; 6 parameter sequence=18'b001_00100100_1101001; 7 8 Detected_1001 U( 9 .Clock(Clock), 10 .Reset(Reset), 11 .Data_in(Data_in), 12 .Detected(Detected) 13 ); 14 15 initial 16 begin 17 i=0;Data_in=0; 18 Reset=0;Clock=0; #4 Reset=1;#4 Clock=0; 19 forever #2 Clock=~Clock; 20 end 21 22 always@(posedge Clock or negedge Reset) 23 begin 24 if(~Reset) 25 begin 26 i<=5'b0; 27 end 28 else if(i<=5'd17) 29 begin 30 Data_in<=sequence[i]; 31 i<=i+5'd1; 32 end 33 else 34 i<=5'b0; 35 end 36 37 endmodule 38 39
View Code
仿真波形:
過(guò)程中遇到的問(wèn)題及解決方法:
1、輸出Detected始終為0。
解決方法及出現(xiàn)原因:在Detected_1001.v中對(duì)時(shí)鐘沿的檢測(cè)處,改錯(cuò)之前是always@(Clock),指生成組合邏輯電路,改正為always@(posedge Clock)后錯(cuò)誤消除,指觸發(fā)器的狀態(tài)僅在時(shí)鐘上升沿或下降沿發(fā)生跳變的同步時(shí)序邏輯電路。
2、輸出Detected初始狀態(tài)不定。
解決方法及出現(xiàn)原因:在Detected_1001.v中對(duì)時(shí)鐘沿的檢測(cè)處,改錯(cuò)之前是always@(posedge Clock),改錯(cuò)后為always@(posedge Clock or negedge Reset),在Reset里把初始狀態(tài)設(shè)置為s0,而一開(kāi)始在測(cè)試文件里Clock是保持0值的,因此此條always語(yǔ)句未動(dòng)作,所以Detected出現(xiàn)不定狀態(tài)。
3、高電平出現(xiàn)時(shí)刻分析:
以時(shí)間點(diǎn)的概念來(lái)理解。在T4時(shí)刻,狀態(tài)機(jī)模塊檢測(cè)到的輸入是T4時(shí)刻以前的值,即Data_in=0,故在T4的將來(lái)時(shí)刻,state決定跳轉(zhuǎn)到狀態(tài)s3,也即Detected=0。同樣的道理,在T5時(shí)刻,狀態(tài)機(jī)模塊檢測(cè)到的輸入是T5時(shí)刻以前的值,即Data_in=1,故在T5的將來(lái)時(shí)刻,state決定跳轉(zhuǎn)到狀態(tài)s4,也即Detected=1。
(詳細(xì)說(shuō)來(lái):該實(shí)驗(yàn)當(dāng)中,TB作為激勵(lì)給.v文件Data_in輸入。當(dāng)上升沿來(lái)臨時(shí),TB賦值給Data_in,同一時(shí)刻的上升沿狀態(tài)機(jī)對(duì)Data_in的值進(jìn)行判斷,但是判斷的是此時(shí)刻以前的值。這就是為什么檢測(cè)輸出要比Data_in的賦值完成慢一拍的原因。)
總結(jié)
以上是生活随笔為你收集整理的Verilog的序列信号检测器实现及其testbench仿真的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: mysql简单分表_mysql分区分表哪
- 下一篇: 双曲函数与反双曲函数