Verilog HDL實例_第1頁
Verilog HDL實例_第2頁
Verilog HDL實例_第3頁
Verilog HDL實例_第4頁
Verilog HDL實例_第5頁
已閱讀5頁,還剩23頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、本文檔含有很多Verilog HDL例子:/與門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; endmo

2、dule兩選一電路module data_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實例(一) 練習(xí)一簡單的組合邏輯設(shè)計 目的: 掌握基本組合邏輯電路的實現(xiàn)方法。    這是一個可綜合的數(shù)據(jù)比較器,很容易看出它的功能是比較數(shù)據(jù)a與數(shù)據(jù)b,如果兩個數(shù)據(jù)相同,則給出結(jié)

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

4、qual輸出為1;a不等于b時,                                       /equal輸出為0。    endmodule  

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

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

7、160;  #100 a=1;            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

8、sum;output cout;input3:0 ina,inb;input cin;assign cout,sum=ina+inb+cin;endmodule【例3.2】4 位計數(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; /計數(shù)endendmodule09.04.07【例5.11】模為60 的BCD 碼加法計數(shù)器module count60(qout,

9、cout,data,load,cin,reset,clk);output7:0 qout;output cout;input7:0 data;input load,cin,clk,reset;reg7:0 qout;always (posedge clk) /clk 上升沿時刻計數(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) qou

10、t7:4<=0;elseqout7:4<=qout7:4+1; /高位不為5,則加1endelse /低位不為9,則加1qout3:0<=qout3:0+1;endendassign cout=(qout=8'h59)&cin)?1:0; /產(chǎn)生進位輸出信號endmodule【例9.10】奇偶校驗位產(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)生奇校驗位assign eve

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

12、lk_out);input clk_in,reset;output clk_out;reg clk_out;always (posedge clk_in)  begin    if(!reset)  clk_out=0;    else      clk_out=clk_out;  endendmodule在always塊中,被賦值的信號都必須定義為reg型,這是由時序邏輯電路的特點所決定的。對于reg型數(shù)據(jù),如果未對它進行賦值,仿真工具會認為它是不定態(tài)。

13、為了能正確地觀察到仿真結(jié)果,在可綜合風(fēng)格的模塊中我們通常定義一個復(fù)位信號reset,當(dāng)reset為低電平時,對電路中的寄存器進行復(fù)位。測試模塊的源代碼:/-  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

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

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

16、-module fdivision(reset,f10m,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) /對計數(shù)器進行判斷,以確定F500K信號是否反轉(zhuǎn)。 begin j <= 0; f500k <= f500k; end else j <= j+1; endendmodule測試模塊源代碼:/-  fdiv

17、ision_Top.v -timescale 1ns/100psdefine 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實例(四)練習(xí)四. 設(shè)

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

19、分別采用阻塞賦值語句和非阻塞賦值語句的兩個看上去非常相似的兩個模塊blocking.v和non_blocking.v來闡明兩者之間的區(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)

20、   begin    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  

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

22、:0 b1,c1,b2,c2;  reg  3:0 a;  reg        clk;   initial  begin    clk = 0;    forever #50 clk = clk;  end  initial  begin    a = 4'h3;    $display("_&q

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

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

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

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

27、160; 3'd1define band    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;             

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

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

30、60;    default:   out=8'hx;/未收到指令時,輸出任意態(tài)。      endcaseend endmodule    同一組合邏輯電路分別用always塊和連續(xù)賦值語句assign描述時,代碼的形式大相徑庭,但是在always中適當(dāng)運用default(在case結(jié)構(gòu)中)和else(在ifelse結(jié)構(gòu)中),通??梢跃C合為純組合邏輯,盡管被賦值的變量一定要定義為reg型。不過,如果不使用default或else對缺省項進行說明,則易生成意

31、想不到的鎖存器,這一點一定要加以注意。指令譯碼器的測試模塊源代碼:/- alu_Top.v -timescale 1ns/1nsmodule    alutest;   wire7:0 out;   reg7:0  a,b;   reg2:0  opcode;   parameter   times=5;   initial    begin     

32、60;     a=$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(tim

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

34、$random%256;  /Give a radom number.                   opcode=opcode+1;          end        #100  $stop;   end&

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

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

37、factorial(n); end end function 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測試模塊源代碼:timescale 1ns/100psmodule tryfuctTop;reg3:0 n,i;reg reset,clk;wire31:0 re

38、sult;initial begin n=0; reset=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è)計中,我們不希望設(shè)計中的運算過于復(fù)雜,以免在綜

39、合后帶來不可預(yù)測的后果。經(jīng)常的情況是,我們把復(fù)雜的運算分成幾個步驟,分別在不同的時鐘周期完成。  Verilog HDL實例(七) 練習(xí)七. 在Verilog HDL中使用任務(wù)(task) 目的:掌握任務(wù)在結(jié)構(gòu)化Verilog HDL設(shè)計中的應(yīng)用。僅有函數(shù)并不能完全滿足Veirlog HDL中的運算需求。當(dāng)我們希望能夠?qū)⒁恍┬盘栠M行運算并輸出多個結(jié)果時,采用函數(shù)結(jié)構(gòu)就顯得非常不方便,而任務(wù)結(jié)構(gòu)在這方面的優(yōu)勢則十分突出。任務(wù)本身并不返回計算值,但是它通過類似C語言中形參與實參的數(shù)據(jù)交換,非常快捷地實現(xiàn)運算結(jié)果的調(diào)用。此外,我們還常常利用任務(wù)來幫助我們實現(xiàn)結(jié)構(gòu)化的模塊設(shè)計,將批量的操作以

