verilog實(shí)例代碼_第1頁(yè)
verilog實(shí)例代碼_第2頁(yè)
verilog實(shí)例代碼_第3頁(yè)
verilog實(shí)例代碼_第4頁(yè)
verilog實(shí)例代碼_第5頁(yè)
已閱讀5頁(yè),還剩25頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、/與門module zxhand2(c,a,b); input a,b; output c; assign c= a & b; endmodule/或門module zxhor2(c,a,b); input a,b; output c; assign c= a | b; endmodule/非門module zxhnot2(c,b); input b; output c; assign c= b; endmodule/異或門module zxhxro2(c,a,b); input b; output c; assign c=a b; endmodule兩選一電路module data_

2、scan(d0,d1,sel,q);output q;input d0,d1,sel;wire t1,t2,t3;n1 zxhand2(t1,d0,sel);n2 zxhnot2 (t4,sel);n3 zxhand2(t2,d1,t4);n4 zxhor2(t3,t1,t2);assign q=t1; endmodule verilog HDL實(shí)例(一) 練習(xí)一簡(jiǎn)單的組合邏輯設(shè)計(jì) 目的: 掌握基本組合邏輯電路的實(shí)現(xiàn)方法。    這是一個(gè)可綜合的數(shù)據(jù)比較器,很容易看出它的功能是比較數(shù)據(jù)a與數(shù)據(jù)b,如果兩個(gè)數(shù)據(jù)相同,則給出結(jié)果1,否則給出結(jié)果0。在Verilog H

3、DL中,描述組合邏輯時(shí)常使用assign結(jié)構(gòu)。注意equal=(a=b)?1:0,這是一種在組合邏輯實(shí)現(xiàn)分支判斷時(shí)常使用的格式。    模塊源代碼:    /- compare.v -    module compare(equal,a,b);    input a,b;    output equal;    assign equal=(a=b)?1:0; /a等于b時(shí),equal輸出為1;a不等于b時(shí), 

4、;                                      /equal輸出為0。    endmodule    測(cè)試模塊用于檢測(cè)模塊設(shè)計(jì)得正確與否,

5、它給出模塊的輸入信號(hào),觀察模塊的內(nèi)部信號(hào)和輸出信號(hào),如果發(fā)現(xiàn)結(jié)果與預(yù)期的有所偏差,則要對(duì)設(shè)計(jì)模塊進(jìn)行修改。    測(cè)試模塊源代碼:    timescale 1ns/1ns /定義時(shí)間單位。     module comparetest;    reg a,b;    wire equal;    initial /initial常用于仿真時(shí)信號(hào)的給出。    begin a=

6、0;            b=0;    #100 a=0;            b=1;    #100 a=1;            b=1;    #100 a=1;&

7、#160;           b=0;    #100 $stop; /系統(tǒng)任務(wù),暫停仿真以便觀察仿真波形。    end    compare compare1(.equal(equal),.a(a),.b(b); /調(diào)用模塊。Endmodule 【例3.1】4 位全加器module adder4(cout,sum,ina,inb,cin);output3:0 sum;output cout;input

8、3:0 ina,inb;input cin;assign cout,sum=ina+inb+cin;endmodule【例3.2】4 位計(jì)數(shù)器module count4(out,reset,clk);output3:0 out;input reset,clk;reg3:0 out;always (posedge clk)beginif (reset) out<=0; /同步復(fù)位else out<=out+1; /計(jì)數(shù)endendmodule【例5.11】模為60 的BCD 碼加法計(jì)數(shù)器module count60(qout,cout,data,load,cin,reset,clk)

9、;output7:0 qout;output cout;input7:0 data;input load,cin,clk,reset;reg7:0 qout;always (posedge clk) /clk 上升沿時(shí)刻計(jì)數(shù)beginif (reset) qout<=0; /同步復(fù)位else if(load) qout<=data; /同步置數(shù)else if(cin)beginif(qout3:0=9) /低位是否為9,是則beginqout3:0<=0; /回0,并判斷高位是否為5if (qout7:4=5) qout7:4<=0;elseqout7:4<=qo

