Verilog HDL程序基本結(jié)構(gòu)與程序入門
Verilog HDL程序基本結(jié)構(gòu)
?Verilog HDL是一種用于數(shù)字邏輯電路設(shè)計(jì)的語言。用Verilog HDL描述的電路設(shè)計(jì)就是該電路的Verilog HDL模型。Verilog HDL既是一種行為描述的語言,也是一種結(jié)構(gòu)描述的語言。也就是說,既可以用電路的功能描述,也可以用元器件和它們之間的連接來建立所設(shè)計(jì)電路的Verilog HDL模型。Verilog模型可以是實(shí)際電路的不同級別的抽象。這些抽象的級別和它們對應(yīng)的模型類型共有以下5種。
·? 系統(tǒng)級(system):用高級語言結(jié)構(gòu)實(shí)現(xiàn)設(shè)計(jì)模塊的外部性能的模型。
·? 算法級(algorithm):用高級語言結(jié)構(gòu)實(shí)現(xiàn)設(shè)計(jì)算法的模型。
·? RTL級(Register Transfer Level):描述數(shù)據(jù)在寄存器之間流動和如何處理這些數(shù)據(jù)的模型。
·? 門級(gate-level):描述邏輯門以及邏輯門之間的連接的模型。
·? 開關(guān)級(switch-level):描述器件中三極管和儲存節(jié)點(diǎn)以及它們之間連接的模型。
一個(gè)復(fù)雜電路系統(tǒng)的完整Verilog HDL模型是由若干個(gè)Verilog HDL模塊構(gòu)成的,每一個(gè)模塊又可以由若干個(gè)子模塊構(gòu)成。其中有些模塊需要綜合成具體電路,而有些模塊只是與用戶所設(shè)計(jì)的模塊交互的現(xiàn)存電路或激勵信號源。利用Verilog HDL語言結(jié)構(gòu)所提供的這種功能就可以構(gòu)造一個(gè)模塊間的清晰層次結(jié)構(gòu)來描述極其復(fù)雜的大型設(shè)計(jì),并對所作設(shè)計(jì)的邏輯電路進(jìn)行嚴(yán)格的驗(yàn)證。
Verilog HDL行為描述語言作為一種結(jié)構(gòu)化和過程性的語言,其語法結(jié)構(gòu)非常適合于算法級和RTL級的模型設(shè)計(jì)。這種行為描述語言具有以下功能。
·? 可描述順序執(zhí)行或并行執(zhí)行的程序結(jié)構(gòu)。
·? 用延遲表達(dá)式或事件表達(dá)式來明確地控制過程的啟動時(shí)間。
·? 通過命名的事件來觸發(fā)其他過程里的激活行為或停止行為。
·? 提供了條件、if-else、case、循環(huán)程序結(jié)構(gòu)。
·? 提供了可帶參數(shù)且非零延續(xù)時(shí)間的任務(wù)(task)程序結(jié)構(gòu)。
·? 提供了可定義新的操作符的函數(shù)結(jié)構(gòu)(function)。
·? 提供了用于建立表達(dá)式的算術(shù)運(yùn)算符、邏輯運(yùn)算符、位運(yùn)算符。
·? Verilog HDL語言作為一種結(jié)構(gòu)化的語言也非常適合于門級和開關(guān)級的模型設(shè)計(jì)。因其結(jié)構(gòu)化的特點(diǎn)又使它具有以下功能。
—? 提供了完整的一套組合型原語(primitive);
—? 提供了雙向通路和電阻器件的原語;
—? 可建立MOS器件的電荷分享和電荷衰減動態(tài)模型。
Verilog HDL的構(gòu)造性語句可以精確地建立信號的模型。這是因?yàn)樵赩erilog HDL中,提供了延遲和輸出強(qiáng)度的原語來建立精確程度很高的信號模型。信號值可以有不同的強(qiáng)度,可以通過設(shè)定寬范圍的模糊值來降低不確定條件的影響。
Verilog HDL作為一種高級的硬件描述編程語言,有著類似C語言的風(fēng)格。其中if語句、case語句等和C語言中的對應(yīng)語句十分相似。如果讀者已經(jīng)掌握C語言編程的基礎(chǔ),那么學(xué)習(xí)Verilog HDL并不困難,只要對Verilog HDL某些語句的特殊方面著重理解,并加強(qiáng)上機(jī)練習(xí)就能很好地掌握它,利用它的強(qiáng)大功能來設(shè)計(jì)復(fù)雜的數(shù)字邏輯電路。下面將介紹Verilog HDL中的基本結(jié)構(gòu)和語法。
?
Verilog HDL程序入門
首先來看幾個(gè)Verilog HDL程序,然后從中分析Verilog HDL程序的特性。
例1:加法器。
?
module? adder ( count,sum,a,b,cin );?? //加法器模塊端口聲明
???? ?input [2:0] a,b;???????????????????? ??? //端口說明
???? ?input?? cin;
???? ?output? count;
???? ?output [2:0] sum;
???? ?assign {count,sum} = a + b + cin;? ??? //加法器算法實(shí)現(xiàn)
endmodule
?
這個(gè)例子通過連續(xù)賦值語句描述了一個(gè)名為adder的三位加法器可以根據(jù)兩個(gè)三比特?cái)?shù)a、b和進(jìn)位(cin)計(jì)算出和(sum)和進(jìn)位(count)。從例子中可以看出整個(gè)Verilog HDL程序是嵌套在module和endmodule聲明語句里的。
例2:比較器。
?
module? compare ( equal,a,b );???? //比較器模塊端口聲明
? ???????output? equal;? ?????????????? //輸出信號equal
? ???????input [1:0] a,b; ??????????? //輸入信號a、b
? ???????assign? equal=(a==b)?1:0; //如果a、b 兩個(gè)輸入信號相等,輸出為1,否則為0
endmodule
?
這個(gè)程序通過連續(xù)賦值語句描述了一個(gè)名為compare的比較器。對兩比特?cái)?shù)a、b進(jìn)行比較,如a與b相等,則輸出equal為高電平,否則為低電平。在這個(gè)程序中,“/*........*/”和“//.........”表示注釋部分,注釋只是為了方便程序員理解程序,對編譯是不起作用的。
例3:使用原語的三態(tài)驅(qū)動器。
?
module? trist2(out,in,enable); ? ? //三態(tài)啟動器模塊端口聲明
??? ?output? out;????????????????????? //端口說明
??? ?input?? in, enable;
??? ?bufif1? mybuf(out,in,enable);? //實(shí)例化宏模塊bufif1
endmodule
?
這個(gè)例子描述了一個(gè)名為trist2的三態(tài)驅(qū)動器。程序通過調(diào)用一個(gè)在Verilog語言庫中現(xiàn)存的三態(tài)驅(qū)動器實(shí)例元件bufif1來實(shí)現(xiàn)其功能。
例4:自行設(shè)計(jì)的三態(tài)驅(qū)動器。
?
module? trist1(out,in,enable);? ?? //三態(tài)啟動器模塊端口聲明
??? ?output? out;???????????????????? ? //端口說明
??? ?input? in, enable;
??? ?mytri? tri_inst(out,in,enable);//實(shí)例化由mytri模塊定義的實(shí)例元件tri_inst
endmodule
?
??? ?module? mytri(out,in,enable); //三態(tài)啟動器模塊端口聲明
??? ?output? out;???????????????????????? ?? //端口說明
??? ?input? in, enable;
??? ?assign? out = enable? in : 'bz; ?? //三態(tài)啟動器算法描述
endmodule
?
這個(gè)例子通過另一種方法描述了一個(gè)三態(tài)門。在這個(gè)例子中存在著兩個(gè)模塊。模塊trist1調(diào)用由模塊mytri定義的實(shí)例元件tri_inst。模塊trist1是頂層模塊。模塊mytri則被稱為子模塊。
通過上面的例子可以看到。
·? Verilog HDL程序是由模塊構(gòu)成的。每個(gè)模塊的內(nèi)容都是嵌在module和endmodule兩個(gè)語句之間。每個(gè)模塊實(shí)現(xiàn)特定的功能。模塊是可以進(jìn)行層次嵌套的。正因?yàn)槿绱?才可以將大型的數(shù)字電路設(shè)計(jì)分割成不同的小模塊來實(shí)現(xiàn)特定的功能,最后通過頂層模塊調(diào)用子模塊來實(shí)現(xiàn)整體功能。
·? 每個(gè)模塊要進(jìn)行端口定義,并說明輸入輸出口,然后對模塊的功能進(jìn)行行為邏輯描述。
·? Verilog HDL程序的書寫格式自由,一行可以寫幾個(gè)語句,一個(gè)語句也可以分寫多行。
·? 除了endmodule語句外,每個(gè)語句和數(shù)據(jù)定義的最后必須有分號。
·? 可以用“/*.....*/”和“//.......”對Verilog HDL程序的任何部分作注釋。一個(gè)好的、有使用價(jià)值的源程序都應(yīng)當(dāng)加上必要的注釋,以增強(qiáng)程序的可讀性和可維護(hù)性。
評論
查看更多