Verilog語(yǔ)法基礎(chǔ)講解之參數(shù)化設(shè)計(jì)_第1頁(yè)
Verilog語(yǔ)法基礎(chǔ)講解之參數(shù)化設(shè)計(jì)_第2頁(yè)
Verilog語(yǔ)法基礎(chǔ)講解之參數(shù)化設(shè)計(jì)_第3頁(yè)
Verilog語(yǔ)法基礎(chǔ)講解之參數(shù)化設(shè)計(jì)_第4頁(yè)
Verilog語(yǔ)法基礎(chǔ)講解之參數(shù)化設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩3頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、小梅哥FPGA設(shè)計(jì)思想與驗(yàn)證方法系列視頻教程Verilog語(yǔ)法基礎(chǔ)講解之參數(shù)化設(shè)計(jì)在Verilog語(yǔ)法中,可以實(shí)現(xiàn)參數(shù)化設(shè)計(jì)。所謂參數(shù)化設(shè)計(jì),就是在一個(gè)功能模塊中,對(duì)于一個(gè)常量,其值在不同的應(yīng)用場(chǎng)合需要設(shè)置為不同的置,則將此值在設(shè)計(jì)時(shí)使用parameter 關(guān)鍵字聲明,那么在上層模塊例化使用該功能模塊時(shí),可以根據(jù)具體需求重新配置該常量的值,從而實(shí)現(xiàn)不同應(yīng)用場(chǎng)合對(duì)對(duì)應(yīng)常量的靈活調(diào)整。以下為使用Verilog設(shè)計(jì)的一個(gè)控制LED閃爍燈的模塊代碼:01module counter(Clk,Rst_n,led);0203input Clk;/系統(tǒng)時(shí)鐘,50M04input Rst_n;/全局復(fù)位,低電

