第一部分 Verilog數(shù)字設(shè)計(jì)基礎(chǔ)_第1頁(yè)
第一部分 Verilog數(shù)字設(shè)計(jì)基礎(chǔ)_第2頁(yè)
第一部分 Verilog數(shù)字設(shè)計(jì)基礎(chǔ)_第3頁(yè)
第一部分 Verilog數(shù)字設(shè)計(jì)基礎(chǔ)_第4頁(yè)
第一部分 Verilog數(shù)字設(shè)計(jì)基礎(chǔ)_第5頁(yè)
已閱讀5頁(yè),還剩290頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第一部分Verilog數(shù)字設(shè)計(jì)基礎(chǔ)第一章Verilog的基本知識(shí)第二章Verilog語法的基本概念第三章模塊的結(jié)構(gòu)、數(shù)據(jù)類型、變量和基本運(yùn)算符號(hào)第四章運(yùn)算符、賦值語句和結(jié)構(gòu)說明語句第五章條件語句、循環(huán)語句、塊語句與生成語句第六章結(jié)構(gòu)語句、系統(tǒng)任務(wù)、函數(shù)語句和顯示系統(tǒng)任務(wù)第七章調(diào)試用系統(tǒng)任務(wù)和常用編譯預(yù)處理語句第八章語法概念總復(fù)習(xí)練習(xí)第一部分Verilog數(shù)字設(shè)計(jì)基礎(chǔ)第1章Verilog的基本知識(shí)1.1硬件描述語言HDL1.2VerilogHDL的歷史1.3VerilogHDL和VHDL的比較1.4Verilog的應(yīng)用情況和適用的設(shè)計(jì)1.5采用VerilogHDL設(shè)計(jì)復(fù)雜數(shù)字電路的優(yōu)點(diǎn)1.6采用VerilogHDL的設(shè)計(jì)流程簡(jiǎn)介第1章Verilog的基礎(chǔ)知識(shí)1.1硬件描述語言HDL概念:硬件描述語言HDL(HardwareDescriptionLanguage)是一種形式化方法來描述數(shù)字電路和系統(tǒng)的語言。IEEE標(biāo)準(zhǔn)VerilogHDLVHDLHDL兩種國(guó)際標(biāo)準(zhǔn):HDL功能數(shù)字系統(tǒng)仿真、驗(yàn)證(全部語法支持)數(shù)字系統(tǒng)設(shè)計(jì)、綜合(部分語法支持)HDL功能:§1.1硬件描述語言HDL1.2VerilogHDL的歷史1.2.1什么是VerilogHDL

VerilogHDL是硬件描述語言的一種,用于數(shù)字系統(tǒng)設(shè)計(jì)。設(shè)計(jì)者可用它進(jìn)行各種級(jí)別的邏輯設(shè)計(jì),可用它進(jìn)行數(shù)字邏輯系統(tǒng)的仿真驗(yàn)證、時(shí)序分析、邏輯綜合。

注:它是目前應(yīng)用最廣泛的一種硬件描述語言。目前在美國(guó)90%以上的ASIC、FPGA開發(fā)使用HDL,全美國(guó)有200多所大學(xué)講授Verilog語言的設(shè)計(jì)方法。在臺(tái)灣地區(qū)幾乎所有著名大學(xué)的電子和計(jì)算機(jī)工程系都講授與Verilog有關(guān)的課程。1.2.1什么是VerilogHDL§1.2VerilogHDL的歷史Verilog-XL誕生1980’sCadence公司購(gòu)買Verilog版權(quán)1989VerilogHDL公開發(fā)表、Verilog移交給OVI組織19901995Verilog

IEEE1364-1995標(biāo)準(zhǔn)公開發(fā)表1999模擬和數(shù)字都適用的Verilog標(biāo)準(zhǔn)公開發(fā)表Verilog

IEEE1364-2001標(biāo)準(zhǔn)公開發(fā)表20012005SystemVerilog

IEEE1800-2005標(biāo)準(zhǔn)公開發(fā)表圖1.1Verilog的發(fā)展歷史§1.2.2VerilogHDL的產(chǎn)生及發(fā)展1.3VerilogHDL和VHDL的比較§1.3VerilogHDL和VHDL的比較共同點(diǎn)能形式化的抽象表示電路的行為和結(jié)構(gòu);支持邏輯設(shè)計(jì)中層次與范圍的描述;可借用高級(jí)語言的精巧結(jié)構(gòu)來簡(jiǎn)化電路行為的描述;具有電路仿真與驗(yàn)證機(jī)制以保證設(shè)計(jì)的正確性;支持電路描述由高層到低層的綜合轉(zhuǎn)換;硬件描述與實(shí)現(xiàn)工藝無關(guān);便于文檔管理;易于理解和設(shè)計(jì)重用。VHDL-------VHSICHardwareDescriptionLanguage,VHSIC則是VeryHighSpeedIntegeratedCircuit的縮寫詞Verilog擁有更廣泛的設(shè)計(jì)群體,成熟的資源也比VHDL豐富;2005年以前,Verilog在系統(tǒng)級(jí)抽象方面比VHDL略差一些,而在門級(jí)開關(guān)電路描述方面比VHDL強(qiáng)的多。2005年后,系統(tǒng)抽象能力得到徹底改變。與VHDL相比,VerilogHDL容易掌握,與C語言類似。不同點(diǎn)圖1.2VerilogHDL與VHDL建模能力的比較2005年公布的SystemVerilogIEEE1800-2005標(biāo)準(zhǔn)使Verilog的可綜合性能和系統(tǒng)仿真性能得到大幅度提高,IP重用有了重大突破。VHDLVITAL開關(guān)電路級(jí)邏輯門級(jí)寄存器傳輸級(jí)算法級(jí)系統(tǒng)級(jí)VerilogSystemVerilog§1.3VerilogHDL和VHDL的比較1.4Verilog的應(yīng)用情況和適用的設(shè)計(jì)

在高層次數(shù)字系統(tǒng)設(shè)計(jì)領(lǐng)域,Verilog已經(jīng)取得壓倒性的優(yōu)勢(shì)——Verilog在門級(jí)描述的底層,比VHDL有更強(qiáng)的功能?!С?jǐn)?shù)字邏輯和模擬電路的描述?!狪EEE1800-2005標(biāo)準(zhǔn)公布,在綜合、仿真驗(yàn)證和IP核重用方面都有大幅度提高。拓寬了發(fā)展前景。語言輸入與原理圖輸入方式相比的優(yōu)點(diǎn):1、容易把設(shè)計(jì)移植到不同廠家的不同芯片中去;2、信號(hào)位數(shù)容易修改,可以很方便的適應(yīng)不同規(guī)模的應(yīng)用;3、與實(shí)現(xiàn)工藝無關(guān);VerilogHDL綜合器生成標(biāo)準(zhǔn)的電子設(shè)計(jì)互換格式(EDIF)文件,方便文檔交換與保存;1.5采用VerilogHDL設(shè)計(jì)復(fù)雜數(shù)字電路的優(yōu)點(diǎn)電路的兩種基本入方式:原理圖輸入(傳統(tǒng)設(shè)計(jì)方法)硬件描述語言輸入