10、ut7:4+1; /高位不為5,則加1endelse /低位不為9,則加1qout3:0<=qout3:0+1;endendassign cout=(qout=8'h59)&cin)?1:0; /產(chǎn)生進(jìn)位輸出信號(hào)endmodule【例9.10】奇偶校驗(yàn)位產(chǎn)生器module parity(even_bit,odd_bit,input_bus);output even_bit,odd_bit;input7:0 input_bus;assign odd_bit = input_bus; /產(chǎn)生奇校驗(yàn)位assign even_bit = odd_bit; /產(chǎn)生偶校驗(yàn)位endmo

11、dule· Verilog HDL實(shí)例(二) 練習(xí)二. 簡(jiǎn)單時(shí)序邏輯電路的設(shè)計(jì) 目的:掌握基本時(shí)序邏輯電路的實(shí)現(xiàn)。    在Verilog HDL中,相對(duì)于組合邏輯電路,時(shí)序邏輯電路也有規(guī)定的表述方式。在可綜合的Verilog HDL模型,我們通常使用always塊和 (posedge clk)(上升沿)或 (negedge clk)(下降沿)的結(jié)構(gòu)來(lái)表述時(shí)序邏輯。下面是一個(gè)1/2分頻器的可綜合模型。 / half_clk.v:module half_clk(reset,clk_in,clk_out);input clk_in,reset;ou

12、tput clk_out;reg clk_out;always (posedge clk_in)  begin    if(!reset)  clk_out=0;    else      clk_out=clk_out;  endendmodule在always塊中,被賦值的信號(hào)都必須定義為reg型,這是由時(shí)序邏輯電路的特點(diǎn)所決定的。對(duì)于reg型數(shù)據(jù),如果未對(duì)它進(jìn)行賦值,仿真工具會(huì)認(rèn)為它是不定態(tài)。為了能正確地觀察到仿真結(jié)果,在可綜合風(fēng)格的模塊中我們通常定

13、義一個(gè)復(fù)位信號(hào)reset,當(dāng)reset為低電平時(shí),對(duì)電路中的寄存器進(jìn)行復(fù)位。測(cè)試模塊的源代碼:/-  clk_Top.v -timescale 1ns/100psdefine clk_cycle 50module clk_Top.v;reg clk,reset;wire clk_out;always  #clk_cycle  clk = clk;initial  begin     clk = 0;     reset = 1;    #100

14、reset = 0;    #100 reset = 1;    #10000 $stop;  endhalf_clk half_clk(.reset(reset),.clk_in(clk),.clk_out(clk_out);endmodule · Verilog HDL實(shí)例(三) 練習(xí)三. 利用條件語(yǔ)句實(shí)現(xiàn)較復(fù)雜的時(shí)序邏輯電路 目的:掌握條件語(yǔ)句在Verilog HDL中的使用。與常用的高級(jí)程序語(yǔ)言一樣,為了描述較為復(fù)雜的時(shí)序關(guān)系,Verilog HDL提供了條件語(yǔ)句供分支判斷時(shí)使用。在可綜合風(fēng)格的Verilo

15、g HDL模型中常用的條件語(yǔ)句有ifelse和caseendcase兩種結(jié)構(gòu),用法和C程序語(yǔ)言中類似。兩者相較,ifelse用于不很復(fù)雜的分支關(guān)系,實(shí)際編寫可綜合風(fēng)格的模塊、特別是用狀態(tài)機(jī)構(gòu)成的模塊時(shí),更常用的是caseendcase風(fēng)格的代碼。這一節(jié)我們給的是有關(guān)ifelse的范例,有關(guān)caseendcase結(jié)構(gòu)的代碼已后會(huì)經(jīng)常用到。下面給出的范例也是一個(gè)可綜合風(fēng)格的分頻器,是將10M的時(shí)鐘分頻為500K的時(shí)鐘?;驹砼c1/2分頻器是一樣的,但是需要定義一個(gè)計(jì)數(shù)器,以便準(zhǔn)確獲得1/20分頻模塊源代碼:/ - fdivision.v -module fdivision(reset,f10m,

16、f500k);input f10m,reset;output f500k;reg f500k;reg 7:0j; always (posedge f10m) if(!RESET) /低電平復(fù)位。 begin f500k <= 0; j <= 0; end else begin if(j=19) /對(duì)計(jì)數(shù)器進(jìn)行判斷,以確定F500K信號(hào)是否反轉(zhuǎn)。 begin j <= 0; f500k <= f500k; end else j <= j+1; endendmodule測(cè)試模塊源代碼:/-  fdivision_Top.v -timescale 1ns/10

17、0psdefine clk_cycle 50module division_Top;reg f10m=0,reset;wire f500k;always #clk_cycle f10m = f10m; initial begin reset=1;#100 reset=0;#100 reset=1;#10000 $stop; endfdivision fdivision (.reset(reset),.f10m(f10m),.f500k(f500k);endmodule · Verilog HDL實(shí)例(四)練習(xí)四. 設(shè)計(jì)時(shí)序邏輯時(shí)采用阻塞賦值與非阻塞賦值的區(qū)別 目的:1.明確

18、掌握阻塞賦值與非阻塞賦值的概念和區(qū)別;      2.了解阻塞賦值的使用情況。阻塞賦值與非阻塞賦值,在教材中我們已經(jīng)了解了它們之間在語(yǔ)法上的區(qū)別以及綜合后所得到的電路結(jié)構(gòu)上的區(qū)別。在always塊中,阻塞賦值可以理解為賦值語(yǔ)句是順序執(zhí)行的,而非阻塞賦值可以理解為賦值語(yǔ)句是并發(fā)執(zhí)行的。實(shí)際的時(shí)序邏輯設(shè)計(jì)中,一般的情況下非阻塞賦值語(yǔ)句被更多地使用,有時(shí)為了在同一周期實(shí)現(xiàn)相互關(guān)聯(lián)的操作,也使用了阻塞賦值語(yǔ)句。(注意:在實(shí)現(xiàn)組合邏輯的assign結(jié)構(gòu)中,無(wú)一例外地都必須采用阻塞賦值語(yǔ)句。下例通過(guò)分別采用阻塞賦值語(yǔ)句和非阻塞賦值語(yǔ)句的兩個(gè)看上去非常相似的

19、兩個(gè)模塊blocking.v和non_blocking.v來(lái)闡明兩者之間的區(qū)別。模塊源代碼:/ -   blocking.v -module blocking(clk,a,b,c);  output 3:0 b,c;  input  3:0 a;  input        clk;  reg    3:0 b,c;  always (posedge clk)   begin  

20、;  b = a;    c = b;     end endmodule /-  non_blocking.v -module non_blocking(clk,a,b,c);  output 3:0 b,c;  input  3:0 a;  input        clk;  reg    3:0 b,c;  always (pos

21、edge clk)  begin    b <= a;    c <= b;     endendmodule測(cè)試模塊源代碼:/-  compareTop.v - timescale 1ns/100psinclude "./blocking.v"include "./non_blocking.v"module compareTop;  wire 3:0 b1,c1,b2,c2;  reg

22、0; 3:0 a;  reg        clk;   initial  begin    clk = 0;    forever #50 clk = clk;  end  initial  begin    a = 4'h3;    $display("_");    # 10

23、0 a = 4'h7;    $display("_");    # 100 a = 4'hf;    $display("_");    # 100 a = 4'ha;    $display("_");    # 100 a = 4'h2;    $display("_")

24、;    # 100  $display("_");    $stop;  end  non_blocking  non_blocking(clk,a,b2,c2);  blocking      blocking(clk,a,b1,c1);endmodule Verilog HDL實(shí)例(五) 練習(xí)五. 用always塊實(shí)現(xiàn)較復(fù)雜的組合邏輯電路 目的: 1.掌握用always實(shí)現(xiàn)組合邏輯電路的方法; 

25、60;    2.了解assign與always兩種組合邏輯電路實(shí)現(xiàn)方法之間的區(qū)別。    僅使用assign結(jié)構(gòu)來(lái)實(shí)現(xiàn)組合邏輯電路,在設(shè)計(jì)中會(huì)發(fā)現(xiàn)很多地方會(huì)顯得冗長(zhǎng)且效率低下。而適當(dāng)?shù)夭捎胊lways來(lái)設(shè)計(jì)組合邏輯,往往會(huì)更具實(shí)效。已進(jìn)行的范例和練習(xí)中,我們僅在實(shí)現(xiàn)時(shí)序邏輯電路時(shí)使用always塊。從現(xiàn)在開始,我們對(duì)它的看法要稍稍改變。下面是一個(gè)簡(jiǎn)單的指令譯碼電路的設(shè)計(jì)示例。該電路通過(guò)對(duì)指令的判斷,對(duì)輸入數(shù)據(jù)執(zhí)行相應(yīng)的操作,包括加、減、與、或和求反,并且無(wú)論是指令作用的數(shù)據(jù)還是指令本身發(fā)生變化,結(jié)果都要作出及時(shí)的反應(yīng)。顯然,這是一個(gè)

26、較為復(fù)雜的組合邏輯電路,如果采用assign語(yǔ)句,表達(dá)起來(lái)非常復(fù)雜。示例中使用了電平敏感的always塊,所謂電平敏感的觸發(fā)條件是指在后的括號(hào)內(nèi)電平列表中的任何一個(gè)電平發(fā)生變化,(與時(shí)序邏輯不同,它在后的括號(hào)內(nèi)沒(méi)有沿敏感關(guān)鍵詞,如posedge 或negedge)就能觸發(fā)always塊的動(dòng)作,并且運(yùn)用了case結(jié)構(gòu)來(lái)進(jìn)行分支判斷,不但設(shè)計(jì)思想得到直觀的體現(xiàn),而且代碼看起來(lái)非常整齊、便于理解。/-  alu.v -define plus    3'd0define minus   3'd1define band 

27、;   3'd2define bor     3'd3define unegate 3'd4module  alu(out,opcode,a,b);output7:0 out;reg7:0    out;input2:0 opcode;input7:0 a,b;              /操作數(shù)。always(opcode or a or b

28、)    /電平敏感的always塊begin      case(opcode)          plus:  out = a+b;   /加操作。          minus: out = a-b;  /減操作。      

