Verilog HDL編程舉例_第1頁(yè)
Verilog HDL編程舉例_第2頁(yè)
Verilog HDL編程舉例_第3頁(yè)
Verilog HDL編程舉例_第4頁(yè)
Verilog HDL編程舉例_第5頁(yè)
已閱讀5頁(yè),還剩27頁(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、設(shè)計(jì)示范和上機(jī)習(xí)題 練習(xí)一簡(jiǎn)單的組合邏輯設(shè)計(jì)/(方法一):/-文件名 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í),equal輸出為0。endmodule/(方法二):module compare(equal,a,b);input a,b;output equal;reg equal; always (a or b) if(a=b) /a等于b時(shí),equal輸出為1; equal =1; else /a不等于b時(shí),

2、equal輸出為0。 equal = 0; /思考:如果不寫else 部分會(huì)產(chǎn)生什么邏輯? endmodule/- /-測(cè)試模塊源代碼(方法之一):timescale 1ns/1ns / 定義時(shí)間單位。include "./compare.v" / 包含模塊文件。在有的仿真調(diào)試環(huán)境中并不需要此語(yǔ)句。 /而需要從調(diào)試環(huán)境的菜單中鍵入有關(guān)模塊文件的路徑和名稱module t; reg a,b; wire equal; initial / initial常用于仿真時(shí)信號(hào)的給出。 begin a=0; b=0; #100 a=0; b=1; #100 a=1; b=1; #100

3、a=1; b=0; #100 a=0; b=0; #100 $stop; /系統(tǒng)任務(wù),暫停仿真以便觀察仿真波形。 end compare m(.equal(equal),.a(a),.b(b); /調(diào)用被測(cè)試模塊t.m endmodule /- 測(cè)試模塊源代碼(方法之二):-timescale 1ns/1ns / 定義時(shí)間單位。include "./compare.v" / 包含模塊文件。在有的仿真調(diào)試環(huán)境中并不需要此語(yǔ)句。 /而需要從調(diào)試環(huán)境的菜單中鍵入有關(guān)模塊文件的路徑和名稱module t; reg a,b; reg clock; wire equal; initia

4、l / initial常用于仿真時(shí)信號(hào)的給出。 begin a=0; b=0; clock = 0; /定義一個(gè)時(shí)鐘變量 end always #50 clock = clock; /產(chǎn)生周期性的時(shí)鐘 always (posedge clock) /在每次時(shí)鐘正跳變沿時(shí)刻產(chǎn)生不同的a 和 b begin a = $random%2; / 每次a是 0還是1是隨機(jī)的。 b = $random%2; / 每次b是 0還是1是隨機(jī)的。 end initial begin #100000 $stop; end /系統(tǒng)任務(wù),暫停仿真以便觀察仿真波形。 compare m(.equal(equal),.a

5、(a),.b(b); /調(diào)用被測(cè)試模塊t.mendmodule 練習(xí)二. 簡(jiǎn)單分頻時(shí)序邏輯電路的設(shè)計(jì)/- 文件名:half_clk.v - module half_clk(reset,clk_in,clk_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/- 測(cè)試模塊的源代碼:-/- 文件名top.v -timescale 1ns/100psdefine clk_cycl

6、e 50module top;reg clk,reset;wire clk_out;always #clk_cycle clk = clk; /產(chǎn)生測(cè)試時(shí)鐘initial begin clk = 0; reset = 1; #10 reset = 0; #110 reset = 1; #100000 $stop; end half_clk m0(.reset(reset),.clk_in(clk),.clk_out(clk_out);endmodule練習(xí)三. 利用條件語(yǔ)句實(shí)現(xiàn)計(jì)數(shù)分頻時(shí)序電路 /- 模塊源代碼:-/ - fdivision.v -module fdivision(RESET,

7、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) /對(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

8、/100psdefine clk_cycle 50module division_Top; reg F10M,RESET;wire F500K_clk;always #clk_cycle F10M = F10M; initial begin RESET=1;F10M=0;#100 RESET=0;#100 RESET=1;#10000 $stop; endfdivision fdivision (.RESET(RESET),.F10M(F10M),.F500K(F500K_clk);endmodule 練習(xí)四. 阻塞賦值與非阻塞賦值的區(qū)別/ - 模塊源代碼:-/ - blocking.v -m

9、odule 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 b = a; c = b; $display("Blocking: a = %d, b = %d, c = %d ",a,b,c); 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;

10、 always (posedge clk) begin b <= a; c <= b; $display("Non_Blocking: a = %d, b = %d, c = %d ",a,b,c); end endmodule/ - 測(cè)試模塊源代碼:-/- compareTop.v -timescale 1ns/100psinclude "./blocking.v"include "./non_blocking.v"module compareTop; wire 3:0 b1,c1,b2,c2; reg 3:0 a; r

11、eg clk; initial begin clk = 0; forever #50 clk = clk; /思考:如果在本句后還有語(yǔ)句,能否執(zhí)行?為什么? end initial begin a = 4'h3; $display("_"); # 100 a = 4'h7; $display("_"); # 100 a = 4'hf; $display("_"); # 100 a = 4'ha; $display("_"); # 100 a = 4'h2; $display(

12、"_"); # 100 $display("_"); $stop; end non_blocking non_blocking(clk,a,b2,c2); blocking blocking(clk,a,b1,c1);endmodule 練習(xí)五. 用always塊實(shí)現(xiàn)較復(fù)雜的組合邏輯電路/-文件名 alu.v -define plus 3'd0define minus 3'd1define band 3'd2define bor 3'd3define unegate 3'd4module alu(out,opcod