2、平復(fù)位0506output reg led;/led輸出0708reg 24:0cnt;/定義計(jì)數(shù)器寄存器0910/計(jì)數(shù)器計(jì)數(shù)進(jìn)程11always(posedge Clk or negedge Rst_n)12if(Rst_n = 1'b0)13cnt <= 25'd0;14else if(cnt = 25'd24_999_999)15cnt <= 25'd0;16else17cnt <= cnt + 1'b1;1819/led輸出控制進(jìn)程20always(posedge Clk or negedge Rst_n)21if(Rst_n

3、= 1'b0)22led <= 1'b1;23else if(cnt = 25'd24_999_999)24led <= led;25else26led <= led;2728endmodule在此設(shè)計(jì)中,定義了一個(gè)名為cnt的計(jì)數(shù)器,該cnt在輸入時(shí)鐘”Clk”的驅(qū)動(dòng)下,每個(gè)時(shí)鐘的上升沿執(zhí)行一次自加操作,當(dāng)計(jì)數(shù)到達(dá)24999999后,計(jì)數(shù)器清零,同時(shí)led驅(qū)動(dòng)狀態(tài)發(fā)生翻轉(zhuǎn)。由于系統(tǒng)時(shí)鐘為50M,即周期為20ns,cnt每計(jì)數(shù)25000000次,即500ms,驅(qū)動(dòng)led狀態(tài)翻轉(zhuǎn)一次,從而可以實(shí)現(xiàn)控制led以1s為周期進(jìn)行亮滅閃爍。在這個(gè)系統(tǒng)中,我們可以

4、看到,如果我們希望將閃爍速度進(jìn)行更改,例如改為每50ms讓led翻轉(zhuǎn)一次,則需要在代碼中將”cnt = 25'd24_999_999”中25'd24_999_999這個(gè)常量修改為25'd24_999_99。現(xiàn)在考慮另外一種情況,假如某個(gè)系統(tǒng)中有三個(gè)LED燈需要通過(guò)這種方式來(lái)進(jìn)行驅(qū)動(dòng)閃爍,每個(gè)LED燈的閃爍頻率還不一樣?,F(xiàn)假設(shè)LED1閃爍頻率為1s,LED2為0.1s,LED3為0.01秒。那么這三個(gè)LED驅(qū)動(dòng)模塊中,”25'd24_999_999”這個(gè)常量就需要分別修改為L(zhǎng)ED1:”25'd24_999_999”LED2:”25'd24_999_

5、99” LED3:”25'd24_999_9”因此,必須獨(dú)立的設(shè)計(jì)三個(gè)這樣的模塊,然后在上層模塊中分別例化這三個(gè)模塊,以實(shí)現(xiàn)需求的功能。獨(dú)立設(shè)計(jì)這樣三個(gè)模塊并分別例化,確實(shí)能夠完全實(shí)現(xiàn)上述假設(shè)系統(tǒng)需求的功能,但是通過(guò)這種方式設(shè)計(jì)出來(lái)的模塊,不具備通用性,如果要求發(fā)生變化,則還需要回到底層模塊中去修改對(duì)應(yīng)的常量,而底層模塊中可能不止一個(gè)地方使用到了這個(gè)常量,例如上述代碼中,第14行和第23行就分別用到了這個(gè)常量。如果模塊中對(duì)此常量的使用次數(shù)較多,在修改的過(guò)程即增加了工作量,又極容易發(fā)生遺漏,從而導(dǎo)致錯(cuò)誤。而參數(shù)化設(shè)計(jì)的使用,則可以非常完美的解決這一問(wèn)題。這里首先放上該設(shè)計(jì)使用參數(shù)化設(shè)計(jì)之

6、后的該模塊代碼:01module counter(Clk,Rst_n,led);0203input Clk;/系統(tǒng)時(shí)鐘04input Rst_n;/全局復(fù)位,低電平復(fù)位0506output reg led;/led輸出0708reg 24:0cnt;/定義計(jì)數(shù)器寄存器0910parameter CNT_MAX = 25'd24_999_999;1112/計(jì)數(shù)器計(jì)數(shù)進(jìn)程13always(posedge Clk or negedge Rst_n)14if(Rst_n = 1'b0)15cnt <= 25'd0;16else if(cnt = CNT_MAX)17cnt

7、 <= 25'd0;18else19cnt <= cnt + 1'b1;2021/led輸出控制進(jìn)程22always(posedge Clk or negedge Rst_n)23if(Rst_n = 1'b0)24led <= 1'b1;25else if(cnt = CNT_MAX)26led <= led;27else28led <= led;2930endmodule這里,我們使用parameter在第16行聲明了一個(gè)參數(shù)化常量”CNT_MAX”,在第16行和第25行進(jìn)行條件判斷時(shí),直接判斷cnt的值是否與該參數(shù)值相等,而不

8、再是直接寫(xiě)具體數(shù)字的方式。到這里大家就可以看到,通過(guò)這樣一種方式,首先就能避免一個(gè)模塊中多次使用該常量而對(duì)修改設(shè)計(jì)帶來(lái)的隱患。因?yàn)楫?dāng)我們需要修改該常量的值以適應(yīng)不同的應(yīng)用要求時(shí),直接修改這個(gè)parameter的值即可,從而可以避免因?yàn)樵搮?shù)使用的地方過(guò)多而在修改時(shí)容易出現(xiàn)的遺漏的問(wèn)題。另外,在我們的系統(tǒng)中,假如也需要三個(gè)這樣的模塊來(lái)對(duì)應(yīng)驅(qū)動(dòng)三個(gè)LED,大家可能首先想到的就是將該代碼復(fù)制得到三個(gè)文件,并將其中的parameter值修改為對(duì)應(yīng)需要的值即可。此種方式雖然能夠避免一個(gè)常量在模塊中被多次使用,修改時(shí)容易發(fā)生的遺漏問(wèn)題,但仍然還是需要存在三個(gè)獨(dú)立的子模塊,并未大大減輕設(shè)計(jì)工作量。其實(shí),修改

9、parameter有更加快捷的方式,這種方式不需要我們針對(duì)每一個(gè)需求分別復(fù)制設(shè)計(jì)代碼并修改對(duì)應(yīng)參數(shù),只需要在上層模塊例化該模塊時(shí),直接在例化的過(guò)程中修改該值即可。具體實(shí)現(xiàn)方法,這里以實(shí)例代碼的形式進(jìn)行講解。在上層模塊中,例化子模塊時(shí)直接修改其參數(shù)有兩種語(yǔ)法結(jié)構(gòu),這里我們首先看第一種:01module LED_flicker(02Clk,03Rst_n,04LED05);0607input Clk;08input Rst_n;09output 1:0LED;1011countercounter0(12.Clk(Clk),13.Rst_n(Rst_n),14.led(LED0)15);1617co