29、0;   band:  out = a&b;   /求與。          bor:   out = a|b;   /求或。          unegate:  out=a; /求反。          default

30、:   out=8'hx;/未收到指令時(shí),輸出任意態(tài)。      endcaseend endmodule    同一組合邏輯電路分別用always塊和連續(xù)賦值語(yǔ)句assign描述時(shí),代碼的形式大相徑庭,但是在always中適當(dāng)運(yùn)用default(在case結(jié)構(gòu)中)和else(在ifelse結(jié)構(gòu)中),通常可以綜合為純組合邏輯,盡管被賦值的變量一定要定義為reg型。不過(guò),如果不使用default或else對(duì)缺省項(xiàng)進(jìn)行說(shuō)明,則易生成意想不到的鎖存器,這一點(diǎn)一定要加以注意。指令譯碼器的測(cè)試模塊

31、源代碼:/- alu_Top.v -timescale 1ns/1nsmodule    alutest;   wire7:0 out;   reg7:0  a,b;   reg2:0  opcode;   parameter   times=5;   initial    begin           a

32、=$random%256;  /Give a radom number blongs to 0,255 .        b=$random%256;  /Give a radom number blongs to 0,255.        opcode=3'h0;        repeat(times)    &#

33、160;     begin          #100     a=$random%256;  /Give a radom number.                   b=$random%256;  /Give a ra