采用Verilog語言,設(shè)計(jì)的可重用性好。

由于VerilogHDL不斷更新改進(jìn),最新標(biāo)準(zhǔn)為IEEE1800-2005,使得該語言具有更廣闊的發(fā)展前景,目前最新的EDA工具都進(jìn)行了更新以支持最新的Verilog標(biāo)準(zhǔn)。§1.5采用VerilogHDL設(shè)計(jì)復(fù)雜數(shù)字電路的優(yōu)點(diǎn)IP--------知識(shí)產(chǎn)權(quán)。美國(guó)Dataquest咨詢公司將半導(dǎo)體產(chǎn)業(yè)的IP定義為用于ASIC、PLD等芯片中的并且是預(yù)先設(shè)計(jì)好的電路功能模塊。

IP核------完成某種功能的設(shè)計(jì)模塊。IP核概念:軟核(SoftCore):功能經(jīng)過驗(yàn)證的、可綜合的、實(shí)現(xiàn)后電路結(jié)構(gòu)總門數(shù)在5000門以上的VerilogHDL模型。由軟核構(gòu)成的器件稱為虛擬器件。三者中靈活性最高。(HDL描述)固核(FirmCore):指在某一種現(xiàn)場(chǎng)可編程門陣列(FPGA)器件上實(shí)現(xiàn)的、經(jīng)驗(yàn)證是正確的、總門數(shù)在5000門以上電路結(jié)構(gòu)編碼文件。(完成了綜合)硬核(HardCore):指在某一種專用集成電路(ASIC)工藝的器件上實(shí)現(xiàn)的、經(jīng)驗(yàn)證是正確的、總門數(shù)在5000門以上的電路結(jié)構(gòu)版圖掩膜。1.6VerilogHDL的設(shè)計(jì)流程方法:Top-Down(自頂向下)設(shè)計(jì)思想。圖1.3Top-Down設(shè)計(jì)思想系統(tǒng)級(jí)設(shè)計(jì)模塊A模塊B模塊C模塊A1模塊A3模塊A2模塊B1模塊B2模塊B3模塊C1模塊C2§1.6VerilogHDL的設(shè)計(jì)流程圖1.4HDL設(shè)計(jì)流程圖電路圖設(shè)計(jì)文件HDL設(shè)計(jì)文件電路功能仿真HDL功能仿真(前仿真)HDL綜合布局布線后仿真優(yōu)化、布局布線電路制造工藝文件或FPGA碼流文件與物理器件有關(guān)的布線約束等工藝技術(shù)文件沒問題有問題有問題沒問題沒問題有問題后仿真有問題前仿真:

即RTL級(jí)仿真,檢查有關(guān)模塊邏輯執(zhí)行步驟是否正確。后仿真:用門級(jí)模型做驗(yàn)證,檢查由門的互連構(gòu)成的邏輯其功能是否正確。布局布線后仿真:在門級(jí)模型的基礎(chǔ)上加上了布線延時(shí),與真實(shí)的電路最接近的驗(yàn)證?!?.6VerilogHDL的設(shè)計(jì)流程小結(jié)小結(jié):1)采用VerilogHDL設(shè)計(jì)方法比采用電路圖輸入的方法更有優(yōu)越性;2)在兩種符合IEEE標(biāo)準(zhǔn)的硬件描述語言中,VerilogHDL與VHDL相比更加基礎(chǔ)、更易掌握;3)VerilogHDL可用于復(fù)雜數(shù)字邏輯電路和系統(tǒng)的總體仿真、子系統(tǒng)仿真和具體電路綜合等各個(gè)設(shè)計(jì)階段;4)Top-Down的設(shè)計(jì)方法方便了從系統(tǒng)級(jí)劃分和管理整個(gè)項(xiàng)目,使得超大規(guī)模的復(fù)雜數(shù)字電路的設(shè)計(jì)成為可能,并可減少設(shè)計(jì)人員,避免不必要的重復(fù)設(shè)計(jì),提高了設(shè)計(jì)的一次成功率。第1章Verilog的基礎(chǔ)知識(shí)第2章Verilog語法的基本概念概念:用VerilogHDL描述的電路設(shè)計(jì)就是該電路的VerilogHDL模型,也稱為模塊——module。概念:VerilogHDL既是一種行為描述的語言也是一種結(jié)構(gòu)描述的語言。也就是說,無論描述電路功能行為的模塊或描述元件或較大部件互連的模塊都可以用Verilog語言來建立電路模型。第2章Verilog語法的基本概念概念:Verilog模型可以是實(shí)際電路的不同級(jí)別的抽象。這些抽象的級(jí)別和它們所對(duì)應(yīng)的模型類型共有以下5種:

(1)系統(tǒng)級(jí)(system-level):用語言提供的高級(jí)結(jié)構(gòu)能夠?qū)崿F(xiàn)所設(shè)計(jì)模塊的外部性能的模型。

(2)算法級(jí)(algorithm-level):用語言提供的高級(jí)結(jié)構(gòu)能夠?qū)崿F(xiàn)算法運(yùn)行的模型。

(3)RTL級(jí)(RegisterTransferLevel):描述數(shù)據(jù)在寄存器之間的流動(dòng)和如何處理、控制這些數(shù)據(jù)流動(dòng)的模型。

以上三種都屬于行為描述,只有RTL級(jí)才與邏輯電路有明確的對(duì)應(yīng)關(guān)系。

(4)門級(jí)(gate—level):描述邏輯門以及邏輯門之間連接的模型。與邏輯電路有確定的連接關(guān)系,以上四種數(shù)字系統(tǒng)設(shè)計(jì)工程師必須掌握。

(5)開關(guān)級(jí)(switch—level):描述器件中三極管和儲(chǔ)存節(jié)點(diǎn)以及它們之間連接的模型。系統(tǒng)級(jí)(System)

算法級(jí)(Alogrthem)寄存器傳輸級(jí)(RTL)門級(jí)(Gate)電路開關(guān)級(jí)(Switch)2.1Verilog模塊的基本概念abslout圖2.1二選一多路器(一)【例2.1】module

muxtwo(out,a,b,sl);

inputa,b,sl;//信號(hào)屬性outputout;//信號(hào)屬性

regout;//信號(hào)屬性

//實(shí)現(xiàn)功能描述

always@(sloraorb)

if(!sl)out=a;elseout=b;endmodule§2.1Verilog模塊的基本概念

我們并不關(guān)心它的電路結(jié)構(gòu),而關(guān)心的是如何從邏輯上來描述它?!纠?.2】abslout&&1nslselaselbmodulemuxtwo(out,a,b,sl);

inputa,b,sl;outputout;wirensl,sela,selb;

assign

nsl=~sl;

assign

sela=a&nsl;

assign

selb=b&sl;

assignout=sela|selb;endmodule基于邏輯表達(dá)式的描述圖2.2二選一多路器邏輯圖§2.1Verilog模塊的基本概念【例2.3】absloutu1u2u3u4nslselaselbmodulemuxtwo(out,a,b,sl);