40、任務(wù)的形式獨立出來,這樣設(shè)計的目的通常一眼看過去就很明了。下面是一個利用task和電平敏感的always塊設(shè)計比較后重組信號的組合邏輯的實例。可以看到,利用task非常方便地實現(xiàn)了數(shù)據(jù)之間的交換,如果要用函數(shù)實現(xiàn)相同的功能是非常復(fù)雜的;另外,task也避免了直接用一般語句來描述所引起的不易理解和綜合時產(chǎ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 (

41、a or b or c or d) begin va,vb,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=t

42、mp; end endtaskendmodule值得注意的是task中的變量定義與模塊中的變量定義不盡相同,它們并不受輸入輸出類型的限制。如此例,x與y對于task sort2來說雖然是inout型,但實際上它們對應(yīng)的是always塊中變量,都是reg型變量。測試模塊源代碼:· 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),.

43、rd(rd);· initial· begin· 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,

44、C,Doutput F; /模塊的輸出端口為Fwire A,B,C,D,F; /定義信號的數(shù)據(jù)類型assign F= (A&B)|(C&D); /邏輯功能描述endmodule【例5.2】同步置數(shù)、同步清零的計數(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 (lo

45、ad) out = data; /同步預(yù)置else out = out + 1; /計數(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 語句實現(xiàn)2 個8 位數(shù)相乘module mult_for(outcome,a,b);parameter size=8;inputsize:1 a,b; /兩個操作數(shù)output2*size:1 outcome

46、; /結(jié)果reg2*size:1 outcome;integer i;always (a or b)beginoutcome=0;for(i=1; i<=size; i=i+1) /for 語句if(bi) outcome=outcome +(a << (i-1);endendmodule【例9.1】基本門電路的幾種描述方法(1)門級結(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 ga

47、te2(F,A,B,C,D);input A,B,C,D;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) /過程賦值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

48、;tri out;bufif1 b1(out,in,en); /注意三態(tài)門端口的排列順序endmodule【例9.3】用assign 語句描述的三態(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ū)動器module bidir(tri_inout,out,in,en,b);inout tri_inout;output out;input in,en,b;assign tri_inout =

49、 en ? in : 'bz;assign out = tri_inout b;endmodule【例9.5】三態(tài)雙向驅(qū)動器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】用組合電路實現(xiàn)的ROMmodule rom(addr,data);input3:0 addr;outp

50、ut7:0 data;function7:0 romout;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;

51、15 : romout = 225;default : romout = 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

52、;reg q,qn;always (posedge clk 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,rese

53、t;output q,qn;reg q,qn;always (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

54、 (posedge CLK or negedge RS or 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

55、,d,clk);output q;input d,clk;assign q = clk ? d : q; /時鐘信號為高電平時,將輸入端數(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;

56、input clk;reg7:0 qout;always (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;endendmo

57、dule【例9.22】8 位移位寄存器module shifter(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; /輸出信號左移一位dout0 <= din; /輸入信號補充到輸出信號的最低位endendendmodule【例9.23】可變模加法/減法計數(shù)器module updown_count(d,clk,

58、clear,load,up_down,qd);input7: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; /加法計數(shù)else cnt = cnt - 1; /減法計數(shù)endendmodule【例9.24】4 位Johnson 計數(shù)器(

59、異步復(fù)位)module johnson(clk,clr,out);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

60、 address;input we,inclock,outclock;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,o

61、utclk);input15:0 datain; /端口定義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="m

溫馨提示

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

評論

0/150

提交評論