34、dom number.                   opcode=opcode+1;          end        #100  $stop;   end     

35、         alu    alu1(out,opcode,a,b);endmodule  Verilog HDL實(shí)例(六) 練習(xí)六. 在Verilog HDL中使用函數(shù) 目的:掌握函數(shù)在模塊設(shè)計(jì)中的使用。與一般的程序設(shè)計(jì)語(yǔ)言一樣,Veirlog HDL也可使用函數(shù)以適應(yīng)對(duì)不同變量采取同一運(yùn)算的操作。Veirlog HDL函數(shù)在綜合時(shí)被理解成具有獨(dú)立運(yùn)算功能的電路,每調(diào)用一次函數(shù)相當(dāng)于改變這部分電路的輸入以得到相應(yīng)的計(jì)算結(jié)果。下例是函數(shù)調(diào)用的一個(gè)簡(jiǎn)單示范,采用同步時(shí)鐘觸發(fā)運(yùn)算的執(zhí)行

36、,每個(gè)clk時(shí)鐘周期都會(huì)執(zhí)行一次運(yùn)算。并且在測(cè)試模塊中,通過(guò)調(diào)用系統(tǒng)任務(wù)$display在時(shí)鐘的下降沿顯示每次計(jì)算的結(jié)果。模塊源代碼:module tryfunct(clk,n,result,reset); output31:0 result; input3:0 n; input reset,clk; reg31:0 result; always (posedge clk) /clk的上沿觸發(fā)同步運(yùn)算。begin if(!reset) /reset為低時(shí)復(fù)位。 result<=0; else begin result <= factorial(n); end end functio