inputa,b,sl;outputout;notu1(ns1,sl);andu2(sela,a,nsl);andu3(selb,b,sl);oru4(out,sela,selb);endmodule結(jié)構(gòu)描述圖2.3多路選擇器(二)參考返回§2.1Verilog模塊的基本概念編寫VerilogHDL模塊的練習(xí)請(qǐng)?jiān)谙旅娴目崭裰刑钊脒m當(dāng)?shù)姆?hào)使其成為右圖的Verilog模塊:

moduleblock1(a,b,—,—,—);input—,—,—;——d,—;assignd=a|(b&~c);assigne=(b&~c);_______abcde§2.1Verilog模塊的基本概念概念:綜合——Synthesis

Verilog模塊(程序)通過計(jì)算機(jī)上運(yùn)行的綜合軟件工具(屬EDA軟件)把行為描述通過邏輯表達(dá)式的中間形式自動(dòng)轉(zhuǎn)換為結(jié)構(gòu)描述的模塊,這個(gè)過程叫做綜合(Synthesis)。電路的行為電路的結(jié)構(gòu)Synthesis綜合absloutabsloutu1u2u3u4nslselaselb電路的邏輯關(guān)系§2.1Verilog模塊的基本概念概念:1)并行性;

2)層次結(jié)構(gòu)性;

3)可綜合性;

4)測(cè)試平臺(tái)(Testbench)下面再看幾個(gè)簡(jiǎn)單的模塊,目的是初步了解Verilog語法最重要的幾個(gè)基本概念:§2.1Verilog模塊的基本概念moduleadder(cout,sum,a,b,cin);input[2:0]a,b;inputcin;outputcout;output[2:0]sum;assign{cout,sum}=a+b+cin;endmodule【例2.4】說明:此程序通過連續(xù)賦值語句描述了一個(gè)名為adder的3位加法器。它可以根據(jù)兩個(gè)3位數(shù)a、b和進(jìn)位(cin)計(jì)算出和(sum)及向上進(jìn)位(cout)。整個(gè)VerilogHDL程序是位于module和endmodule聲明語句之間的。連續(xù)賦值語句信號(hào)定義模塊開始與結(jié)束外部端口信號(hào)定義§2.1Verilog模塊的基本概念【例2.5】說明:這個(gè)程序通過連續(xù)賦值語句描述了一個(gè)名為compare的比較器。對(duì)2比特?cái)?shù)a、b進(jìn)行比較,如a與b相等,則輸出equal為高電平,否則為低電平。/*……*/和//……表示注釋部分。modulecompare(equal,a,b);outputequal;//聲明輸出信號(hào)equalinput[1:0]a,b;//聲明輸入信號(hào)a,bassignequal=(a==b)?1:0;

/*a,b相等,輸出為1;否則為0*/endmodule程序注釋§2.1Verilog模塊的基本概念【例2.6】說明:這個(gè)程序描述了一個(gè)名為trist2的三態(tài)驅(qū)動(dòng)器。通過調(diào)用Verilog語言提供的原語庫(kù)中的三態(tài)驅(qū)動(dòng)器元件bufif1來實(shí)現(xiàn)其邏輯功能。在trist2模塊中所用到的三態(tài)驅(qū)動(dòng)器bufif1的具體名字叫做mybuf,這種引用現(xiàn)成元件或模塊的方法叫做實(shí)例化或?qū)嵗茫潜硎倦娐窐?gòu)造的一種常用語法現(xiàn)象。moduletrist2(out,in,enable);outputout;inputin,enable;

bufif1

mybuf(out,in,enable);endmodule元件例化instanceinenableout§2.1Verilog模塊的基本概念【例2.7】moduletrist1(sout,sin,ena);outputsout;inputsin,ena;

mytri

tri_inst(.out(sout),.in(sin),.enable(ena));endmodulemodulemytri(out,in,enable);outputout;inputin,enable;assignout=enable?in:‘bz;endmodule底層子模塊頂層說明:在實(shí)例部件tri_inst中,帶“.”表示被引用模塊的端口,名稱必須與被引用模塊的端口一致;小括號(hào)中名稱為本模塊信號(hào),表示與被調(diào)用模塊的連接關(guān)系。參考返回§2.1Verilog模塊的基本概念說明:上面這些例子都是可以綜合的,通過綜合工具可以自動(dòng)轉(zhuǎn)換為由與門、或門和非門組成的加法器、比較器和三態(tài)門等組合邏輯。

這個(gè)例子中存在著兩個(gè)模塊:模塊trist1調(diào)用模塊mytri

的實(shí)例元件tri_inst。模塊trist1是上層模塊。模塊mytri

則被稱為子模塊。通過這種結(jié)構(gòu)性模塊構(gòu)造可構(gòu)成特大型模塊?!?.1Verilog模塊的基本概念2.2Verilog用于模塊的測(cè)試概念:描述測(cè)試信號(hào)的變化和測(cè)試過程的模塊叫做測(cè)試平臺(tái)(Testbench或Testfixture)。測(cè)試平臺(tái)可以對(duì)上面介紹的電路模塊(無論是行為的或結(jié)構(gòu)的)進(jìn)行動(dòng)態(tài)的全面測(cè)試。通過觀測(cè)被測(cè)試模塊的輸出信號(hào)是否符合要求,可以調(diào)試和驗(yàn)證邏輯系統(tǒng)的設(shè)計(jì)系統(tǒng)和結(jié)構(gòu)正確與否,并發(fā)現(xiàn)問題及時(shí)修改?!?.2Verilog用于模塊的測(cè)試圖2.5Verilog用于模塊測(cè)試測(cè)試信號(hào)ain和測(cè)試條select件的控制

binabsloutu1u2u3u4nslselaselb被測(cè)試模塊對(duì)測(cè)試信號(hào)的響應(yīng)outw返回元件例化§2.2Verilog用于模塊的測(cè)試【例2.8】Verilog測(cè)試模塊,對(duì)例2.1~2.3的多路器進(jìn)行全面的測(cè)試。`include“muxtwo.v”always#50clock=~clock;modulet;always@(posedgeclock)

reg

ain,bin,select;begin

regclock;#1ain={$random}%2;wireoutw;#3bin={$random}%2;initialendbeginalways#10000select=!select;

ain=0;

muxtwo

m(.out(outw),.a(ain),.b(bin),.sl(select)); bin=0;endmodule select=0; clock=0;end§2.2Verilog用于模塊的測(cè)試程序說明:initialbeginain=0;bin=0; select=0;clock=0;endinitial塊只執(zhí)行一次把寄存器型變量初始化為確定值,即0時(shí)刻值。1信號(hào)的初始化§2.2Verilog用于模塊的測(cè)試always#50clock=~clock;always塊循環(huán)執(zhí)行產(chǎn)生一個(gè)不斷重復(fù)的、周期為100個(gè)單位時(shí)間的時(shí)鐘信號(hào)clock2clock5050時(shí)鐘信號(hào)的產(chǎn)生方法§2.2Verilog用于模塊的測(cè)試always@(posedgeclock)posedge

上升沿negedge

下降沿3clock時(shí)鐘信號(hào)的上升沿觸發(fā)§2.2Verilog用于模塊的測(cè)試always@(posedgeclock)begin

ain={$random}%2;#3bin={$random}%2;end延時(shí)3個(gè)時(shí)間單位$random-產(chǎn)生隨機(jī)數(shù){$random}%2為產(chǎn)生0-1的隨機(jī)數(shù)4隨機(jī)信號(hào)產(chǎn)生與信號(hào)延時(shí)§2.2Verilog用于模塊的測(cè)試5元件的調(diào)用muxtwo

m(.out(outw),.a(ain),.b(bin),.sl(select));被調(diào)用元件名元件例化名本模塊信號(hào)名被調(diào)用模塊原有信號(hào)名說明:m表示在本測(cè)試模塊中有一個(gè)名為m的muxtwo的模塊;其四個(gè)端口分別為:.out(),.a(),.b(),.sl();“.”表示端口,后面為端口名,名稱必須與muxtwo模塊定義的端口名一致;小括號(hào)內(nèi)的信號(hào)名為與該端口連接的信號(hào)線名,必須在本模塊中定義,說明其類型。參考§2.2Verilog用于模塊的測(cè)試§2.2Verilog用于模塊的測(cè)試§2.2Verilog用于模塊的測(cè)試module

myadder(clock,reset,a,b,sum);

input

clock,reset;

input

[7:0]

a,b;

output

[7:0]sum;

reg

[7:0]

sum;

reg[7:0]

a_reg,

b_reg;always

@(posedgeclock

or

negedgereset)

if(!reset)

begin

sum<=’b0,

a_reg<=’b0;b_reg<=’b0;

end

else

begin

a_reg<=a;b_reg<=b;

sum<=a_reg+b_reg;endendmodule`include“myadder.v”modulet;wire[8:0]sumout;

