verilog數(shù)字鐘設(shè)計(jì)(FPGA).doc
《verilog數(shù)字鐘設(shè)計(jì)(FPGA).doc》由會(huì)員分享,可在線閱讀,更多相關(guān)《verilog數(shù)字鐘設(shè)計(jì)(FPGA).doc(15頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、 課程設(shè)計(jì)目標(biāo) 1. 熟悉并掌握verilog 硬件描述語(yǔ)言 2. 熟悉quartus 軟件開(kāi)發(fā)環(huán)境 3. 學(xué)會(huì)設(shè)計(jì)大中規(guī)模的數(shù)字電路,并領(lǐng)會(huì)其中的設(shè)計(jì)思想 二、課程設(shè)計(jì)實(shí)現(xiàn)的功能 (1) 設(shè)計(jì)一個(gè)數(shù)碼管實(shí)時(shí)顯示時(shí)、分、秒的數(shù)字時(shí)鐘(24小時(shí)顯示模式); (2) 可以調(diào)節(jié)小時(shí),分鐘。 (3) 能夠進(jìn)行24小時(shí)和12小時(shí)的顯示切換。 (4) 可以設(shè)置任意時(shí)刻鬧鐘,并且有開(kāi)關(guān)鬧鐘功能。 (5) 有整點(diǎn)報(bào)時(shí)功能,幾點(diǎn)鐘LED燈閃亮幾下。 (6) 有復(fù)位按鍵,復(fù)位后時(shí)間從零開(kāi)始計(jì)時(shí),但鬧鐘設(shè)置時(shí)間不變。 3、 設(shè)計(jì)原理: 1、總原理框圖: 譯碼顯示模塊 切換12進(jìn)制顯示 復(fù)位 分鐘校正 小時(shí)校正 分頻模塊 計(jì)數(shù)模塊 是 輸出整點(diǎn)報(bào)時(shí)信號(hào) 到達(dá)整點(diǎn) 輸出鬧鐘信號(hào) 是否到鬧鐘時(shí)間 設(shè)置鬧鐘分鐘 設(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ù)位鍵,模式選擇按鈕,鬧鐘開(kāi)關(guān)檔,調(diào)節(jié)按 鈕 ,12—24小時(shí)切換檔 output [7:0]DMH,DML,DHH,DHL; //4個(gè)數(shù)碼管顯示輸入信號(hào) output dian,bao_signal,nao_signal; //時(shí)分間隔點(diǎn),報(bào)時(shí)信號(hào),鬧鐘信號(hào) output [3:0]DSH,DSL; //秒鐘輸出信號(hào) 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種不同頻率的時(shí)鐘信號(hào) key_press u2(_10ms,MODE,Keydone1); //模式檔按鈕去抖動(dòng) key_press u20(_10ms,BT2,Keydone2); //調(diào)節(jié)按鈕去除抖動(dòng) mode u3(Keydone1,mode_flag); //通過(guò)模式按鈕產(chǎn)生不同模式 second u4(_1HZ,reset,mode_flag,Keydone2,SH24,SL24,co1); //秒計(jì)時(shí) minute u5(co11,reset,MH24,ML24,co2); //分計(jì)時(shí) hour u6(co22,reset,HH24,HL24); //小時(shí)計(jì)時(shí) SEG7_LUT u7(DML,ML); //4個(gè)數(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小時(shí)切換 boshi u15(HH,HL,MH,ML,SH,SL,_1HZ,bao_signal); //整點(diǎn)報(bào)時(shí) set_naozhong u16(co111,co222,set_HH,set_HL,set_MH,set_ML,set_co2); //設(shè)置鬧鐘時(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);//通過(guò)模式選擇數(shù)碼管顯示 LED_mode u19(mode_flag,SH24,SL24,SH,SL); 模式選擇LED燈顯示 Endmodule 分頻模塊 : 分頻模塊的作用主要是要獲得各種頻率的時(shí)鐘信號(hào)。輸入信號(hào)為50MHZ的信號(hào),要想獲得1HZ的信號(hào)作為秒脈沖計(jì)時(shí),則要對(duì)50MHZ信號(hào)分頻。通過(guò)計(jì)數(shù)的方式,當(dāng)計(jì)數(shù)從0開(kāi)始到24 999999時(shí),1HZ信號(hào)取反一次,計(jì)數(shù)又從0開(kāi)始,如此循環(huán),就可以得到1HZ脈沖信號(hào)。對(duì)于其他信號(hào)也是如此,只是計(jì)數(shù)值不一樣,得到的分頻信號(hào)不同。 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 計(jì)時(shí)模塊: 秒計(jì)數(shù):在1HZ脈沖下進(jìn)行秒計(jì)時(shí),當(dāng)計(jì)時(shí)達(dá)到59秒后,在下一個(gè)脈沖來(lái)臨變0,并發(fā)出一個(gè)脈沖信號(hào),可供下面分鐘計(jì)數(shù)作為輸入脈沖信號(hào)計(jì)時(shí)。 分鐘計(jì)數(shù):在輸入脈沖下,分鐘開(kāi)始計(jì)時(shí),當(dāng)計(jì)時(shí)達(dá)到59后,在下一個(gè)脈沖來(lái)臨變0,并發(fā)出一個(gè)脈沖,供小時(shí)計(jì)數(shù)的輸入脈沖新號(hào)。 小時(shí)計(jì)數(shù):脈沖信號(hào)來(lái)臨時(shí),計(jì)數(shù)加1,達(dá)到23后在下一個(gè)脈沖的作用下清零,從新計(jì)時(shí)。如果有復(fù)位信號(hào),則時(shí)分秒全部清零。 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 模式選擇模塊 : 同過(guò)一個(gè)模式檔按鍵MODE,按一下產(chǎn)生對(duì)應(yīng)一種模式mode_flag,并且可以循環(huán)。在不同的模式下可以進(jìn)行不同的操作。其中mode_flag=40000為正常顯示計(jì)時(shí),mode_flag=40001為小時(shí)調(diào)鐘模式,mode_flag=400010為分鐘調(diào)鐘模,mode_flag=40011為鬧鐘小時(shí)設(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小時(shí)切換模塊: 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 整點(diǎn)報(bào)時(shí)模塊: 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ù)碼管顯示:通過(guò)傳入響應(yīng)的4位十進(jìn)制數(shù),運(yùn)用case語(yǔ)句轉(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è)計(jì)過(guò)程常見(jiàn)問(wèn)題: (1) 要注意編寫(xiě)程序的過(guò)程中begin和end配對(duì)問(wèn)題,類(lèi)似于C語(yǔ)言中的括號(hào)匹配問(wèn)題,在編寫(xiě)計(jì)數(shù)模塊時(shí)編譯不通過(guò),最后檢查出是缺少一個(gè)end結(jié)束符號(hào),經(jīng)修改后編譯通過(guò)。(2)Verilog HDL語(yǔ)言編寫(xiě)時(shí)的語(yǔ)法問(wèn)題。在最初的計(jì)時(shí)模塊的程序設(shè)計(jì)中,將小時(shí)、分鐘的調(diào)節(jié)信號(hào)放在了另外的一個(gè)always語(yǔ)句塊中,編譯無(wú)法通過(guò),經(jīng)查閱資料,在Verilog HDL語(yǔ)言的編寫(xiě)中應(yīng)該注意不同的always語(yǔ)句塊不可以對(duì)同一個(gè)變量進(jìn)行操作,即一個(gè)變量不可以經(jīng)過(guò)兩個(gè)always語(yǔ)句塊操作。將對(duì)小時(shí)和分鐘調(diào)節(jié)信號(hào)的操作與計(jì)時(shí)放在同一個(gè)語(yǔ)句塊中,編譯通過(guò)。 (3) 數(shù)碼管剛開(kāi)始時(shí)顯示于實(shí)際計(jì)數(shù)不一樣,主要是由譯碼錯(cuò)誤造成的原因。數(shù)碼管一開(kāi)始不變化,說(shuō)明計(jì)數(shù)沒(méi)有進(jìn)行,是由于分鐘的輸入脈沖信號(hào)錯(cuò)誤引起。 心得體會(huì) 這次的課程設(shè)計(jì)結(jié)束了,在這次的設(shè)計(jì)中我學(xué)會(huì)了很多東西。首先是對(duì)Verilog HDL語(yǔ)言的設(shè)計(jì)思想有了深入理解,將這種自頂向下的設(shè)計(jì)理念運(yùn)用于實(shí)踐中,設(shè)計(jì)多功能數(shù)字鐘,突出了Verilog HDL作為硬件描述語(yǔ)言的良好可讀性和可移植性,對(duì)上學(xué)期所學(xué)的而理論知識(shí)有了深刻的理解。 其次是對(duì)Verilog HDL語(yǔ)言的語(yǔ)法熟悉,在這次的課程設(shè)計(jì)中,我學(xué)習(xí)到很多Verilog HDL語(yǔ)言的語(yǔ)法知識(shí),比如在兩個(gè)不同的語(yǔ)句塊中不能對(duì)同一個(gè)變量進(jìn)行操作,比如在用Verilog HDL語(yǔ)言中編寫(xiě)程序時(shí)要注意begin和end語(yǔ)句的匹配問(wèn)題,在使用Verilog HDL語(yǔ)言時(shí)不可以使用中文注釋等等。對(duì)于這種語(yǔ)言的學(xué)習(xí)也有了很大的幫助。 最后是設(shè)計(jì)作品時(shí)的設(shè)計(jì)邏輯和設(shè)計(jì)思想,在選擇不同的系統(tǒng)方案時(shí)要綜合考慮,選擇最優(yōu)方案。各個(gè)模塊的實(shí)現(xiàn)也要考慮綜合情況而制定出最符合實(shí)際情況的實(shí)現(xiàn)方案,方案間要進(jìn)行對(duì)比、實(shí)踐,最終確定。 在這次的課程設(shè)計(jì)中我不僅學(xué)習(xí)到有關(guān)程序編寫(xiě)以及設(shè)計(jì)方面的邏輯思維,對(duì)系統(tǒng)功能的實(shí)現(xiàn)也有了較為深入的了解,對(duì)各模塊的調(diào)試等也學(xué)習(xí)到不少東西,總之,從這次設(shè)計(jì)中學(xué)到很多東西,也鞏固了我的理論學(xué)習(xí)。- 1.請(qǐng)仔細(xì)閱讀文檔,確保文檔完整性,對(duì)于不預(yù)覽、不比對(duì)內(nèi)容而直接下載帶來(lái)的問(wèn)題本站不予受理。
- 2.下載的文檔,不會(huì)出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請(qǐng)點(diǎn)此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
9.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁(yè)顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開(kāi)word文檔。
- 特殊限制:
部分文檔作品中含有的國(guó)旗、國(guó)徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計(jì)者僅對(duì)作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- verilog 數(shù)字 設(shè)計(jì) FPGA
鏈接地址:http://zhongcaozhi.com.cn/p-6690300.html