37、n 31:0 factorial; /函數(shù)定義。 input 3:0 operand; reg 3:0 index; begin factorial = 1; for(index = 1; index <= operand; index = index + 1) factorial = index * factorial; end endfunctionendmodule測(cè)試模塊源代碼:timescale 1ns/100psmodule tryfuctTop;reg3:0 n,i;reg reset,clk;wire31:0 result;initial begin n=0; reset

38、=1; clk=0; #10 reset=0; #10 reset=1; for(i=0;i<=15;i=i+1) begin #20 n=i; end #10 $stop; endalways #5 clk=clk; tryfunct tryfunct(.clk(clk),.n(n),.result(result),.reset(reset);endmodule    上例中函數(shù)factorial(n)實(shí)際上就是階乘運(yùn)算。必須提醒大家注意的是,在實(shí)際的設(shè)計(jì)中,我們不希望設(shè)計(jì)中的運(yùn)算過(guò)于復(fù)雜,以免在綜合后帶來(lái)不可預(yù)測(cè)的后果。經(jīng)常的情況是,我們把復(fù)雜的運(yùn)算分成

39、幾個(gè)步驟,分別在不同的時(shí)鐘周期完成。  Verilog HDL實(shí)例(七) 練習(xí)七. 在Verilog HDL中使用任務(wù)(task) 目的:掌握任務(wù)在結(jié)構(gòu)化Verilog HDL設(shè)計(jì)中的應(yīng)用。僅有函數(shù)并不能完全滿足Veirlog HDL中的運(yùn)算需求。當(dāng)我們希望能夠?qū)⒁恍┬盘?hào)進(jìn)行運(yùn)算并輸出多個(gè)結(jié)果時(shí),采用函數(shù)結(jié)構(gòu)就顯得非常不方便,而任務(wù)結(jié)構(gòu)在這方面的優(yōu)勢(shì)則十分突出。任務(wù)本身并不返回計(jì)算值,但是它通過(guò)類似C語(yǔ)言中形參與實(shí)參的數(shù)據(jù)交換,非??旖莸貙?shí)現(xiàn)運(yùn)算結(jié)果的調(diào)用。此外,我們還常常利用任務(wù)來(lái)幫助我們實(shí)現(xiàn)結(jié)構(gòu)化的模塊設(shè)計(jì),將批量的操作以任務(wù)的形式獨(dú)立出來(lái),這樣設(shè)計(jì)的目的通常一眼看過(guò)去就很明了。