reg[7:0]ain,bin;

reg

rst,clk;

myadderu1(.clock(clk),.reset(rst),.a(ain),.b(bin),.sum(sumout));initial

begin

rst=1;clk=0;ain=0;bin=3;#70rst=0;#70rst=1;end

always#50clk=~clk;

always@(posedge

clk)begin#2ain=ain+2;#3bin=bin+5;endendmodule§2.2Verilog用于模塊的測(cè)試t

模塊中VerilogHDL語句的功能可以對(duì)myadder

模塊進(jìn)行測(cè)試,myadder

模塊輸入了必須的信號(hào):

rst,clk,ain,bin

觀測(cè)該模塊的輸出:sumout

看一看它是否符合設(shè)計(jì)要求?!?.2Verilog用于模塊的測(cè)試2.3小結(jié)(1)VerilogHDL程序由模塊構(gòu)成。每個(gè)模塊的內(nèi)容都位于module和endmodule兩個(gè)語句之間。每個(gè)模塊實(shí)現(xiàn)特定的功能。(2)模塊是可以進(jìn)行層次嵌套的。因此,可以將大型的數(shù)字電路設(shè)計(jì)分割成不同的小模塊來實(shí)現(xiàn)特定的功能。(3)如果每個(gè)模塊都是可以綜合的,則通過綜合工具可以把它們的功能描述全都轉(zhuǎn)換為最基本的邏輯單元描述,最后可以用一個(gè)頂層模塊通過實(shí)例引用把這些模塊連接起來,整合成一個(gè)很大的復(fù)雜邏輯系統(tǒng)。(4)Verilog模塊可以分為兩種類型:一種是為了讓模塊最終能生成電路的類型,另一種只是為了測(cè)試所設(shè)計(jì)電路的邏輯功能是否正確。(5)每個(gè)模塊要進(jìn)行端口定義,并說明它是輸入口還是輸出口,然后對(duì)模塊的功能進(jìn)行描述。第2章Verilog語法的基本概念(6)VerilogHDL程序的書寫格式自由,一行可以寫幾個(gè)語句,一個(gè)語句也可以分寫多行。(7)除了endmodule語句外,每個(gè)語句和數(shù)據(jù)定義的最后必須有分號(hào)。(8)可以用/*……*/和//……對(duì)VerilogHDL程序的任何部分作注釋。一個(gè)好的、有使用價(jià)值的源程序都應(yīng)當(dāng)加上必要的注釋,以增強(qiáng)程序的可讀性和可維護(hù)性。第2章Verilog語法的基本概念第2章Verilog語法的基本概念思考題1、構(gòu)成模塊的關(guān)鍵詞是什么?2、是否任意抽象的符合語法的Verilog模塊都可以通過綜合工具轉(zhuǎn)變?yōu)殡娐方Y(jié)構(gòu)?3、什么叫綜合?通過綜合產(chǎn)生的是什么?產(chǎn)生的結(jié)果有什么用處?4、仿真是什么?為什么要進(jìn)行仿真?5、模塊的端口是如何描述的?6、在引用實(shí)例模塊的時(shí)候,如何在主模塊中連接信號(hào)線?7、如何產(chǎn)生連續(xù)的周期性測(cè)試時(shí)鐘?8、如果不用initial塊,能否產(chǎn)生測(cè)試時(shí)鐘?第3章模塊的結(jié)構(gòu)、數(shù)據(jù)類型、變量和基本運(yùn)算符號(hào)3.1模塊的結(jié)構(gòu)3.2數(shù)據(jù)類型及其常量和變量3.3運(yùn)算符及表達(dá)式第3章模塊的結(jié)構(gòu)、數(shù)據(jù)類型、變量和基本運(yùn)算符號(hào)

Verilog的基本設(shè)計(jì)單元是“模塊”。其組成有兩部分。一部分描述接口,另一部分描述邏輯功能,即定義輸入是如何影響輸出的。3.1模塊的結(jié)構(gòu)接口描述邏輯功能描述Moduleblock(a,b,c,d);inputa,b;outputc,d;assignc=a|b;assignd=a&b;endmoduleabcd圖3.1模塊結(jié)構(gòu)的組成§3.1模塊的結(jié)構(gòu)每個(gè)Verilog程序包括4個(gè)主要部分:程序組成端口定義I/O說明內(nèi)部信號(hào)聲明功能定義

程序中的接口描述就是用來說明電路圖符號(hào)的引腳名稱及其信號(hào)流向;邏輯功能描述說明了該電路符號(hào)的具體邏輯功能?!?.1模塊的結(jié)構(gòu)3.1.1模塊的端口定義語法:模塊的端口聲明了模塊的輸入輸出口。其格式如下:

module模塊名(口1,口2,口3,口4,……);說明:模塊的端口表示的是模塊的輸入和輸出口名,也就是與其它模塊聯(lián)系端口的標(biāo)識(shí)。在模塊被引用時(shí),在引用的模塊中,有些信號(hào)要輸入到被引用的模塊中,有些信號(hào)需要從被引用的模塊中取出來?!?.1模塊的結(jié)構(gòu)語法:在引用模塊時(shí)其端口的兩種連接方法:(1)按順序引用在引用時(shí),嚴(yán)格按照模塊定義的端口順序來連接,不用標(biāo)明原模塊定義時(shí)規(guī)定的端口名,例如:

模塊名(連接端口1信號(hào)名,連接端口2信號(hào)名,連接端口3信號(hào)名,……,);(2)按名稱引用在引用時(shí)用“.”符號(hào),標(biāo)明原模塊定義時(shí)規(guī)定的端口名,例如:

模塊名(.端口1名(連接信號(hào)1名),端口2名(連接信號(hào)2名),……,);參考程序參考程序§3.1模塊的結(jié)構(gòu)3.1.2模塊內(nèi)容1.I/O說明的格式語法:輸入口:input端口名1;//一位寬信號(hào)定義

input[信號(hào)位寬-1:0]端口名1;

input[信號(hào)位寬-1:0]端口名2;

……input[信號(hào)位寬-1:0]端口名i;//(共有i個(gè)輸入口)語法:輸出口:output端口名1;

//一位寬信號(hào)定義

output[信號(hào)位寬-1:0]端口名1;

output[信號(hào)位寬-1:0]端口名2;

……output[信號(hào)位寬-1:0]端口名j;//(共有j個(gè)輸出口)§3.1模塊的結(jié)構(gòu)語法:I/O說明也可以寫在端口聲明語句里。其格式如下:

modulemodule_name(inputport1,inputport2,…outputport1,outputport2…);語法:輸入/輸出口:

inout

端口名1;//一位寬信號(hào)定義

inout[信號(hào)位寬-1:0]端口名1;

inout[信號(hào)位寬-1:0]端口名2;

……

inout[信號(hào)位寬-1:0]端口名k;//(共有k個(gè)雙向總線端口)§3.1模塊的結(jié)構(gòu)2.內(nèi)部信號(hào)說明在模塊內(nèi)用到的和與端口有關(guān)的兩種變量類型:wire、reg語法:wire變量1,變量2…:wire[width-1:0]變量1,變量2…:reg

變量1,變量2…;reg[width-1:0]變量1,變量2…;

說明:用input定義的端口信號(hào)沒有類型說明,只有output定義的信號(hào)和內(nèi)部信號(hào)具有wire、reg類型聲明要求。信號(hào)定義為intput類型時(shí)默認(rèn)隱含為wire型?!?.1模塊的結(jié)構(gòu)3.功能定義

模塊中最重要的部分是邏輯功能定義部分。有3種方法可在模塊中產(chǎn)生邏輯。用“assign”連續(xù)賦值語句用元件例化方法(即元件調(diào)用)用“always”塊注意:前面程序中出現(xiàn)的initial塊,只能用于測(cè)試平臺(tái)程序?!?.1模塊的結(jié)構(gòu)1)用"assign"聲明語句

這種方法的句法很簡(jiǎn)單,只需寫一個(gè)“assign”,后面再加一個(gè)方程式即可。如:assigna=b&c;例中的方程式描述了一個(gè)有兩個(gè)輸入的與門?!?.1模塊的結(jié)構(gòu)注1.assign語句被賦值的變量必須是wire型,操作數(shù)可以是wire型、reg型。2.總是處于激活狀態(tài)。3.可用于描述一個(gè)完整的設(shè)計(jì)。4.必須放在initial、always塊外。2)用元件例化方法(即元件調(diào)用)

采用實(shí)例元件的方法像在電路圖輸人方式下調(diào)入庫(kù)元件一樣,鍵入元件的名字和相連的引腳即可,如:and#2u1(q,a,b);

§3.1模塊的結(jié)構(gòu)3)用“always”塊

采用“assign”語句是描述組合邏輯最常用的方法之一。而“always”塊既可用于描述組合邏輯也可描述時(shí)序邏輯。

“always”塊可用很多種描述手段來表達(dá)邏輯,例如下面的程序中就用了if…else語句來表達(dá)邏輯關(guān)系?!皫М惒角辶愣说腄觸發(fā)器”的描述always@(posedge

clkorposedge

clr)beginif(clr)q<=0;

elseq<=d:

end“與門”的描述:

always@(aorb)beginif((a==1)&&(b==1))c=‘b1;elsec=‘b0;end賦值運(yùn)算符§3.1模塊的結(jié)構(gòu)3.1.3理解要點(diǎn)要點(diǎn):上面的例子分別采用了“assign”語句、實(shí)例元件和“always”塊。這3個(gè)例子描述的邏輯功能是同時(shí)執(zhí)行的。也就是說,如果把這3項(xiàng)寫到一個(gè)Verilog模塊文件中去,它們的位置順序不會(huì)影響實(shí)現(xiàn)的功能。這3項(xiàng)是同時(shí)執(zhí)行的,也就是并發(fā)的。要點(diǎn):在“always”模塊內(nèi),邏輯是按照指定的順序執(zhí)行的。“always”塊中的語句稱為“順序語句”。但是,兩個(gè)或更多的“always”模塊之間是同時(shí)執(zhí)行的,但是模塊內(nèi)部的語句是順序執(zhí)行的?!?.1模塊的結(jié)構(gòu)

moduleex(…………);input…;output……………….;

reg…..;assigna=b&c;always@(…………….)begin…endandu1(a,b,c);always@(…………….)

endmodule

并發(fā)執(zhí)行順序執(zhí)行3.1.4要點(diǎn)總結(jié)牢記:(1)在Verilog模塊中所有過程塊(initial塊、always塊)、連續(xù)賦值語句、實(shí)例引用都是并行的;(2)在同一模塊中這三者出現(xiàn)的先后順序沒有關(guān)系;(3)實(shí)例引用表示的是一種通過變量名實(shí)現(xiàn)互相連接的關(guān)系;(4)只有連續(xù)賦值語句assign和實(shí)例引用語句可以獨(dú)立于過程塊而存在于模塊的功能定義部分?!?.1模塊的結(jié)構(gòu)3.2數(shù)據(jù)類型及其常量和變量VerilogHDL中總共有19種數(shù)據(jù)類型。數(shù)據(jù)類型是用來表示數(shù)字電路硬件中的數(shù)據(jù)儲(chǔ)存和傳送元素的。需要掌握的常用類型有4種:

reg

wire

integer

parameter

另外,VerilogHDL語言中也有常量和變量之分。它們分別屬于以上這些類型?!?.2數(shù)據(jù)類型及其常量和變量其他:

large、medium、small、tri、trio、tri1、triand、trior、trireg、vectoredscalared、time、wand和wor。這些數(shù)據(jù)類型除time型外都與基本邏輯單元建庫(kù)有關(guān)3.2.1常量概念:在程序運(yùn)行過程中,其值不能被改變的量稱為常量。數(shù)字常量符號(hào)常量常量§3.2數(shù)據(jù)類型及其常量和變量1.?dāng)?shù)字

整型常量有4種進(jìn)制表示形式:

二進(jìn)制整數(shù)(b或B);十進(jìn)制整數(shù)(d或D);十六進(jìn)制整數(shù)(h或H);八進(jìn)制整數(shù)(o或O)。進(jìn)制(1)整數(shù)§3.2數(shù)據(jù)類型及其常量和變量數(shù)字表達(dá)方式有以下3種:1)

<位寬><進(jìn)制><數(shù)字>

這是一種全面的描述方式?!?.2數(shù)據(jù)類型及其常量和變量例:8’ha2、8’HA2//字母不區(qū)分大小寫

4’d2//4位十進(jìn)制數(shù)

6’o27//6位八進(jìn)制

8’b10101100注:“’”是單引號(hào),位寬只能用十進(jìn)制數(shù)