13、e,a,b);output7:0 out;reg7:0 out;input2:0 opcode;input7:0 a,b; /操作數(shù)。always(opcode or a or b) /電平敏感的always塊begin case(opcode) plus: out = a+b; /加操作。 minus: out = a-b; /減操作。 band: out = a&b; /求與。 bor: out = a|b; /求或。 unegate: out=a; /求反。 default: out=8'hx; /未收到指令時(shí),輸出任意態(tài)。 endcaseendendmodule /-

14、指令譯碼器的測(cè)試模塊源代碼:-/- alutest.v -timescale 1ns/1nsinclude "./alu.v"module alutest; wire7:0 out; reg7:0 a,b; reg2:0 opcode; parameter times=5; initial begin 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(times)

15、begin #100 a=$random%256; /Give a radom number. b=$random%256; /Give a radom number. opcode=opcode+1; end #100 $stop; end alu alu1(out,opcode,a,b);endmodule練習(xí)六. 在Verilog HDL中使用函數(shù)/- 模塊源代碼:-/- 文件名 tryfunct.v -module tryfunct(clk,n,result,reset); output31:0 result; input3:0 n; input reset,clk; reg31:0

16、result; always (posedge clk) /clk的上沿觸發(fā)同步運(yùn)算。begin if(!reset) /reset為低時(shí)復(fù)位。 result<=0; else begin result <= n * factorial(n)/(n*2)+1); end /verilog在整數(shù)除法運(yùn)算結(jié)果中不考慮余數(shù) end function 31:0 factorial; /函數(shù)定義,返回的是一個(gè)32位的數(shù) input 3:0 operand; /輸入只有一個(gè)四位的操作數(shù) reg 3:0 index; /函數(shù)內(nèi)部計(jì)數(shù)用中間變量 begin factorial = operand

17、? 1 : 0; /先定義操作數(shù)為零時(shí)函數(shù)的輸出為零,不為零時(shí)為1 for(index = 2; index <= operand; index = index + 1) factorial = index * factorial; /表示階乘的算術(shù)迭代運(yùn)算 end endfunction endmodule/- 測(cè)試模塊源代碼:-include "./tryfunct.v"timescale 1ns/100psdefine clk_cycle 50module tryfuctTop;reg3:0 n,i;reg reset,clk;wire31:0 result;i

18、nitial begin clk=0; n=0; reset=1; #100 reset=0; /產(chǎn)生復(fù)位信號(hào)的負(fù)跳沿 #100 reset=1; /復(fù)位信號(hào)恢復(fù)高電平后才開(kāi)始輸入n for(i=0;i<=15;i=i+1) begin #200 n=i; end #100 $stop; endalways #clk_cycle clk=clk; tryfunct m(.clk(clk),.n(n),.result(result),.reset(reset);endmodule練習(xí)七. 在Verilog HDL中使用任務(wù)(task)/- 模塊源代碼:-/-文件名 sort4.v -mod

19、ule sort4(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,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,

20、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/ - 測(cè)試模塊源代碼:-timescale 1ns/100psinclude "sort4.v"module task_Top; reg3:0 a,b,c,d; wire3:0 ra,rb,rc,rd; initial begin a=0;b=0;c=0;d=0;repeat(50)be

21、gin #100 a =$random%15; b =$random%15; c =$random%15; d =$random%15;end #100 $stop; endsort4 sort4 (.a(a),.b(b),.c(c),.d(d), .ra(ra),.rb(rb),.rc(rc),.rd(rd); endmodule 練習(xí)八. 利用有限狀態(tài)機(jī)進(jìn)行時(shí)序邏輯的設(shè)計(jì)/ - 模塊源代碼:-/- 文件名 seqdet.v -module seqdet(x,z,clk,rst,state);input x,clk,rst;output z;output2:0 state;reg2:0 st

22、ate;wire z;parameter IDLE='d0, A='d1, B='d2, C='d3, D='d4, E='d5, F='d6, G='d7; assign z = ( state=E && x=0 )? 1 : 0; /當(dāng)x 序列10010最后一個(gè)0剛到時(shí)刻,時(shí)鐘沿立刻將狀態(tài)變?yōu)镋,此時(shí)z 應(yīng)該變?yōu)楦遖lways (posedge clk) if(!rst) begin state <= IDLE; end else casex(state) IDLE : if(x=1) /第一個(gè)碼位對(duì),記