40、下面是一個(gè)利用task和電平敏感的always塊設(shè)計(jì)比較后重組信號(hào)的組合邏輯的實(shí)例。可以看到,利用task非常方便地實(shí)現(xiàn)了數(shù)據(jù)之間的交換,如果要用函數(shù)實(shí)現(xiàn)相同的功能是非常復(fù)雜的;另外,task也避免了直接用一般語(yǔ)句來(lái)描述所引起的不易理解和綜合時(shí)產(chǎn)生冗余邏輯等問(wèn)題。模塊源代碼:/- sort4.v -module ss(ra,rb,rc,rd,a,b,c,d); output3:0 ra,rb,rc,rd; input3:0 a,b,c,d; reg3:0 ra,rb,rc,rd; reg3:0 va,vb,vc,vd; always (a or b or c or d) begin va,vb

41、,vc,vd=a,b,c,d; sort2(va,vc); /va 與vc互換。 sort2(vb,vd); /vb 與vd互換。 sort2(va,vb); /va 與vb互換。 sort2(vc,vd); /vc 與vd互換。 sort2(vb,vc); /vb 與vc互換。 ra,rb,rc,rd=va,vb,vc,vd; end task sort2; inout3:0 x,y; reg3:0 tmp; if(x>y) begin tmp=x; /x與y變量的內(nèi)容互換,要求順序執(zhí)行,所以采用阻塞賦值方式。 x=y; y=tmp; end endtaskendmodule值得注意的