位寬

位寬指明了數(shù)字的精確位數(shù)。例如:一個(gè)4位二進(jìn)制數(shù)的位寬為4,一個(gè)4位十六進(jìn)制數(shù)的位寬為16。

位寬始終表示的是二進(jìn)制位數(shù),與進(jìn)制符號(hào)無關(guān)。如定義位寬比實(shí)際位數(shù)長(zhǎng),左邊補(bǔ)“0”“X”“Z”

10’b10=10’b000000001010’bx0x1=xxxxxxx0x1如定義位寬比實(shí)際位數(shù)短,最左邊截?cái)?/p>

3’b10010111=3’b111

注:錯(cuò)誤格式

i.3’b000……//“’”和進(jìn)制之間不能空格

ii.(3+2)’b10…….//位寬不能為表達(dá)式

iii.4'd-4

//非法:數(shù)值不能為負(fù)2)<進(jìn)制><數(shù)字>

數(shù)字的位寬采用缺省位寬(這由具體的機(jī)器系統(tǒng)決定,但至少32位)。3)<數(shù)字>采用缺省進(jìn)制(十進(jìn)制),位寬采用缺省位寬。

例’ha1232位十六進(jìn)制數(shù)

15==‘b1111x代表不定值,z代表高阻值。一個(gè)x可以用來定義十六進(jìn)制數(shù)的4位二進(jìn)制數(shù)的狀態(tài),八進(jìn)制數(shù)的3位,二進(jìn)制數(shù)的1位。z的表示方式同x類似。

z的另一種表達(dá)方式是“?”。在使用case表達(dá)式時(shí)建議使用這種寫法,以提高程序的可讀性,見下例:(2)x和z值4’b10x0//位寬為4的二進(jìn)制數(shù),從低位數(shù)起第2位為不定值4'b101z//位寬為4的二進(jìn)制數(shù),從低位數(shù)起第1位為高阻值12’dz//位寬為12的十進(jìn)制數(shù),其值為高阻值(第1種表達(dá)方式)12’d?//位寬為12的十進(jìn)制數(shù),其值為高阻值(第2種表達(dá)方式)8‘h4x//位寬為8的十六進(jìn)制數(shù),其低4位值為不定值§3.2數(shù)據(jù)類型及其常量和變量

在位寬表達(dá)式前加負(fù)號(hào)來表示負(fù)數(shù)。負(fù)號(hào)必須寫在數(shù)字定義表達(dá)式的最前面。

注意,負(fù)號(hào)不可以放在位寬和進(jìn)制之間,也不可以放在進(jìn)制和具體的數(shù)之間。見下例:(3)負(fù)數(shù)-8‘d5//這個(gè)表達(dá)式代表5的補(bǔ)數(shù)(用八位二進(jìn)制數(shù)表示)

11111011

-5//-’d5-32’d58‘d-5//錯(cuò)誤格式§3.2數(shù)據(jù)類型及其常量和變量

下畫線可以用來分隔數(shù)的表達(dá)以提高程序可讀性,但不可以用在位寬和進(jìn)制處,只能用在具體的數(shù)字之間。見下例:(4)下畫線(underscore)16’b1010_1011_1111_1010//正確格式8’b_0011_1010//錯(cuò)誤格式§3.2數(shù)據(jù)類型及其常量和變量當(dāng)常量不說明位數(shù)時(shí),默認(rèn)值是32位,每個(gè)字母用8位的ASCII值表示。例:10=32’d10=32’b10101=32’d1=32’b1-1=-32’d1=32’hFFFFFFFF’BX=32’BX=32’BXXXXXXX…X“AB“=16’B01000001_01000010//字符串AB為十六進(jìn)制數(shù)16’h4142§3.2數(shù)據(jù)類型及其常量和變量2.參數(shù)(parameter)型概念:在VerilogHDL中用parameter來定義常量,即用parameter來定義一個(gè)標(biāo)識(shí)符代表一個(gè)常量,稱為符號(hào)常量,即標(biāo)識(shí)符形式的常量。parameter型數(shù)據(jù)說明格式如下:parameter參數(shù)名1=表達(dá)式,……,參數(shù)名n=表達(dá)式;§3.2數(shù)據(jù)類型及其常量和變量parameter是參數(shù)型數(shù)據(jù)的確認(rèn)符。確認(rèn)符后跟著一個(gè)用逗號(hào)分隔開的賦值語句表達(dá)式。在每一個(gè)賦值語句的右邊必須是一個(gè)常數(shù)表達(dá)式,即該表達(dá)式只能包含數(shù)字或先前已定義過的參數(shù)。見下列:parametermsb=7;//定義參數(shù)msb為常量7

parametere=25,f=29;//定義兩個(gè)常數(shù)參數(shù)

parameterr=5.7;//聲明r為一個(gè)實(shí)型參數(shù)

parameterbyte_size=8,byte_msb=byte_size-1;//用常數(shù)表達(dá)式賦值

parameteraverage_delay=(r+f)/2;//用常數(shù)表達(dá)式賦值§3.2數(shù)據(jù)類型及其常量和變量參數(shù)的定義是局部的,只在當(dāng)前模塊中有效。

作用:

參數(shù)型常數(shù)經(jīng)常用于定義延遲時(shí)間和變量寬度。在模塊或?qū)嵗脮r(shí),可通過參數(shù)傳遞改變被引用模塊或?qū)嵗幸讯x的參數(shù)。moduleDecode(A,F);parameterWidth=1,Polarity=1;…

endmodulemoduleTop(…);wire[3:0]A4;wire[4:0]A5;wire[15:0]F16;wire[31:0]F32;Decode#(4,0)D1(A4,F16);Decode#(5)D2(A5,F32);

endmodule【例3.1】§3.2數(shù)據(jù)類型及其常量和變量使用#次序與原說明相同因?yàn)?說明延時(shí)的時(shí)候只能用于gate或過程語句,不能用于模塊實(shí)例。gate(primitives)在實(shí)例化時(shí)只能有延時(shí),不能有模塊參數(shù)。為什么編譯器認(rèn)為這是參數(shù)而不是延時(shí)呢?【例3.2】