10、untercounter1(18.Clk(Clk),19.Rst_n(Rst_n),20.led(LED1)21);2223defparam counter0.CNT_MAX = 24_999_99;24defparam counter1.CNT_MAX = 24_999_9;2526endmodule這里,在頂層模塊中例化了兩個(gè)counter模塊,并分別取名為counter0和counter1。counter0的LED輸出驅(qū)動(dòng)LED0,counter1的LED輸出驅(qū)動(dòng)LED1,為了實(shí)現(xiàn)LED0以0.1秒的頻率閃爍,LED1以0.01秒的頻率閃爍,在第23行和24行分別使用”defparam”

11、來(lái)重新定義CNT_MAX的值。這里以第23行修改counter0中的CNT_MAX的值來(lái)具體講解此種語(yǔ)法的結(jié)構(gòu)。首先,使用關(guān)鍵字”defparam”來(lái)聲明這里需要對(duì)某個(gè)參數(shù)的值進(jìn)行重新定義,空格之后緊跟著的counter0為counter模塊被例化的名字,counter0后緊隨一個(gè)”.”,”.”后緊隨著的就是counter模塊中需要修改的參數(shù)的名字,然后使用”=”將新的值賦給改參數(shù)即可。這里使用模塊名+”.”+參數(shù)名的方式,與C語(yǔ)言結(jié)構(gòu)體中使用結(jié)構(gòu)體成員的形式很類(lèi)似,大家可以對(duì)比學(xué)習(xí)。通過(guò)這種方式,大家可以在不修改原有設(shè)計(jì)文件的情況下,例化后,在上層模塊直接修改參數(shù)。雖然模塊中設(shè)定了有默認(rèn)值,

12、但是使用defparam修改的值比原始設(shè)計(jì)文件中的值擁有更高的編譯優(yōu)先級(jí)。當(dāng)使用defparam修改了原始文件中的參數(shù)值后,原始文件中的默認(rèn)參數(shù)值即被忽略。當(dāng)我們?cè)O(shè)計(jì)完成后,就需要對(duì)設(shè)計(jì)的模塊進(jìn)行仿真,由于仿真執(zhí)行所需花費(fèi)的時(shí)間遠(yuǎn)遠(yuǎn)大于板級(jí)系統(tǒng)執(zhí)行功能時(shí)需要的時(shí)間,因此仿真時(shí),我們希望對(duì)設(shè)計(jì)模塊中某些耗時(shí)比較長(zhǎng)的設(shè)計(jì)在不影響理論正確性的前提下進(jìn)行簡(jiǎn)單的修改,例如,上述counter模塊中,實(shí)際仿真如果也按照24999999的計(jì)數(shù)值進(jìn)行計(jì)數(shù),則需要花費(fèi)太多的仿真時(shí)間,嚴(yán)重影響設(shè)計(jì)效率,因此也可以在仿真時(shí)直接在testbench中使用defparam來(lái)對(duì)設(shè)計(jì)文件中的參數(shù)進(jìn)行修改,從而降低仿真復(fù)雜度

13、。上述LED_flicker系統(tǒng)的testbench代碼如下所示:01timescale 1ns/1ps02define clk_period 200304module LED_flicker_tb;0506/source define07reg Clk;08reg Rst_n;0910/probe define11wire 1:0LED;1213/instant user module14LED_flicker LED_flicker0(15.Clk(Clk),16.Rst_n(Rst_n),17.LED(LED)18);1920defparam LED_flicker0.counter0.

14、CNT_MAX = 24;21defparam LED_flicker0.counter1.CNT_MAX = 24;2223/generater clock24initial Clk = 1;25always #(clk_period/2)Clk = Clk;2627initial begin28Rst_n = 1'b0;29#(clk_period * 20 + 1);30Rst_n = 1'b1;31#(clk_period * 2000);32$stop;33end3435endmodule第20行和第21行,使用defparam對(duì)設(shè)計(jì)模塊中的CNT_MAX進(jìn)行了重新定

15、義,我們希望通過(guò)這種方式,來(lái)在仿真的時(shí)候,讓計(jì)數(shù)值非常小,這樣仿真便能很快的得出結(jié)果,通過(guò)這兩句話(huà)大家也可以看到,結(jié)構(gòu)體的形式能夠?qū)崿F(xiàn)多級(jí)調(diào)用。然而,當(dāng)使用此testbench文件直接仿真LED_flicker模塊時(shí),卻并不能實(shí)現(xiàn)預(yù)期的效果。在modelsim中仿真時(shí),報(bào)告如下信息:雖然并不影響仿真的執(zhí)行,然而從仿真執(zhí)行的結(jié)果來(lái)看,這種在testbench中再次修改設(shè)計(jì)模塊中參數(shù)的方式無(wú)法與實(shí)體模塊中例化子模塊后進(jìn)行參數(shù)定義同時(shí)存在,將實(shí)體模塊中使用defparam修改參數(shù)的部分屏蔽,則仿真文件中的defparam生效,實(shí)現(xiàn)了預(yù)期效果。下圖分別為不屏蔽LED_flicker中defparam內(nèi)