42、是task中的變量定義與模塊中的變量定義不盡相同,它們并不受輸入輸出類型的限制。如此例,x與y對(duì)于task sort2來(lái)說(shuō)雖然是inout型,但實(shí)際上它們對(duì)應(yīng)的是always塊中變量,都是reg型變量。測(cè)試模塊源代碼:· timescale 1ns/100ps· module task_Top;· reg3:0 a,b,c,d;· wire3:0 ra,rb,rc,rd;· ss my (.a(a),.b(b),.c(c),.d(d), .ra(ra),.rb(rb),.rc(rc),.rd(rd);· initial· b

43、egin· a=0;b=0;c=0;d=0;· · #100 a =$random%15;· b =$random%15; · c =$random%15;· d =$random%15;· #100 $stop;· end·· endmodule  【例3.5】“與-或-非”門電路module AOI(A,B,C,D,F); /模塊名為AOI(端口列表A,B,C,D,F(xiàn))input A,B,C,D; /模塊的輸入端口為A,B,C,Doutput F; /模塊的輸出端口為Fwire A

44、,B,C,D,F; /定義信號(hào)的數(shù)據(jù)類型assign F= (A&B)|(C&D); /邏輯功能描述endmodule【例5.2】同步置數(shù)、同步清零的計(jì)數(shù)器module count(out,data,load,reset,clk);output7:0 out;input7:0 data;input load,clk,reset;reg7:0 out;always (posedge clk) /clk 上升沿觸發(fā)beginif (!reset) out = 8'h00; /同步清0,低電平有效else if (load) out = data; /同步預(yù)置else out

45、 = out + 1; /計(jì)數(shù)endendmodule【例5.14】隱含鎖存器舉例module buried_ff(c,b,a);output c;input b,a;reg c;always (a or b)beginif(b=1)&&(a=1) c=a&b;endendmodule【例5.16】用for 語(yǔ)句實(shí)現(xiàn)2 個(gè)8 位數(shù)相乘module mult_for(outcome,a,b);parameter size=8;inputsize:1 a,b; /兩個(gè)操作數(shù)output2*size:1 outcome; /結(jié)果reg2*size:1 outcome;inte

46、ger i;always (a or b)beginoutcome=0;for(i=1; i<=size; i=i+1) /for 語(yǔ)句if(bi) outcome=outcome +(a << (i-1);endendmodule【例9.1】基本門電路的幾種描述方法(1)門級(jí)結(jié)構(gòu)描述module gate1(F,A,B,C,D);input A,B,C,D;output F;nand(F1,A,B); /調(diào)用門元件and(F2,B,C,D);or(F,F1,F2);endmodule(2)數(shù)據(jù)流描述module gate2(F,A,B,C,D);input A,B,C,D;

47、output F;assign F=(A&B)|(B&C&D); /assign 持續(xù)賦值endmodule(3)行為描述module gate3(F,A,B,C,D);input A,B,C,D;output F;reg F;always (A or B or C or D) /過(guò)程賦值beginF=(A&B)|(B&C&D);endendmodule【例9.2】用bufif1 關(guān)鍵字描述的三態(tài)門module tri_1(in,en,out);input in,en;output out;tri out;bufif1 b1(out,in,en)

48、; /注意三態(tài)門端口的排列順序endmodule【例9.3】用assign 語(yǔ)句描述的三態(tài)門module tri_2(out,in,en);output out;input in,en;assign out = en ? in : 'bz;/若en=1,則out=in;若en=0,則out 為高阻態(tài)endmodule【例9.4】三態(tài)雙向驅(qū)動(dòng)器module bidir(tri_inout,out,in,en,b);inout tri_inout;output out;input in,en,b;assign tri_inout = en ? in : 'bz;assign out

49、 = tri_inout b;endmodule【例9.5】三態(tài)雙向驅(qū)動(dòng)器module bidir2(bidir,en,clk);inout7:0 bidir;input en,clk;reg7:0 temp;assign bidir= en ? temp : 8'bz;always (posedge clk)beginif(en) temp=bidir;else temp=temp+1;endendmodule 【例9.13】用組合電路實(shí)現(xiàn)的ROMmodule rom(addr,data);input3:0 addr;output7:0 data;function7:0 romout

50、;input3:0 addr;case(addr)0 : romout = 0;1 : romout = 1;2 : romout = 4;3 : romout = 9;4 : romout = 16;5 : romout = 25;6 : romout = 36;7 : romout = 49;8 : romout = 64;9 : romout = 81;10 : romout = 100;11 : romout = 121;12 : romout = 144;13 : romout = 169;14 : romout = 196;15 : romout = 225;default : r

51、omout = 8'hxx;endcaseendfunctionassign data = romout(addr);endmodule【例9.14】基本D 觸發(fā)器module DFF(Q,D,CLK);output Q;input D,CLK;reg Q;always (posedge CLK)beginQ <= D;endendmodule【例9.15】帶異步清0、異步置1 的D 觸發(fā)器module DFF1(q,qn,d,clk,set,reset);input d,clk,set,reset;output q,qn;reg q,qn;always (posedge clk

52、 or negedge set or negedge reset)beginif (!reset) beginq <= 0; /異步清0,低電平有效qn <= 1;endelse if (!set) beginq <= 1; /異步置1,低電平有效qn <= 0;endelse beginq <= d;qn <= d;endendendmodule【例9.16】帶同步清0、同步置1 的D 觸發(fā)器module DFF2(q,qn,d,clk,set,reset);input d,clk,set,reset;output q,qn;reg q,qn;always

53、 (posedge clk)beginif (reset) beginq <= 0; qn <= 1; /同步清0,高電平有效endelse if (set) beginq <=1; qn <=0; /同步置1,高電平有效endelse beginq <= d; qn <= d;endendendmodule【例9.17】帶異步清0、異步置1 的JK 觸發(fā)器module JK_FF(CLK,J,K,Q,RS,SET);input CLK,J,K,SET,RS;output Q;reg Q;always (posedge CLK or negedge RS o

54、r negedge SET)beginif(!RS) Q <= 1'b0;else if(!SET) Q <= 1'b1;else case(J,K)2'b00 : Q <= Q;2'b01 : Q <= 1'b0;2'b10 : Q <= 1'b1;2'b11 : Q <= Q;default: Q<= 1'bx;endcaseendendmodule【例9.18】電平敏感的1 位數(shù)據(jù)鎖存器module latch_1(q,d,clk);output q;input d,clk;

55、assign q = clk ? d : q; /時(shí)鐘信號(hào)為高電平時(shí),將輸入端數(shù)據(jù)鎖存endmodule【例9.19】帶置位和復(fù)位端的1 位數(shù)據(jù)鎖存器module latch_2(q,d,clk,set,reset);output q;input d,clk,set,reset;assign q = reset ? 0 : (set ? 1 : (clk ? d : q);endmodule【例9.20】8 位數(shù)據(jù)鎖存器module latch_8(qout,data,clk);output7:0 qout;input7:0 data;input clk;reg7:0 qout;always

56、(clk or data)beginif (clk) qout<=data;endendmodule【例9.21】8 位數(shù)據(jù)寄存器module reg8(out_data,in_data,clk,clr);output7:0 out_data;input7:0 in_data;input clk,clr;reg7:0 out_data;always (posedge clk or posedge clr)beginif(clr) out_data <=0;else out_data <=in_data;endendmodule【例9.22】8 位移位寄存器module shi

57、fter(din,clk,clr,dout);input din,clk,clr;output7:0 dout;reg7:0 dout;always (posedge clk)beginif (clr) dout<= 8'b0; /同步清0,高電平有效elsebegindout <= dout << 1; /輸出信號(hào)左移一位dout0 <= din; /輸入信號(hào)補(bǔ)充到輸出信號(hào)的最低位endendendmodule【例9.23】可變模加法/減法計(jì)數(shù)器module updown_count(d,clk,clear,load,up_down,qd);input7

58、:0 d;input clk,clear,load;input up_down;output7:0 qd;reg7:0 cnt;assign qd = cnt;always (posedge clk)beginif (!clear) cnt = 8'h00; /同步清0,低電平有效else if (load) cnt = d; /同步預(yù)置else if (up_down) cnt = cnt + 1; /加法計(jì)數(shù)else cnt = cnt - 1; /減法計(jì)數(shù)endendmodule【例9.24】4 位Johnson 計(jì)數(shù)器(異步復(fù)位)module johnson(clk,clr,o

59、ut);input clk,clr;output3:0 out;reg3:0 out;always (posedge clk or posedge clr)beginif (clr) out<= 4'h0;elsebegin out<= out<< 1;out0<= out3;endendendmodule【例9.25】256×8 RAM 模塊module ram256x8(data,address,we,inclock,outclock,q);input7:0 data;input7:0 address;input we,inclock,out

60、clock;output7:0 q;lpm_ram_dq myram(.q(q),.data(data),.address(address),.we(we),.inclock(inclock),.outclock(outclock);defparam myram.lpm_width=8; /定義數(shù)據(jù)寬度defparam myram.lpm_widthad=8; /定義地址寬度endmodule【例9.26】256×16 RAM 塊module map_lpm_ram(dataout,datain,addr,we,inclk,outclk);input15:0 datain; /端口定

61、義input7:0 addr;input we,inclk,outclk;output15:0 dataout;/lpm_ram_dq 元件例化lpm_ram_dq ram(.data(datain),.address(addr),.we(we),.inclock(inclk),.outclock(outclk),.q(dataout);defparam ram.lpm_width=16; /參數(shù)賦值defparam ram.lpm_widthad=8;defparam ram.lpm_indata="REGISTERED"defparam ram.lpm_outdata="REGISTERED"defparam ram.lpm_file="map_lpm_ram.mif" /RAM 塊

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論