下面是一個(gè)由多層次模塊構(gòu)成的電路。在一個(gè)模塊中改變另一個(gè)模塊的參數(shù)時(shí),使用defparam命令。AnnotateTestTTopBlockBlockB1B2實(shí)例名實(shí)例名實(shí)例名圖3.2多層次模塊構(gòu)成的電路§3.2數(shù)據(jù)類型及其常量和變量 `include“Top.v”`include“Block.v”`include“Annotate.v”moduleTest; wireW; TopT(…);

endmodule moduleTop; wirew; BlockB1(…); BlockB2(…);

endmodule moduleBlock; parameterP=0;

endmodule

moduleAnnotate;

defparam

Test.T.B1.P=2,

//多層次模塊中,參數(shù)變量的命名規(guī)則,用點(diǎn)號(hào)來表示不同的模塊層次Test.T.B2.P=3;

endmodule通過參數(shù)傳遞改變已定義的參數(shù)值使用defparam

改變參數(shù)值3.2.2變量

變量即在程序運(yùn)行過程中其值可以改變的量,在VerilogHDL中變量的數(shù)據(jù)類型有很多種,這里只對(duì)常用的幾種進(jìn)行介紹。多驅(qū)動(dòng)源情況略。1.wire型說明:(1)wire網(wǎng)絡(luò)數(shù)據(jù)類型表示結(jié)構(gòu)實(shí)體(例如門)之間的物理連接。(2)網(wǎng)絡(luò)類型的變量不能儲(chǔ)存值,而且它必須受到驅(qū)動(dòng)器(例如門或連續(xù)賦值語句assign)的驅(qū)動(dòng)。如果沒有驅(qū)動(dòng)器連接到網(wǎng)絡(luò)類型的變量上,則該變量就是高阻的,即其值為z。

(3)wire型數(shù)據(jù)常用來表示以assign關(guān)鍵字指定的組合邏輯信號(hào)。(4)Verilog程序模塊中輸出信號(hào)類型默認(rèn)時(shí)自動(dòng)定義為wire型。wire型信號(hào)可以用做任何方程式的輸入,也可以用做“assign”語句或?qū)嵗妮敵觥!?.2數(shù)據(jù)類型及其常量和變量wire型信號(hào)的格式如下:wire[n-1:0]數(shù)據(jù)名1,數(shù)據(jù)名2,……數(shù)據(jù)名i;或wire[n:1]數(shù)據(jù)名1,數(shù)據(jù)名2,……數(shù)據(jù)名i;例:

wirea;//定義了一個(gè)1位的wire型數(shù)據(jù),

wire[7:0]b;//定義了一個(gè)8位的wire型數(shù)據(jù)b

wire[4:1]c,d;//定義了二個(gè)4位的wire型數(shù)據(jù)c和d§3.2數(shù)據(jù)類型及其常量和變量2.reg型說明:(1)reg型是寄存器數(shù)據(jù)類型。(2)reg類型數(shù)據(jù)的默認(rèn)初始值為不定值x。(3)reg型數(shù)據(jù)常用來表示“always”模塊內(nèi)的指定信號(hào),常代表觸發(fā)器。(4)在"always”塊內(nèi)被賦值的每一個(gè)信號(hào)都必須定義成reg型?!?.2數(shù)據(jù)類型及其常量和變量用來表示存儲(chǔ)單元,具有狀態(tài)保持作用,通過賦值語句可改變寄存器存儲(chǔ)單元的值。在Verilog中有許多結(jié)構(gòu)語句來控制何時(shí)或是否執(zhí)行這些賦值語句。這些控制構(gòu)造可用來描述硬件的觸發(fā)條件。如時(shí)鐘的上升沿,多路選擇器的選通信號(hào)。并不是說reg型信號(hào)一定是寄存器或觸發(fā)器的輸出,它只表示被定義的信號(hào)將用在“always”塊內(nèi)。

reg型數(shù)據(jù)的格式如下:

reg[n-1:0]數(shù)據(jù)名1,數(shù)據(jù)名2,……數(shù)據(jù)名i;或

reg[n:1]數(shù)據(jù)名1,數(shù)據(jù)名2,……數(shù)據(jù)名i;看下面的幾個(gè)例子:

reg

rega;//定義了一個(gè)1位的名為rega的reg型數(shù)據(jù)

reg[3:0]regb;//定義了一個(gè)4位的名為regb的reg型數(shù)據(jù)

reg[4:1]regc,regd

//定義了二個(gè)4位的名為regc和regd的reg型數(shù)據(jù)說明:

reg是reg型數(shù)據(jù)的確認(rèn)標(biāo)識(shí)符;[n-1:0]和[n:1]代表該數(shù)據(jù)的位寬,即該數(shù)據(jù)有幾位(bit);最后是數(shù)據(jù)的名稱。如果一次定義多個(gè)數(shù)據(jù),數(shù)據(jù)名之間用逗號(hào)隔開。聲明語句的最后要用分號(hào)表示語句結(jié)束?!?.2數(shù)據(jù)類型及其常量和變量說明

reg型數(shù)據(jù)的缺省初始值是不定值x。reg型數(shù)據(jù)可以賦正值,也可以賦負(fù)值。但當(dāng)一個(gè)reg型數(shù)據(jù)是一個(gè)表達(dá)式中的操作數(shù)時(shí),它的值被當(dāng)作是無符號(hào)值,即正值。

例如:當(dāng)一個(gè)4位的寄存器用做表達(dá)式中的操作數(shù)時(shí),如果開始寄存器被賦以值-1,則在表達(dá)式中進(jìn)行運(yùn)算時(shí),其值被認(rèn)為是+15。選擇正確的數(shù)據(jù)類型in1in2OABY輸入端口可以由wire/reg驅(qū)動(dòng),但輸入端口只能是wire輸出端口可以是wire/regr類型,輸出端口只能驅(qū)動(dòng)wier雙向端口輸入/輸出只能是wire類型信號(hào)類型確定方法總結(jié)如下:信號(hào)可以分為端口信號(hào)和內(nèi)部信號(hào)。出現(xiàn)在端口列表中的信號(hào)是端口信號(hào),其它的信號(hào)為內(nèi)部信號(hào)。對(duì)于端口信號(hào),輸入端口只能是wire類型。輸出端口可以是wire類型,也可以是reg類型。若輸出端口在過程塊中賦值則為reg類型;若在過程塊外賦值(包括實(shí)例化語句),則為wire類型。內(nèi)部信號(hào)類型與輸出端口相同,可以是wire或reg類型。判斷方法也與輸出端口相同。若在過程塊中賦值,則為reg類型;若在過程塊外賦值,則為wire類型。ABC選擇正確的數(shù)據(jù)類型moduletop;wirey;

rega,b;DUTu1(y,a,b);initialbegin a=0;b=0;#5a=1;endendmodulemoduleDUT(Y,A,B);outputY;inputA,B;wireY,A,B;anda1(Y,A,B);endmodule在過程塊中只能給reg類型賦值若Y,A,B說明為reg則會(huì)產(chǎn)生錯(cuò)誤。選擇數(shù)據(jù)類型時(shí)常犯的錯(cuò)誤舉例修改前:moduleexample(o1,o2,a,b,c,d);inputa,b,c,d;outputo1,o2;

regc,d;

rego2andu1(o2,c,d);always@(aorb)if(a)o1=b;elseo1=0;endmodule修改后:moduleexample(o1,o2,a,b,c,d);inputa,b,c,d;outputo1,o2;//regc,d;//rego2

rego1;

andu1(o2,c,d);always@(aorb)if(a)o1=b;elseo1=0;endmodule3.memory型說明:(1)memory型即存儲(chǔ)器類型;(2)VerilogHDL通過對(duì)reg型變量建立數(shù)組來對(duì)存儲(chǔ)器建模,可以描述RAM型存儲(chǔ)器,ROM存儲(chǔ)器和reg文件。(3)數(shù)組中的每一個(gè)單元通過一個(gè)數(shù)組索引進(jìn)行尋址。(4)在Verilog語言中沒有多維數(shù)組存在。memory型數(shù)據(jù)的格式如下:

reg[n-1:0]存儲(chǔ)器名[m-1:0];或

reg[n-1:0]存儲(chǔ)器名[m:1];說明:

reg[n-1:0]定義了存儲(chǔ)器中每一個(gè)存儲(chǔ)單元的大小,即該存儲(chǔ)單元是一個(gè)n位的寄存器,存儲(chǔ)器名后的[m-1:0]或[m:1]則定義了該存儲(chǔ)器中有多少個(gè)這樣的寄存器,最后用分號(hào)結(jié)束定義語句?!璵-100n-11……1m-2§3.2數(shù)據(jù)類型及其常量和變量另外,在同一個(gè)數(shù)據(jù)類型聲明語句里,可以同時(shí)定義存儲(chǔ)器型數(shù)據(jù)和reg型數(shù)據(jù)。見下例:

parameterwordsize=16,//定義兩個(gè)參數(shù)

memsize=256;

reg[wordsize-1:0]mem[memsize-1:0],writereg,readreg;下面舉例說明:

reg[7:0]mema[255:0];說明:這個(gè)例子定義了一個(gè)名為mema的存儲(chǔ)器,該存儲(chǔ)器有256個(gè)8位的存儲(chǔ)器。該存儲(chǔ)器的地址范圍是0到255。

注意:對(duì)存儲(chǔ)器進(jìn)行地址索引的表達(dá)式必須是整數(shù)表達(dá)式。Mem256*16bitRAMWritereg16bitreadreg16bit§3.2數(shù)據(jù)類型及其常量和變量說明:一個(gè)由n個(gè)1位寄存器構(gòu)成的存儲(chǔ)器組不同于一個(gè)n位的寄存器的。見下例:

reg[n-1:0]rega;

//一個(gè)n位的寄存器

reg

mema[n-1:0];//一個(gè)由n個(gè)1位寄存器構(gòu)成的存儲(chǔ)器組

一個(gè)n位的寄存器可以在一條賦值語句里進(jìn)行賦值,而一個(gè)完整的存儲(chǔ)器則不行。見下例:

rega=0;

//正確賦值語句

mema=0;

//錯(cuò)誤的賦值語句如果想對(duì)memory中的存儲(chǔ)單元進(jìn)行讀寫操作,必須指定該單元在存儲(chǔ)器中的地址。下面的寫法是正確的:

mema[3]=0;

//給memory中的第3個(gè)存儲(chǔ)單元賦值為0§3.2數(shù)據(jù)類型及其常量和變量modulemyrom(read_data,addr,read_en);inputread_en;input[3:0]addr;output[3:0]read_data;

reg[3:0]read_data;

reg[3:0]mem[0:15];

always@(addrorread_en)if(!read_en)

read_data=mem[addr];endmodulemodulemymem(data,addr,read,write);

inout[3:0]data;input[3:0]addr;inputread,write;

reg[3:0]mem[0:15];//16*4//讀

assigndata=read?mem[addr]:4'bz;//寫

always@(posedgewrite)

mem[addr]=data;endmodule

ROMRAM3.3運(yùn)算符及表達(dá)式按功能分類可分為算術(shù)運(yùn)算符(+,-,X,/,%)賦值運(yùn)算符(=,<=)關(guān)系運(yùn)算符(>,<,>=,<=)邏輯運(yùn)算符(&&,||,!)條件運(yùn)算符(?:)位運(yùn)算符(~,|,^,&,^~)移位運(yùn)算符(<<,>>)拼接運(yùn)算符({})§3.3運(yùn)算符及表達(dá)式按所帶操作數(shù)個(gè)數(shù)可分為單目運(yùn)算符雙目運(yùn)算符三目運(yùn)算符例:

clock=~clock;c=a|b;

r=s?T:u;§3.3運(yùn)算符及表達(dá)式3.3.1基本的算術(shù)運(yùn)算符在VerilogHDL語言中,算術(shù)運(yùn)算符又稱為二進(jìn)制運(yùn)算符,共有下面幾種:

(1)+(加法運(yùn)算符,或正值運(yùn)算符,如rega+regb,+3);

(2)-(減法運(yùn)算符,或負(fù)值運(yùn)算符,如rega-3,-3);

(3)*(乘法運(yùn)算符,如rega*3);

(4)/(除法運(yùn)算符,如5/3);

(5)%(模運(yùn)算符,或稱為求余運(yùn)算符,要求%兩側(cè)均為整型數(shù)據(jù)。如7%3的值為1)?!?.3運(yùn)算符及表達(dá)式規(guī)則:在進(jìn)行整數(shù)除法運(yùn)算時(shí),結(jié)果值要略去小數(shù)部分,只取整數(shù)部分;

7/4=1-7/4=-1

7/-4=-1模運(yùn)算表達(dá)式結(jié)果說明

10%31余數(shù)為111%32余數(shù)為212%30余數(shù)為0,即無余數(shù)

-10%3-1結(jié)果取第一個(gè)操作數(shù)的符號(hào)位,所以余數(shù)為-111%-32結(jié)果取第一個(gè)操作數(shù)的符號(hào)位,所以余數(shù)為2§3.3運(yùn)算符及表達(dá)式

1、進(jìn)行取模運(yùn)算時(shí),結(jié)果值的符號(hào)位采用模運(yùn)算式里第一個(gè)操作數(shù)的符號(hào)位。2、%兩側(cè)都應(yīng)為整數(shù)Verilog根據(jù)表達(dá)式中變量的長(zhǎng)度對(duì)表達(dá)式的值自動(dòng)地進(jìn)行調(diào)整。Verilog自動(dòng)截?cái)嗷驍U(kuò)展賦值語句中右邊的值以適應(yīng)左邊變量的長(zhǎng)度。當(dāng)一個(gè)負(fù)數(shù)賦值給無符號(hào)變量如reg時(shí),Verilog自動(dòng)完成二進(jìn)制補(bǔ)碼計(jì)算modulesign_size;

reg[3:0]a,b;

reg[15:0]c;initialbegina=-1;//a是無符號(hào)數(shù),因此其值為1111b=8;c=8;//b=c=1000#10b=b+a;//結(jié)果10111截?cái)?b=0111#10c=c+a;//c=10111endendmodule例

parameterfive=5;integerans,int;

reg[3:0]rega,regb;

reg[3:0]num;initialbegin

rega=3;

regb=4'b1010;

int=-3;//int=1111……1111_1101

endinitialfork#1ans=five*int;//ans=-15

#2ans=(int+5)/2;//ans=1

#3ans=five/int;//ans=-1

#4num=rega+regb;//num=1101

#5num=rega+1;//num=0100

#6num=int;//num=1101

#7num=regb%rega;//num=1join注意:在進(jìn)行算術(shù)運(yùn)算操作時(shí),如果某一個(gè)操作數(shù)有不確定的值x,則整個(gè)結(jié)果也為不定值x。'b10x1+'b01111結(jié)果為不確定數(shù)'bxxxxx3.3.2位運(yùn)算符

VerilogHDL作為一種硬件描述語言,是針對(duì)硬件電路而言的。在硬件電路中信號(hào)有4種狀態(tài)值,即1,0,x,z。VerilogHDL提供了以下5種位運(yùn)算符:

1)~

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論