16、容和屏蔽LED_flicker中defparam內(nèi)容后的仿真結(jié)果,從圖中可知,不屏蔽,LED0和LED1的翻轉(zhuǎn)頻率分別為100ms和10ms,結(jié)果與LED_flicker中defparam定義的值一致,屏蔽掉后,LED0和LED1的翻轉(zhuǎn)頻率都是0.001ms,仿真結(jié)果與testench文件LED_flicker_tb中defparam定義的值一致。不屏蔽LED_flicker中defparam內(nèi)容時(shí)仿真結(jié)果屏蔽LED_flicker中defparam內(nèi)容時(shí)仿真結(jié)果在實(shí)際使用中,我們往往希望實(shí)體設(shè)計(jì)模塊中能夠設(shè)定某參數(shù)值為符合實(shí)際板級(jí)運(yùn)行要求的值,而在仿真中,為了節(jié)約仿真時(shí)間,我們又希望修改該參

17、數(shù)值以配合仿真通過(guò)上面的例子我們發(fā)現(xiàn),使用defparam語(yǔ)句難以同時(shí)滿(mǎn)足實(shí)體設(shè)計(jì)和仿真的需求。那么有沒(méi)有更好的方法來(lái)實(shí)現(xiàn)實(shí)體設(shè)計(jì)與仿真驗(yàn)證中對(duì)參數(shù)的修改能夠共存且互不干擾呢?為了實(shí)現(xiàn)此功能,我們調(diào)整在實(shí)體模塊中例化子模塊時(shí)對(duì)參數(shù)的修改方式,上面我們介紹的是使用defparam語(yǔ)句重新定義子模塊參數(shù)內(nèi)容。接下來(lái)我們使用在模塊例化時(shí),直接對(duì)參數(shù)進(jìn)行例化的方式來(lái)修改子模塊中的參數(shù)值。使用參數(shù)例化方式修改參數(shù)值的LED閃爍燈模塊代碼如下所示:01module LED_flicker_inst(02Clk,03Rst_n,04LED05);0607input Clk;08input Rst_n;09o

18、utput 1:0LED;1011counter12#(13.CNT_MAX(24_999_99)14)15counter0(16.Clk(Clk),17.Rst_n(Rst_n),18.led(LED0)19);2021counter22#(23.CNT_MAX(24_999_9)24)25counter1(26.Clk(Clk),27.Rst_n(Rst_n),28.led(LED1)29);3031endmodule這里,第11行到19行為例化counter0模塊的代碼。這里對(duì)于子模塊中的參數(shù),使用了和端口相類(lèi)似的形式進(jìn)行修改。通過(guò)這種方式,在例化每個(gè)功能模塊的時(shí)候,直接將所需修改參數(shù)的

19、值也同時(shí)通過(guò)例化的方式修改了。下面對(duì)這種例化方式的代碼結(jié)構(gòu)進(jìn)行簡(jiǎn)單介紹:首先,第11行為原始設(shè)計(jì)模塊的名字,第12行和14行為一對(duì)小括號(hào),對(duì)參數(shù)例化的內(nèi)容就在此括號(hào)中進(jìn)行。注意11號(hào),即括號(hào)前面需要使用”#”符號(hào)來(lái)聲明這是對(duì)參數(shù)進(jìn)行例化。括號(hào)內(nèi),參數(shù)例化形式與端口例化形式一致,使用”.”+原始參數(shù)名+新值的方式來(lái)修改新的值。通過(guò)這種方式,能夠避開(kāi)對(duì)于同一個(gè)參數(shù)多次使用defparam來(lái)重定義值而引發(fā)的沖突。使用上述testench文件仿真LED_flicker_inst模塊的仿真結(jié)果如下圖所示:使用defparam重新修改CNT_MAX值的仿真結(jié)果可以看到,LED0和LED1的翻轉(zhuǎn)頻率都是0.0

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論