




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
數(shù)字系統(tǒng)設(shè)計(jì)與VerilogHDL(第9版)數(shù)字系統(tǒng)設(shè)計(jì)與VerilogHDL(第9版)第6章
Verilog設(shè)計(jì)的層次與風(fēng)格6.1Verilog描述的層級(jí)和方式6.2Verilog門元件
6.3門級(jí)結(jié)構(gòu)描述6.4用戶自定義元件
6.5連續(xù)賦值
6.6數(shù)據(jù)流描述
6.7多層次結(jié)構(gòu)電路設(shè)計(jì)6.8generate生成語句
6.9三態(tài)邏輯設(shè)計(jì)6.1Verilog描述的層級(jí)和方式VerilogHDL常用的邏輯電路描述方式:結(jié)構(gòu)(structural)描述;行為(behavioural)描述;數(shù)據(jù)流(dataflow)描述。結(jié)構(gòu)描述調(diào)用電路元件(如子模塊,邏輯門,甚至晶體管)來構(gòu)建電路;行為描述側(cè)重于描述電路的行為特性來構(gòu)建電路;數(shù)據(jù)流描述主要用連續(xù)賦值語句、操作符和表達(dá)式表示電路,也可以采用上述方式的混合來描述電路。6.2Verilog門元件6.2.1門元件6.2Verilog門元件6.2.1門元件6.2.2門元件的例化門元件例化的格式門元件名<驅(qū)動(dòng)強(qiáng)度說明>#<門延時(shí)>例化名
(門端口列表)<驅(qū)動(dòng)強(qiáng)度說明>為可選項(xiàng),其格式為:(對(duì)1的驅(qū)動(dòng)強(qiáng)度,對(duì)0的驅(qū)動(dòng)強(qiáng)度),如果驅(qū)動(dòng)強(qiáng)度缺省,則默認(rèn)為(strong1,strong0)。<門延時(shí)>也是可選項(xiàng),當(dāng)沒有指定延時(shí),默認(rèn)延時(shí)為0。6.2.2門元件的例化1.多輸入門的例化多輸入門的端口列表可按下面的順序列出,(輸出,輸入1,輸入2,輸入3,...);例如:anda1(out,in1,in2,in3); //三輸入與門,其名字為a1anda2(out,in1,in2); //二輸入與門,其名字為a26.2.2門元件的例化2.多輸出門的例化buf和not兩種元件允許有多個(gè)輸出,但只能有一個(gè)輸入。多輸出門的端口列表按下面的順序列出。(輸出1,輸出2,...,輸入);例如:notg3(out1,out2,in); //1個(gè)輸入in,2個(gè)輸出out1,out2bufg4(out1,out2,out3,din);6.2.2門元件的例化3.三態(tài)門的例化對(duì)于三態(tài)門,按以下順序列出輸入、輸出端口。(輸出,輸入,使能控制端);例如:bufif1g1(out,in,enable); //高電平使能的三態(tài)門bufif0g2(out,a,ctrl); //低電平使能的三態(tài)門6.3門級(jí)結(jié)構(gòu)描述所謂結(jié)構(gòu)描述方式,是指通過調(diào)用庫中的元件或已設(shè)計(jì)好的模塊來完成設(shè)計(jì)實(shí)體功能的描述方式。門級(jí)結(jié)構(gòu)描述就是用VerilogHDL門元件例化實(shí)現(xiàn)電路功能。例6.1門元件例化實(shí)現(xiàn)的4選1MUXmodulemux4_1(inputin1,in2,in3,in4,s0,s1,outputout);wires0_n,s1_n,w,x,y,z;not(s0_n,s0),(s1_n,s1);and(w,in1,s0_n,s1_n),(x,in2,s0_n,s1),(y,in3,s0,s1_n),(z,in4,s0,s1);or(out,w,x,y,z);endmodule6.3門級(jí)結(jié)構(gòu)描述例6.2門元件例化實(shí)現(xiàn)1位全加器modulefull_add(//門元件例化inputa,b,cin,outputsum,cout);wires1,m1,m2,m3;and(m1,a,b),(m2,b,cin),(m3,a,cin);xor(sum,a,b,cin);or(cout,m1,m2,m3);endmodule6.3門級(jí)結(jié)構(gòu)描述6.4用戶自定義元件利用UDP(User-definedPrimitives),用戶可以自定義元件模型并建立相應(yīng)的原語庫。UDP元件可分為兩種:
組合邏輯UDP;時(shí)序邏輯UDP:又包括電平敏感型UDP和邊沿敏感型UDP。UDP元件只能有一個(gè)輸出,其取值只能為0、1或x,不支持高阻態(tài)z。6.4.1組合邏輯UDP元件例6.42選1數(shù)據(jù)選擇器的組合UDP元件primitivemultiplexer(mux,cntrl,dataA,dataB);outputmux;inputcntrl,dataA,dataB;table//cntrldataAdataBmux010:1;011:1;01x:1;000:0;001:0;00x:0;101:1;111:1;1x1:1;100:0;110:0;1x0:0;x00:0;x11:1;endtableendprimitive例6.5用符號(hào)“?”表述的2選1數(shù)據(jù)選擇器UDP元件。primitivemultiplexer(mux,cntrl,dataA,dataB);outputmux;inputcntrl,dataA,dataB;table//cntrldataAdataBmux01?:1; //?表示0,1,x00?:0;1?1:1;1?0:0;x00:0;x11:1;endtableendprimitive6.4.2時(shí)序邏輯UDP元件例6.6電平敏感的1位數(shù)據(jù)鎖存器UDP元件。primitivelatch(q,clk,data);outputq;regq;inputclk,data;table//clkdataqq+01:?:1;00:?:0;1?:?:-; //clk=1時(shí),鎖存器的輸出保持原值,用符號(hào)“-”表示endtableendprimitive例6.7上升沿觸發(fā)的D觸發(fā)器的UDP元件。primitived_edge_ff(q,clk,data);outputq;regq;inputclk,data;table//clkdataqq+(01)0:?:0; //時(shí)鐘上升沿到來,輸出值更新(01)1:?:1;(0?)1:1:1;(0?)0:0:0;(?0)?:?:-; //時(shí)鐘下降沿,輸出q保持原值?(??):?:-; //時(shí)鐘不變,輸出也不變endtableendprimitive
6.5連續(xù)賦值賦值是將值賦給net型和variable型變量的操作,有兩種基本的賦值操作:
連續(xù)賦值(continuousassignment):用于對(duì)net型變量賦值;過程賦值(proceduralassignment):用于對(duì)variable型變量賦值。連續(xù)賦值語句是VerilogHDL數(shù)據(jù)流建模的核心語句,主要用于對(duì)net型變量(包括標(biāo)量和向量)進(jìn)行賦值,其格式如下。
assignLHS_net=RHS_expression;
示例:wirecout,a,b;assigncout=a&b;6.5.1連續(xù)賦值VerilogHDL還提供了另一種對(duì)net型變量賦值的方法,即在net型變量聲明時(shí)同時(shí)對(duì)其賦值。如下面的賦值方式等效于上面例子中對(duì)cout的賦值語句,兩者效果相同。wirea,b;wirecout=a&b;//等效于assigncout=a&b;6.5.2net變量聲明時(shí)賦值例6.12用連續(xù)賦值方式定義的4位帶進(jìn)位加法器moduleadder4(inputwire[3:0]ina,inb,inputwirecin,outputwire[3:0]sum,outputwirecout);assign{cout,sum}=ina+inb+cin;endmodule6.6數(shù)據(jù)流描述用數(shù)據(jù)流描述方式描述電路與用傳統(tǒng)的邏輯表達(dá)式表示電路類似。設(shè)計(jì)中只要有了布爾代數(shù)表達(dá)式,就很容易將它用數(shù)據(jù)流的方式表達(dá)出來,表達(dá)方法是用VerilogHDL中的邏輯操作符置換布爾運(yùn)算符。例6.15半加器的數(shù)據(jù)流描述modulehalf_add( //數(shù)據(jù)流描述inputa,b,outputso,co);assignso=a^b,co=a&b;endmodule6.6.1
數(shù)據(jù)流描述加法器例6.15半加器的數(shù)據(jù)流描述modulehalf_add( //數(shù)據(jù)流描述inputa,b,outputso,co);assignso=a^b,co=a&b;endmodule6.6.1
數(shù)據(jù)流描述加法器例6.16用數(shù)據(jù)流描述實(shí)現(xiàn)1位全加器modulefull_add(inputa,b,cin,outputsum,cout);assignsum=a^b^cin, //數(shù)據(jù)流描述cout=(a&b)|(b&cin)|(cin&a);endmodule6.6.1
數(shù)據(jù)流描述加法器例6.17用數(shù)據(jù)流描述實(shí)現(xiàn)4位二進(jìn)制加法器moduleadd4#(parameterMSB=4) //用參數(shù)定義位寬(input[MSB-1:0]a,b,inputcin,output[MSB-1:0]sum,outputcout);assign{cout,sum}=a+b+cin; //數(shù)據(jù)流描述endmodule6.6.1
數(shù)據(jù)流描述加法器6.6.2數(shù)據(jù)流描述減法器例6.20半減器的數(shù)據(jù)流描述modulehalf_sub(inputa,b,outputd,co);assignd=a^b,co=(~a)&b;endmoduleendmodule例6.21用數(shù)據(jù)流描述的全減器modulefull_sub(inputa,b,inputcin, //低位借位outputd,co);assignd=a^b^cin,co=(~a&(b^cin))|(b&cin);endmodule例6.258位有符號(hào)數(shù)減法運(yùn)算(被減數(shù)、減數(shù)和結(jié)果均用補(bǔ)碼表示)modulesub8_sign#(parameterMSB=8)(inputsigned[MSB-1:0]x, //帶符號(hào)被減數(shù)inputsigned[MSB-1:0]y, //帶符號(hào)減數(shù)outputsigned[MSB-1:0]d); //結(jié)果wiresigned[MSB-1:0]temp_y;assigntemp_y=~y+1'b1;assignd=x+temp_y; //用加法器實(shí)現(xiàn)減法器endmodule例6.268位有符號(hào)數(shù)減法器的測(cè)試代碼`timescale1ns/1nsmodulesub8_sign_tb();parameterDELY=20;parameterN=8;regsigned[N-1:0]x,y;wiresigned[N-1:0]d;sub8_sign#(.MSB(N))i1(.x(x),.y(y),.d(d));initialbeginx=-8'sd49;y=8'sd55;#DELY x=8'sd107;#DELY y=8'sd112;#DELY x=-8'sd72;#DELY y=-8'sd99;repeat(4)begin#DELYx<=$random%127; //x為-127~127之間的一個(gè)隨機(jī)數(shù)y<=$random%127;end#DELY $stop;$display("Runningtestbench");endendmodule8位有符號(hào)數(shù)減法器的測(cè)試波形圖6.6.2數(shù)據(jù)流描述減法器例6.20半減器的數(shù)據(jù)流描述modulehalf_sub(inputa,b,outputd,co);assignd=a^b,co=(~a)&b;endmoduleendmodule6.6.3數(shù)據(jù)流描述觸發(fā)器例6.27數(shù)據(jù)流描述SR鎖存器modulesr_latch(inputs,r,outputq,qn);assignq=~(s&qn),qn=~(r&q);endmodule例6.28電平觸發(fā)的D觸發(fā)器(D鎖存器)`timescale1ns/1nsmoduled_latch(inputd,cp,outputq,qn);wirey1,y2,y3,y4;assigny1=~(d&cp),y2=~(cp&~d),y3=~(y1&y4),y4=~(y2&y3);assign#3q=y3,qn=y4;//#3表示與非門傳輸延時(shí)為2個(gè)單位時(shí)間(ns)endmodule例6.32二進(jìn)制碼轉(zhuǎn)格雷碼modulebin2gray#(parameterWIDTH=8) //數(shù)據(jù)位寬(input[WIDTH-1:0]bin, //二進(jìn)制碼output[WIDTH-1:0]gray); //格雷碼assigngray=bin^(bin>>1);endmodule6.6.4格雷碼與二進(jìn)制碼相互轉(zhuǎn)換例6.33格雷碼轉(zhuǎn)二進(jìn)制碼modulegray2bin#(parameterWIDTH=8) //數(shù)據(jù)位寬(input[WIDTH-1:0]gray, //格雷碼output[WIDTH-1:0]bin); //二進(jìn)制碼assignbin[WIDTH-1]=gray[WIDTH-1]; //最高位不需轉(zhuǎn)換genvari;generatefor(i=0;i<=WIDTH-2;i=i+1)begin:g2b //命名塊assignbin[i]=bin[i+1]^gray[i];endendgenerateendmodule6.6.4格雷碼與二進(jìn)制碼相互轉(zhuǎn)換VerilogHDL通過模塊例化支持層次化的設(shè)計(jì),高層模塊可以例化下層模塊,并通過輸入、輸出和雙向端口互通信息。6.7多層次結(jié)構(gòu)電路設(shè)計(jì)例6.348位加法器的源代碼moduleadd8#(parameterMSB=8,LSB=0)(input[MSB-1:LSB]a,b,inputcin,output[MSB-1:LSB]sum,outputcout);assign{cout,sum}=a+b+cin;endmodule6.7.1帶參數(shù)模塊例化例6.358位寄存器的源代碼modulereg8#(parameterSIZE=8)(inputclk,clear,input[SIZE-1:0]in,outputreg[SIZE-1:0]qout);always@(posedgeclk,posedgeclear)beginif(clear)qout<=0; //異步清0elseqout<=in;endendmodule6.7.1帶參數(shù)模塊例化例6.36累加器頂層連接描述moduleacc#(parameterWIDTH=8)(input[WIDTH-1:0]accin,inputcin,clk,clear,output[WIDTH-1:0]accout,outputcout);wire[WIDTH-1:0]sum;add8u1(.cin(cin),.a(accin),.b(accout),.cout(cout),.sum(sum));//例化add8子模塊,端口名關(guān)聯(lián)reg8u2(.qout(accout),.clear(clear),.in(sum),.clk(clk));//例化reg8子模塊,端口名關(guān)聯(lián)endmodule6.7.1帶參數(shù)模塊例化例6.38用參數(shù)名進(jìn)行參數(shù)傳遞方式moduleacc16w#(parameterWIDTH=16)(input[WIDTH-1:0]accin,inputcin,clk,clear,output[WIDTH-1:0]accout,outputcout);wire[WIDTH-1:0]sum;add8#(.MSB(WIDTH),.LSB(0))//用參數(shù)名進(jìn)行參數(shù)傳遞方式u1(.cin(cin),.a(accin),.b(accout),.cout(cout),.sum(sum));reg8#(.SIZE(WIDTH)) //用參數(shù)名進(jìn)行參數(shù)傳遞方式u2(.qout(accout),.clear(clear),.in(sum),.clk(clk));endmodule6.7.2用parameter進(jìn)行參數(shù)傳遞用參數(shù)名進(jìn)行參數(shù)傳遞generate是Verilog-2001中新增的語句,generate語句一般和循環(huán)語句(for)、條件語句(if,case)一起使用。為此,Verilog-2001增加了4個(gè)關(guān)鍵字generate、endgenerate、genvar和localparam。genvar是一個(gè)新的數(shù)據(jù)類型,用在generate循環(huán)中的索引變量(控制變量)必須定義為genvar數(shù)據(jù)類型。6.8generate生成語句generate語句和for循環(huán)語句一起使用,generate循環(huán)可以產(chǎn)生一個(gè)對(duì)象(如module、primitive,或者variable、net、task、function、assign、initial和always)的多個(gè)例化,為可變尺度的設(shè)計(jì)提供便利。generate、for生成語句例6.40用generate語句描述的4位行波進(jìn)位加法器的示例moduleadd_ripple#(parameterSIZE=4)(input[SIZE-1:0]a
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 多音字課件教學(xué)課件
- 2025年哈爾濱市道里區(qū)愛建社區(qū)衛(wèi)生服務(wù)中心招聘5人模擬試卷及完整答案詳解1套
- 汽車故障常識(shí)題庫及答案
- 給水工程遠(yuǎn)程監(jiān)控系統(tǒng)方案
- 機(jī)器人智能制造產(chǎn)業(yè)園項(xiàng)目施工方案
- 消防設(shè)施系統(tǒng)集成與優(yōu)化設(shè)計(jì)方案
- 30萬千瓦工業(yè)園綠色供電項(xiàng)目建筑工程方案
- 2025年化學(xué)技工考試試題及答案
- 熱力項(xiàng)目后期維護(hù)方案
- 2025年文員專業(yè)知識(shí)試題及答案
- 奶茶產(chǎn)品研發(fā)培訓(xùn)課件
- 筋膜理論培訓(xùn)課件
- 雙十一家具公司活動(dòng)方案
- 內(nèi)部控制活動(dòng)方案
- 腰椎病護(hù)理疑難病例討論講課件
- 臺(tái)球桿轉(zhuǎn)讓協(xié)議書
- DB65T 4766-2024公路波紋鋼橋涵設(shè)計(jì)規(guī)范
- 《房產(chǎn)市場(chǎng)動(dòng)態(tài)》課件
- 【大學(xué)課件】病毒性腦炎
- 園藝學(xué)概論課程練習(xí)題及答案全套
- 《淡水生態(tài)系統(tǒng)之謎》課件
評(píng)論
0/150
提交評(píng)論