資源描述:
《流水燈基于verilog語(yǔ)言實(shí)現(xiàn)及測(cè)試代碼》由會(huì)員上傳分享,免費(fèi)在線(xiàn)閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫(kù)。
1、流水燈實(shí)驗(yàn)的Testbench報(bào)告一、設(shè)計(jì)源碼(順序方法)moduleled(inputclk,inputrstn,outputreg[3:0]led);parameterT1s=4'd10;reg[3:0]cnt_1s;always@(posedgeclkornegedgerstn)if(!rstn)begincnt_1s<=0;endelseif(cnt_1s==T1s)begincnt_1s<=0;endelsebegincnt_1s<=cnt_1s+1'b1;endalways@(posedgeclkorne
2、gedgerstn)if(!rstn)beginled<=4'hf;endelseif(led==4'hf)beginled<=4'he;endelseif(cnt_1s==T1s)beginled<={led[2:0],1'b1};endendmodule二、測(cè)試代碼`timescale1ns/1nsmoduleled_tb();regclk;regrstn;wire[3:0]led;parameterCYCLE=20;parameterRST_TIME=3;ledu(.clk(clk),.rstn(rstn),.
3、led(led));initialbeginclk=0;forever#(CYCLE/2)clk=~clk;endinitialbeginrstn=1;#CYCLE;rstn=0;#(CYCLE*RST_TIME);rstn=1;endendmoduleTestbench設(shè)計(jì)的幾個(gè)步驟:1、設(shè)定時(shí)間標(biāo)尺、timescale;2、定義信號(hào)類(lèi)型,與輸入對(duì)接的reg,與輸出對(duì)接的wire;3、對(duì)待測(cè)設(shè)計(jì)的頂層模塊進(jìn)行例化,即將testbench與待測(cè)設(shè)計(jì)接口對(duì)接;4、給輸入接口產(chǎn)生激勵(lì)。一、結(jié)果分析老師的源代碼中設(shè)置的流水
4、燈跳轉(zhuǎn)周期是1S鐘,但是在仿真的過(guò)程中,1S實(shí)在是太漫長(zhǎng)了,所以我將跳轉(zhuǎn)周期改為10個(gè)時(shí)鐘周期了。根據(jù)testbench可知,第一個(gè)時(shí)間周期結(jié)束,拉低復(fù)位信號(hào)。復(fù)位信號(hào)產(chǎn)生低電平,always塊得到反應(yīng),led=4’hf(即1111);每次clk上升沿的時(shí)候always都會(huì)響應(yīng),但是rstn為低電平時(shí),計(jì)數(shù)的變量cnt_1s會(huì)一直清零,led一直處于全滅狀態(tài)。我在TESTBENCH中設(shè)置的rstn拉低持續(xù)3時(shí)鐘周期,3時(shí)鐘周期后,rstn會(huì)變成高電平,在下一個(gè)clk上升沿,always又開(kāi)始響應(yīng),根據(jù)設(shè)計(jì)當(dāng)led原狀
5、態(tài)為1111,觸發(fā)后會(huì)跳轉(zhuǎn)為1110,即第一個(gè)led亮。之后,按設(shè)計(jì)初衷應(yīng)該是每過(guò)10個(gè)時(shí)鐘周期,led產(chǎn)生一次流水式變化,但實(shí)際情況并非如此。我們可以看到上圖中黃線(xiàn)位置,led由0111經(jīng)過(guò)10個(gè)時(shí)鐘周期后變成1111,但是1111只持續(xù)了一個(gè)周期就變成了1110.原來(lái),在第二個(gè)always中有這么一句elseif(led==4'hf)beginled<=4'he;end雖然計(jì)時(shí)變量cnt_1s未滿(mǎn)足條件,但是led==1111,仍然會(huì)使led發(fā)生改變。而且led==1111時(shí),led是處于全滅狀態(tài),作為流水燈應(yīng)該
6、是不希望全滅狀態(tài)的出現(xiàn),第四個(gè)燈亮完,應(yīng)該馬上跳轉(zhuǎn)到第一個(gè)燈。即便如此在實(shí)物電路中,這并不會(huì)影響功能的實(shí)現(xiàn),因?yàn)槎喑龅倪@一個(gè)時(shí)鐘周期僅為20ns,人的肉眼根本無(wú)法識(shí)別。一、程序優(yōu)化試想如果這不是一個(gè)流水燈實(shí)驗(yàn),而是一個(gè)對(duì)精度有很高要求的電路,不允許出現(xiàn)這么一段全1的狀態(tài),那么程序該如何修改?其實(shí)led全為1的狀態(tài),主要是由于第二個(gè)always模塊產(chǎn)生,所以只用修改第二個(gè)always的內(nèi)容,下面是我修改后的代碼,和運(yùn)行結(jié)果。這段代碼主要的關(guān)鍵就在于阻塞賦值。修改后:運(yùn)行結(jié)果:對(duì)比運(yùn)行結(jié)果,我們很容易發(fā)現(xiàn),led沒(méi)有再出
7、現(xiàn)全1的狀態(tài),而是標(biāo)準(zhǔn)的按照10個(gè)時(shí)鐘周期跳轉(zhuǎn)一次,達(dá)到預(yù)期效果。