verilog數(shù)字鐘設(shè)計(FPGA).doc
《verilog數(shù)字鐘設(shè)計(FPGA).doc》由會員分享,可在線閱讀,更多相關(guān)《verilog數(shù)字鐘設(shè)計(FPGA).doc(15頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、 課程設(shè)計目標(biāo) 1. 熟悉并掌握verilog 硬件描述語言 2. 熟悉quartus 軟件開發(fā)環(huán)境 3. 學(xué)會設(shè)計大中規(guī)模的數(shù)字電路,并領(lǐng)會其中的設(shè)計思想 二、課程設(shè)計實現(xiàn)的功能 (1) 設(shè)計一個數(shù)碼管實時顯示時、分、秒的數(shù)字時鐘(24小時顯示模式); (2) 可以調(diào)節(jié)小時,分鐘。 (3) 能夠進(jìn)行24小時和12小時的顯示切換。 (4) 可以設(shè)置任意時刻鬧鐘,并且有開關(guān)鬧鐘功能。 (5) 有整點報時功能,幾點鐘LED燈閃亮幾下。 (6) 有復(fù)位按鍵,復(fù)位后時間從零開始計時,但鬧鐘設(shè)置時間不變。 3、 設(shè)計原理: 1、總原理框圖: 譯碼顯示模塊 切換12進(jìn)制顯示 復(fù)位 分鐘校正 小時校正 分頻模塊 計數(shù)模塊 是 輸出整點報時信號 到達(dá)整點 輸出鬧鐘信號 是否到鬧鐘時間 設(shè)置鬧鐘分鐘 設(shè)置鬧鐘小時 模式選擇模塊 是 附全部代碼: 總模塊: module clock(clk,reset,MODE,Alarm_ctr,BT2,H12_24,DSH,DSL,DMH,DML,DHH,DHL,dian,bao_signal,nao_signal); input clk;//50MHz input reset,MODE,Alarm_ctr,BT2,H12_24;//復(fù)位鍵,模式選擇按鈕,鬧鐘開關(guān)檔,調(diào)節(jié)按 鈕 ,12—24小時切換檔 output [7:0]DMH,DML,DHH,DHL; //4個數(shù)碼管顯示輸入信號 output dian,bao_signal,nao_signal; //時分間隔點,報時信號,鬧鐘信號 output [3:0]DSH,DSL; //秒鐘輸出信號 wire [3:0] SH,SL,MH,ML,HH,HL; wire [3:0] LED_mode; wire [3:0] HH12,HL12,HH24,HL24,MH24,ML24,SH24,SL24; wire [3:0] set_HH,set_HL,set_MH,set_ML; wire _1HZ,_10ms,_250ms,_500ms; wire Keydone1; wire Keydone2; wire co1,co11,co111,co2,co22,co222,set_co2; wire [3:0]mode_flag; assign dian=1b0; devide_f u1(_1HZ,_10ms,_250ms,_500ms,reset,clk); //分頻,得到4種不同頻率的時鐘信號 key_press u2(_10ms,MODE,Keydone1); //模式檔按鈕去抖動 key_press u20(_10ms,BT2,Keydone2); //調(diào)節(jié)按鈕去除抖動 mode u3(Keydone1,mode_flag); //通過模式按鈕產(chǎn)生不同模式 second u4(_1HZ,reset,mode_flag,Keydone2,SH24,SL24,co1); //秒計時 minute u5(co11,reset,MH24,ML24,co2); //分計時 hour u6(co22,reset,HH24,HL24); //小時計時 SEG7_LUT u7(DML,ML); //4個數(shù)碼管顯示 SEG7_LUT u8(DMH,MH); SEG7_LUT u9(DHL,HL); SEG7_LUT u10(DHH,HH); display_LED u11(DSL,SL); //LED燈顯示秒或模式燈 display_LED u12(DSH,SH); mode_choose u13(mode_flag,Keydone2,_250ms,co1,co2,set_co2,co11,co22,co111,co222); //選擇模式進(jìn)行不同操作 hour12_24 u14(HH24,HL24,HH12,HL12); //12--24小時切換 boshi u15(HH,HL,MH,ML,SH,SL,_1HZ,bao_signal); //整點報時 set_naozhong u16(co111,co222,set_HH,set_HL,set_MH,set_ML,set_co2); //設(shè)置鬧鐘時間 Naozhong u17(Alarm_ctr,_500ms,set_HH,set_HL,set_MH,set_ML,HH24,HL24,MH24,ML24,nao_signal); //任意鬧鐘響應(yīng) LUT_mode u18(mode_flag,H12_24,HH12,HL12,HH24,HL24,MH24,ML24,set_HH,set_HL,set_MH,set_ML,MH,ML,HH,HL);//通過模式選擇數(shù)碼管顯示 LED_mode u19(mode_flag,SH24,SL24,SH,SL); 模式選擇LED燈顯示 Endmodule 分頻模塊 : 分頻模塊的作用主要是要獲得各種頻率的時鐘信號。輸入信號為50MHZ的信號,要想獲得1HZ的信號作為秒脈沖計時,則要對50MHZ信號分頻。通過計數(shù)的方式,當(dāng)計數(shù)從0開始到24 999999時,1HZ信號取反一次,計數(shù)又從0開始,如此循環(huán),就可以得到1HZ脈沖信號。對于其他信號也是如此,只是計數(shù)值不一樣,得到的分頻信號不同。 module devide_f(_1HZ,_10ms,_250ms,_500ms,nCR,_50MHZ); input _50MHZ,nCR; output _1HZ,_10ms,_250ms,_500ms; reg _1HZ,_10ms,_250ms,_500ms; reg[31:0]Q1,Q2,Q3,Q4; always@(posedge _50MHZ or negedge nCR)begin if(~nCR) begin Q1<=32d0; Q2<=32d0; Q3<=32d0; Q4<=32d0; end else if(Q1>=32d24999999) begin Q1<=32d0; _1HZ=~_1HZ; end else if(Q2>=32d249999) begin Q2<=32d0; _10ms=~_10ms; end else if(Q4>=32d6299999) begin Q4<=32d0; _250ms=~_250ms; end else if(Q3>=32d12499999) begin Q3<=32d0; _500ms=~_500ms; end else begin Q1<=Q1+1d1; Q2<=Q2+1d1; Q3<=Q3+1d1; Q4<=Q4+1d1; end end endmodule 計時模塊: 秒計數(shù):在1HZ脈沖下進(jìn)行秒計時,當(dāng)計時達(dá)到59秒后,在下一個脈沖來臨變0,并發(fā)出一個脈沖信號,可供下面分鐘計數(shù)作為輸入脈沖信號計時。 分鐘計數(shù):在輸入脈沖下,分鐘開始計時,當(dāng)計時達(dá)到59后,在下一個脈沖來臨變0,并發(fā)出一個脈沖,供小時計數(shù)的輸入脈沖新號。 小時計數(shù):脈沖信號來臨時,計數(shù)加1,達(dá)到23后在下一個脈沖的作用下清零,從新計時。如果有復(fù)位信號,則時分秒全部清零。 module second(cp,reset,mode_flag,BT2,SH,SL,co); input cp,reset,BT2; input[3:0]mode_flag; output co=1b0; reg co; output [3:0]SL,SH; reg[3:0]SH,SL; reg[7:0]cnt; always@(posedge cp or negedge reset ) begin if(!reset) begin SL=4b0; SH=4b0; cnt<=8b0; end else if((mode_flag==4b0010)&&(!BT2)) begin SL=4b0; SH=4b0; cnt<=8b0; end else begin if(cnt==8d59) begin cnt<=8d0; SH<=4d0; SL<=4d0; co<=1b1; end else begin co=1b0; cnt=cnt+8d1; SL<=cnt%10; SH<=cnt/10; end end end endmodule module minute (cp,reset,MH,ML,co); input cp ,reset; output co=1b0; output [3:0]ML,MH; reg[3:0]MH,ML; reg[7:0]cnt; reg co; always@(posedge cp or negedge reset) begin if(!reset) begin ML=4b0; MH=4b0; cnt<=8b0; end else begin if(cnt==8d59) begin cnt<=8d0; MH<=4d0; ML<=4d0; co<=1b1; end else begin co=1b0; cnt=cnt+8d1; ML<=cnt%10; MH<=cnt/10; end end end endmodule module hour (cp,reset,HH,HL); input cp,reset; output [3:0]HL,HH; reg[3:0]HH,HL; reg[7:0]cnt; always@(posedge cp or negedge reset) begin if(!reset) begin HL=4b0; HH=4b0; cnt<=8b0; end else begin if(cnt==8d23) begin cnt<=8d0; HH<=4d0; HL<=4d0; end else begin cnt=cnt+8d1; HL<=cnt%10; HH<=cnt/10; end end end Endmodule 模式選擇模塊 : 同過一個模式檔按鍵MODE,按一下產(chǎn)生對應(yīng)一種模式mode_flag,并且可以循環(huán)。在不同的模式下可以進(jìn)行不同的操作。其中mode_flag=40000為正常顯示計時,mode_flag=40001為小時調(diào)鐘模式,mode_flag=400010為分鐘調(diào)鐘模,mode_flag=40011為鬧鐘小時設(shè)置模式,mode_flag=40100為鬧鐘分鐘設(shè)置模式。 module key_press(_10ms,KEY,Keydone); input KEY,_10ms; output Keydone; reg dout1,dout2,dout3; always @(posedge _10ms) begin dout1 <= KEY; dout2 <= dout1; dout3 <= dout2; end assign Keydone = (dout1 | dout2 | dout3); endmodule module mode (MODE,mode_flag); input MODE ; output [3:0]mode_flag; reg [3:0]mode_flag; always @ (negedge MODE ) begin mode_flag = mode_flag+ 4b1; if(mode_flag == 4b0101) mode_flag = 2b0; end endmodule module LED_mode (mode_flag,SH24,SL24,SH,SL); input [3:0] mode_flag; input [3:0] SH24,SL24; output [3:0]SH,SL; reg [3:0]SH,SL; always@(mode_flag )begin case (mode_flag) 4b0000:begin SH<=SH24; SL<=SL24;end 4b0001: begin SH<=4b0000; SL<=4b0001;end 4b0010: begin SH<=4b0000; SL<=4b0010;end 4b0011: begin SH<=4b0000; SL<=4b0100;end 4b0100: begin SH<=4b0000; SL<=4b1000;end default : begin SH<=SH24; SL<=SL24;end endcase end endmodule Module LUT_mode (mode_flag,H12_24,HH12,HL12,HH24,HL24,MH24,ML24,set_HH,set_HL,set_MH,set_ML,MH,ML,HH,HL); input [3:0] HH12,HL12,HH24,HL24,MH24,ML24; input [3:0] set_HH,set_HL,set_MH,set_ML; input [3:0] mode_flag; input H12_24; output [3:0] MH,ML,HH,HL; reg [3:0] MH,ML,HH,HL; always@(mode_flag or H12_24) begin case (mode_flag) 4b0011, 4b0100: begin HH<=set_HH; HL<=set_HL; MH<=set_MH; ML<=set_ML; end default:begin if(H12_24)begin HH<=HH12; HL<=HL12; MH<=MH24; ML<=ML24;end else begin HH<=HH24; HL<=HL24; MH<=MH24; ML<=ML24;end end endcase end endmodule module mode_choose(mode_flag,BT2,_250ms,co1,co2,set_co2,co11,co22,co111,co222); input [3:0]mode_flag; input BT2,_250ms,co1,co2,set_co2; output co11,co22,co111,co222; supply1 Vdd; reg co11,co22,co111,co222; always@(mode_flag)begin case (mode_flag) 4b0001: begin if(~BT2) co22<=_250ms; else begin co22<=co2; co11<=co1; end end 4b0010: begin if(~BT2) begin co11<=_250ms; co22<=co2;end else begin co11<=co1; co22<=co2; end end 4b0011: begin co22<=co2; co11<=co1; if(~BT2) co222<=_250ms; else co222<=set_co2;end 4b0100: begin co22<=co2; co11<=co1; if(~BT2) co111<=_250ms; else co111<=Vdd; end default :begin co11<=co1; co22<=co2; end endcase end endmodule 鬧鐘模塊 : module set_naozhong(co111,co222,set_HH,set_HL,set_MH,set_ML,co2); input co111,co222; output [3:0]set_HH,set_HL,set_MH,set_ML; supply1 Vdd; output co2; minute (co111,Vdd,set_MH,set_ML,co2); hour (co222,Vdd,set_HH,set_HL); endmodule modulenaozhong (Alarm_ctr,_1HZ,set_HH,set_HL,set_MH,set_ML,HH24,HL24,MH24,ML24,nao_signal); input Alarm_ctr,_1HZ; input [3:0] set_HH,set_HL,set_MH,set_ML; input [3:0] HH24,HL24,MH24,ML24; output nao_signal; reg signal; reg nao_signal; reg [16:0] Q; always@(posedge _1HZ)begin if((~signal)&&(Alarm_ctr))begin if((set_HH==HH24)&&(set_HL==HL24)&&(set_MH==MH24)&&(set_ML==ML24))signal<=1b1; else signal<=1b0;end else if((signal)&&(Alarm_ctr))begin nao_signal<=~nao_signal; Q=Q+nao_signal; if(Q>=8d720)begin Q<=16b0; signal<=1b0;end end else begin signal<=1b0; nao_signal<=1b0;end end endmodule 12——24小時切換模塊: module hour12_24(HH24,HL24,HH12,HL12); input [3:0] HH24,HL24; output [3:0] HH12,HL12; reg [3:0] HH12,HL12; reg flag; always@(HH24 or HL24)begin if((HH24*10+HL24)<=12) begin HH12<=HH24; HL12<=HL24; end else if(((HH24*10+HL24)>=13)&&((HH24*10+HL24)<=19)) begin HH12<=4d0; HL12<=HL24-4d2; end else if(((HH24*10+HL24)>=19)&&((HH24*10+HL24)<=21)) begin HH12<=4d0; HL12<=HL24+4d8; end else begin HH12<=HH24-4d1; HL12<=HL24-4d2; end end endmodule 整點報時模塊: module boshi(HH,HL,MH,ML,SH,SL,_500ms,bao_signal); input[3:0] HH,HL,MH,ML,SH,SL; input _500ms; output bao_signal; reg bao_signal; reg [7:0]Q1,Q2; reg bao; always@(posedge _500ms)begin if(((SH*10+SL)==8d59)&&((MH*10+ML)==8d59))begin Q1<=7b0; bao<=1b1;end else if((Q1<10*HH+HL)&&(bao)) begin bao_signal<=~bao_signal; Q1<=Q1+bao_signal; end else if(Q1==(10*HH+HL)) bao<=1b0; else begin bao_signal<=1b0; end end endmodule 譯碼顯示模塊: 一、數(shù)碼管顯示:通過傳入響應(yīng)的4位十進(jìn)制數(shù),運(yùn)用case語句轉(zhuǎn)換輸出相應(yīng)的8位二進(jìn)制顯示碼,送入數(shù)碼管顯示。 二、LED顯示 : module display_LED(s_out,s_int); input[3:0]s_int; output[3:0]s_out; reg[3:0]s_out; wire [3:0]s_out1; always @(s_int) begin case(s_int) 4h0:s_out=4b0000; 4h1:s_out=4b0001; 4h2:s_out=4b0010; 4h3:s_out=4b0011; 4h4:s_out=4b0100; 4h5:s_out=4b0101; 4h6:s_out=4b0110; 4h7:s_out=4b0111; 4h8:s_out=4b1000; 4h9:s_out=4b1001; endcase end assign s_out1=~s_out; Endmodule module SEG7_LUT(oSEG1,iDIG); input[3:0]iDIG; output[7:0]oSEG1; reg[7:0]oSEG; wire [7:0]oSEG1; always @(iDIG) begin case(iDIG) 4h0: oSEG = 8b00111111; 4h1: oSEG = 8b00000110; 4h2: oSEG = 8b01011011; 4h3: oSEG = 8b01001111; 4h4: oSEG = 8b01100110; 4h5: oSEG = 8b01101101; 4h6: oSEG = 8b01111101; 4h7: oSEG = 8b00000111; 4h8: oSEG = 8b01111111; 4h9: oSEG = 8b01101111; 4ha: oSEG = 8b01110111; 4hb: oSEG = 8b01111100; 4hc: oSEG = 8b00111001; 4hd: oSEG = 8b01011110; 4he: oSEG = 8b01111001; 4hf: oSEG = 8b01110001; endcase end assign oSEG1=~oSEG; endmodule module display_LED(s_out,s_int); input[3:0]s_int; output[3:0]s_out; reg[3:0]s_out; wire [3:0]s_out1; always @(s_int) begin case(s_int) 4h0:s_out=4b0000; 4h1:s_out=4b0001; 4h2:s_out=4b0010; 4h3:s_out=4b0011; 4h4:s_out=4b0100; 4h5:s_out=4b0101; 4h6:s_out=4b0110; 4h7:s_out=4b0111; 4h8:s_out=4b1000; 4h9:s_out=4b1001; endcase end assign s_out1=~s_out; endmodule 設(shè)計過程常見問題: (1) 要注意編寫程序的過程中begin和end配對問題,類似于C語言中的括號匹配問題,在編寫計數(shù)模塊時編譯不通過,最后檢查出是缺少一個end結(jié)束符號,經(jīng)修改后編譯通過。(2)Verilog HDL語言編寫時的語法問題。在最初的計時模塊的程序設(shè)計中,將小時、分鐘的調(diào)節(jié)信號放在了另外的一個always語句塊中,編譯無法通過,經(jīng)查閱資料,在Verilog HDL語言的編寫中應(yīng)該注意不同的always語句塊不可以對同一個變量進(jìn)行操作,即一個變量不可以經(jīng)過兩個always語句塊操作。將對小時和分鐘調(diào)節(jié)信號的操作與計時放在同一個語句塊中,編譯通過。 (3) 數(shù)碼管剛開始時顯示于實際計數(shù)不一樣,主要是由譯碼錯誤造成的原因。數(shù)碼管一開始不變化,說明計數(shù)沒有進(jìn)行,是由于分鐘的輸入脈沖信號錯誤引起。 心得體會 這次的課程設(shè)計結(jié)束了,在這次的設(shè)計中我學(xué)會了很多東西。首先是對Verilog HDL語言的設(shè)計思想有了深入理解,將這種自頂向下的設(shè)計理念運(yùn)用于實踐中,設(shè)計多功能數(shù)字鐘,突出了Verilog HDL作為硬件描述語言的良好可讀性和可移植性,對上學(xué)期所學(xué)的而理論知識有了深刻的理解。 其次是對Verilog HDL語言的語法熟悉,在這次的課程設(shè)計中,我學(xué)習(xí)到很多Verilog HDL語言的語法知識,比如在兩個不同的語句塊中不能對同一個變量進(jìn)行操作,比如在用Verilog HDL語言中編寫程序時要注意begin和end語句的匹配問題,在使用Verilog HDL語言時不可以使用中文注釋等等。對于這種語言的學(xué)習(xí)也有了很大的幫助。 最后是設(shè)計作品時的設(shè)計邏輯和設(shè)計思想,在選擇不同的系統(tǒng)方案時要綜合考慮,選擇最優(yōu)方案。各個模塊的實現(xiàn)也要考慮綜合情況而制定出最符合實際情況的實現(xiàn)方案,方案間要進(jìn)行對比、實踐,最終確定。 在這次的課程設(shè)計中我不僅學(xué)習(xí)到有關(guān)程序編寫以及設(shè)計方面的邏輯思維,對系統(tǒng)功能的實現(xiàn)也有了較為深入的了解,對各模塊的調(diào)試等也學(xué)習(xí)到不少東西,總之,從這次設(shè)計中學(xué)到很多東西,也鞏固了我的理論學(xué)習(xí)。- 1.請仔細(xì)閱讀文檔,確保文檔完整性,對于不預(yù)覽、不比對內(nèi)容而直接下載帶來的問題本站不予受理。
- 2.下載的文檔,不會出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請點此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
9.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計者僅對作品中獨創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- verilog 數(shù)字 設(shè)計 FPGA
鏈接地址:http://zhongcaozhi.com.cn/p-6690300.html