23、狀態(tài)A begin state <= A; end A: if(x=0) /第二個(gè)碼位對(duì),記狀態(tài)B begin state <= B; end B: if(x=0) /第三個(gè)碼位對(duì),記狀態(tài)C begin state <= C; end else /第三個(gè)碼位不對(duì),前功盡棄,記狀態(tài)為F begin state <= F; end C: if(x=1) /第四個(gè)碼位對(duì) begin state <= D; end else /第四個(gè)碼位不對(duì),前功盡棄,記狀態(tài)為G begin state <= G; end D: if(x=0) /第五個(gè)碼位對(duì),記狀態(tài)E begin

24、 state <= E; /此時(shí)開(kāi)始應(yīng)有z 的輸出 end else /第五個(gè)碼位不對(duì),前功盡棄,只有剛進(jìn)入的1有用,回到第一個(gè)碼位對(duì)狀態(tài),記狀態(tài)A begin state <= A; end E: if(x=0) /連著前面已經(jīng)輸入的x 序列10010考慮,又輸入了0碼位可以認(rèn)為第三個(gè)碼位已對(duì),記狀態(tài)C begin state <= C; end else /前功盡棄,只有剛輸入的1碼位對(duì),記狀態(tài)為A begin state <= A; end F: if(x=1) /只有剛輸入的1碼位對(duì),記狀態(tài)為A begin state <= A; end else /又有

25、1碼位對(duì),記狀態(tài)為B begin state <= B; end G: if(x=1) /只有剛輸入的1碼位對(duì),記狀態(tài)為A begin state <= F; end default:state=IDLE; /缺省狀態(tài)為初始狀態(tài)。 endcaseendmodule/- 測(cè)試模塊源代碼:-/-文件名 seqdet.v -timescale 1ns/1nsinclude "./seqdet.v"module seqdet_Top; reg clk,rst; reg23:0 data; wire2:0 state; wire z,x; assign x=data23;

26、 always #10 clk = clk; always (posedge clk) data=data22:0,data23; /形成數(shù)據(jù)向左移環(huán)行流,最高位與x 連接 initial begin clk=0; rst=1; #2 rst=0; #30 rst=1; data ='b1100_1001_0000_1001_0100; #500 $stop; end seqdet m(x,z,clk,rst,state); endmodule 練習(xí)九.利用狀態(tài)機(jī)實(shí)現(xiàn)比較復(fù)雜的接口設(shè)計(jì)/- 模塊源代碼:-module writing(reset,clk,address,data,sda

27、,ack); input reset,clk; input7:0 data,address; output sda,ack;/sda負(fù)責(zé)串行數(shù)據(jù)輸出; /ack是一個(gè)對(duì)象操作完畢后,模塊給出的應(yīng)答信號(hào)。 reg link_write;/link_write 決定何時(shí)輸出。 reg3:0 state;/主狀態(tài)機(jī)的狀態(tài)字。 reg4:0 sh8out_state;/從狀態(tài)機(jī)的狀態(tài)字。 reg7:0 sh8out_buf; /輸入數(shù)據(jù)緩沖。 reg finish_F; /用以判斷是否處理完一個(gè)操作對(duì)象。 reg ack; parameter idle=0,addr_write=1,data

28、_write=2,stop_ack=3; parameter bit0=1,bit1=2,bit2=3,bit3=4,bit4=5,bit5=6,bit6=7,bit7=8; assign sda = link_write? sh8out_buf7 : 1'bz; always (posedge clk) begin if(!reset) /復(fù)位。 begin link_write<= 0; /掛起串行單總線 state <= idle; finish_F <= 0; /結(jié)束標(biāo)志清零 sh8out_state<=idle; ack<= 0; sh8out_

29、buf<=0; end else case(state) idle: begin link_write <= 0; /斷開(kāi)串行單總線 finish_F <= 0; sh8out_state<=idle; ack<= 0; sh8out_buf<=address; /并行地址存入寄存器 state <= addr_write; /進(jìn)入下一個(gè)狀態(tài) end addr_write: /地址的輸入。 begin if(finish_F=0) begin shift8_out; end /地址的串行輸出 else begin sh8out_state <=

30、idle; sh8out_buf <= data; /并行數(shù)據(jù)存入寄存器 state <= data_write; finish_F <= 0; end end data_write: /數(shù)據(jù)的寫入。 begin if(finish_F=0) begin shift8_out; end /數(shù)據(jù)的串行輸出 else begin link_write <= 0; state <= stop_ack; finish_F <= 0; ack <= 1; /向信號(hào)源發(fā)出應(yīng)答。 end end stop_ack: /向信號(hào)源發(fā)出應(yīng)答結(jié)束。 begin ack &l

31、t;= 0; state <= idle; end endcase end task shift8_out; / 地址和數(shù)據(jù)的串行輸出。 begin case(sh8out_state) idle: begin link_write <= 1; /連接串行單總線,立即輸出地址或數(shù)據(jù)的最高位(MSB) sh8out_state <= bit7; end bit7: begin link_write <= 1; /連接串行單總線 sh8out_state <= bit6; sh8out_buf <= sh8out_buf<<1; /輸出地址或數(shù)據(jù)的次高位(bi

溫馨提示

  • 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)論