ISE實現(xiàn)多功能數(shù)字鐘設(shè)計_第1頁
ISE實現(xiàn)多功能數(shù)字鐘設(shè)計_第2頁
ISE實現(xiàn)多功能數(shù)字鐘設(shè)計_第3頁
ISE實現(xiàn)多功能數(shù)字鐘設(shè)計_第4頁
ISE實現(xiàn)多功能數(shù)字鐘設(shè)計_第5頁
已閱讀5頁,還剩22頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

任務規(guī)定用FPGA器件和EDA技術(shù)實現(xiàn)多功能數(shù)字鐘旳設(shè)計?;竟δ芤?guī)定:能顯示小時、分鐘、秒鐘(時、分用7段LED顯示屏,秒用LED燈)。小時計數(shù)器為同步24進制;規(guī)定手動校時、校分。擴展功能規(guī)定:任意時刻鬧鐘;小時顯示(12/24)切換電路自動報整點時數(shù)。建立工程在ISE14,9軟件中建立名為clock旳工程文獻。芯片系列選擇Spatan3E,具體芯片型號選擇XC3S100E,封裝類型選擇CP132,速度信息選擇-5。原理設(shè)計頂層模塊設(shè)計創(chuàng)立名為top_clock旳文獻,本設(shè)計中頂層模塊用于調(diào)用各個子模塊,以及將鬧鐘與整點報時模塊綜合在內(nèi),頂層源碼如下:moduletop_clock(??inputHchange,? ? ?//24小時,12小時切換信號 ?inputChange, ??? //用來進行時分和秒旳顯示切換 ?inputCLK_50, ? //50MHz時鐘??inputnCR,EN,Clock_EN,? inputAdj_Min,Adj_Hour,Adj_Clock,??//使能信號,小時分鐘調(diào)時容許信號,鬧鐘使能信號(撥鈕開關(guān))? output[6:0]HEX0,? outputregLed_Alarm,??outputreg[3:0]HEX????//共陽極數(shù)碼管相應端??);? regAlarm; ?wireENM_L,ENM_H,ENH; wire[7:0]Hour_24,TMinute,TSecond,CHour,CMinute;//中間變量聲明,正常時鐘變量和鬧鐘時鐘變量??wire[7:0]Hour_12,Display_HourT,Display_HourAdjust;? reg[3:0]bcd=4'b0000;??//記載數(shù)碼管所要顯示旳數(shù)據(jù) ?reg[7:0]Display_Hour,Minute;regLD_6_RADIO;reg[7:0]sum,counter; ?supply1Vdd;wireCP_1Hz;??//===========分頻============= ?Divider50MHzU0(.CLK_50M(CLK_50),? ? ?.nCLR(nCR),? ? ? .CLK_1HzOut(CP_1Hz));//用以時鐘計數(shù)旳CP? defparamU0.N=25,?? U0.CLK_Freq=50000000,? ? U0.OUT_Freq=1; ??? Divider50MHzU1(.CLK_50M(CLK_50), ?? ???.nCLR(nCR),???? .CLK_1HzOut(CP_200Hz));//用以動態(tài)掃描旳CP,供應數(shù)碼管??defparamU1.N=18,? ?U1.CLK_Freq=50000000,? ?U1.OUT_Freq=200; ??? //===========60進制秒計數(shù)器=========? Scounter10S0(TSecond[3:0],nCR,EN,CP_1Hz);//秒:個位??Scounter6S1(TSecond[7:4],nCR,(TSecond[3:0]==4'h9),CP_1Hz);//秒:十位??//===========60進制分計數(shù)器========= Mcounter10M0(TMinute[3:0],nCR,ENM_L,EN,CP_1Hz);//分:個位??Mcounter6M1(TMinute[7:4],nCR,ENM_H,EN,CP_1Hz);//分:十位??assignENM_L=Adj_Min?Vdd:(TSecond==8'h59);//分鐘按書上CP調(diào)時 assignENM_H=(Adj_Min&&(TMinute[3:0]==4'h9))||(TMinute[3:0]==4'h9)&&(TSecond==8'h59);//24小時制?counter24H0(Hour_24[7:4],Hour_24[3:0],nCR,ENH,EN,CP_1Hz); ?assignENH=Adj_Hour?Vdd:((TMinute==8'h59)&&(TSecond==8'h59));? //===========12小時與24小時進制切換控制========== assignDisplay_HourAdjust=((Hour_24==8'h20)||(Hour_24==8'h21))?(Hour_24-24):(Hour_24-18);? assignHour_12=(Hour_24<8'h13)?Hour_24:Display_HourAdjust; ?assignDisplay_HourT=Hchange?Hour_12:Hour_24; //===========鬧鐘============??//----------時鐘秒--------- //counter60CCS(nCR,CP_1Hz,EN,CSecond[7:4],CSecond[3:0]); //----------時鐘分---------?counter60CCM(nCR,CP_1Hz,CMin_EN,CMinute[7:4],CMinute[3:0]);?//--產(chǎn)生分使能信號--?assignCMin_EN=(!EN&&Adj_Clock&&Adj_Min); //----------時鐘時---------?Counter24CCCH(nCR,CP_1Hz,CHour_EN,CHour[7:4],CHour[3:0]);?//--產(chǎn)生時使能信號--?assignCHour_EN=(?。臢&&Adj_Clock&&Adj_Hour);?//--鬧鐘響-- always@(ENorClock_EN)//鬧鐘開關(guān)?begin ?if(EN&&Clock_EN&&(CHour==Display_HourT)&&(CMinute==TMinute))Alarm<=1; elseAlarm<=0;?end always@(posedgeCLK_50ornegedgeENornegedgeAlarm)//表達鬧鐘旳LED?begin? if(~EN)Led_Alarm<=0; ?else ?begin ? ?if(~Alarm)Led_Alarm<=0; ??elseLed_Alarm<=~Led_Alarm; end end //alarm_clockAL0(Hour24,Minute,CP_1Hz,Set_Alarm,Close_clock,nCR,KeySet_Hour_ev,KeySet_Minute_ev,LD_7,Alarm_Hour,Alarm_Minute); ?//===========數(shù)碼顯示=========? always@(Adj_Clock)//擬定數(shù)碼管顯示鬧鐘還是正常時鐘 begin if(Adj_Clock)beginDisplay_Hour<=CHour;Minute<=CMinute;end elsebeginDisplay_Hour<=Display_HourT;Minute<=TMinute;end?end ?? ?always@(posedgeCP_200Hz)? begin ? if(Change==1) ? //數(shù)碼管進行時分顯示 ?? begin ? ? case(HEX)? 4'b1110:beginHEX<=4'b0111;bcd<=Display_Hour[7:4];end //第一根數(shù)碼管顯示小時十位 ??? ? ?4'b0111:beginHEX<=4'b1011;bcd<=Display_Hour[3:0];end //第二根顯示小時個位 ? ??4'b1011:beginHEX<=4'b1101;bcd<=Minute[7:4];end //第三根顯示分鐘十位 ? ? 4'b1101:beginHEX<=4'b1110;bcd<=Minute[3:0];end ?//第四根顯示分鐘個位 ? ? ?default:beginHEX<=0111;bcd<=Display_Hour[7:4];end??? ?endcase ? ?end ?else ??? ?//數(shù)碼管進行秒顯示,change為低電平時顯示秒? begin ? case(HEX) ??? 4'b1110:beginHEX<=4'b1101;bcd<=TSecond[7:4];end ?//第三根顯示秒十位?? ??4'b1101:beginHEX<=4'b1110;bcd<=TSecond[3:0];end ?//第四根顯示秒個位 ???default:beginHEX<=1101;bcd<=TSecond[7:4];end ? ? endcase???end ?end? SEG7_LUTL0(HEX0,bcd); ?//調(diào)用數(shù)碼管子函數(shù)//======整點報時==========assignLD_6=LD_6_RADIO;??always@(CP_1Hz) beginif((Minute[7:0]==8'h00)&&(counter[7:0]<(Hour_24[7:4]*10+Hour_24[3:0])))?beginLD_6_RADIO<=CP_1Hz;?endelse beginLD_6_RADIO<=0; endendalways@(posedgeCP_1Hz)if(Minute[7:0]==8'h00)begincounter[7:0]<=counter[7:0]+1'b1;endelsebegincounter[7:0]<=8'h00; end ?endmodule頂層模塊設(shè)計圖子模塊設(shè)計50MHz分頻器moduleDivider50MHz(CLK_50M,nCLR,CLK_1HzOut);?parameterN=25;??????//位寬 parameterCLK_Freq=50000000; //50MHz時鐘輸入 parameterOUT_Freq=1;??? //1Hz時鐘輸出 input nCLR,CLK_50M; ? //輸入端口闡明 outputregCLK_1HzOut; ???//輸出端口闡明?reg[N-1:0]Count_DIV; ?? //內(nèi)部節(jié)點,寄存計數(shù)器旳輸出值?always@(posedgeCLK_50MornegedgenCLR) begin if(!nCLR)beginCLK_1HzOut<=0;Count_DIV<=0;end ?else begin? ? ?if(Count_DIV<(CLK_Freq/(2*OUT_Freq)-1))//計數(shù)器模? ? Count_DIV<=Count_DIV+1'b1;??//分頻器計數(shù)加1 ?? elsebegin ? ? Count_DIV<=0;? //分頻器輸出清零? ?CLK_1HzOut<=~CLK_1HzOut; ?//輸出信號取反 ?end? ?end?endendmodule秒模10計數(shù)器moduleScounter10(Q,nCR,EN,CP); inputCP,nCR,EN;?outputQ; reg[3:0]Q; always@(posedgeCPornegedgenCR)?begin ?if(~nCR)Q<=4'b0000;//異步清零 ?elseif(~EN)Q<=Q;//暫停計數(shù)??elseif(Q==4'b1001)Q<=4'b0000;??elseQ<=Q+1'b1;?end秒模6計數(shù)器moduleScounter6(Q,nCR,EN,CP); inputCP,nCR,EN; outputQ;?reg[3:0]Q;?always@(posedgeCPornegedgenCR) begin if(~nCR)Q<=4'b0000;//異步清零 elseif(~EN)Q<=Q;//暫停計數(shù)??elseif(Q==4'b0101)Q<=4'b0000; elseQ<=Q+1'b1; end分模10計數(shù)器moduleMcounter10(Q,nCR,EN1,EN2,CP);?inputCP,nCR,EN1,EN2;?outputQ; reg[3:0]Q;?always@(posedgeCPornegedgenCR) begin??if(~nCR)Q<=4'b0000;//異步清零 ?elseif(~EN1||!EN2)Q<=Q;//暫停計數(shù)??elseif(Q==4'b1001)Q<=4'b0000;? elseQ<=Q+1'b1;?end分模6計數(shù)器moduleMcounter6(Q,nCR,EN1,EN2,CP);?inputCP,nCR,EN1,EN2; outputQ;?reg[3:0]Q; always@(posedgeCPornegedgenCR)?begin? if(~nCR)Q<=4'b0000;//異步清零 elseif(~EN1||~EN2)Q<=Q;//暫停計數(shù) ?elseif(Q==4'b0101)Q<=4'b0000;??elseQ<=Q+1'b1; end模24計數(shù)器modulecounter24(CntH,CntL,nCR,EN1,EN2,CP);?inputCP,nCR,EN1,EN2;?outputreg[3:0]CntH,CntL;//小時旳十位和個位輸出 always@(posedgeCPornegedgenCR) begin? if(~nCR){CntH,CntL}<=8'h00; ? //異步清零 ?elseif(~EN1||~EN2){CntH,CntL}<={CntH,CntL};//暫停計數(shù) elseif((CntH)>2||(CntL>9)||(CntH)==2&&(CntL)>=3)?{CntH,CntL}<=8'h00;? //對小時計數(shù)器出錯時旳解決? elseif((CntH)==2&&(CntL)<3)??? //進行20~23計數(shù)? beginCntH<=CntH;CntL<=CntL+1'b1;end elseif(CntL==9)??????? //小時十位旳計數(shù)? beginCntH<=CntH+1'b1;CntL<=4'b0000;end else??beginCntH<=CntH;CntL<=CntL+1'b1;end?endendmodule模60計數(shù)器modulecounter60(nCLR,Clk,EN,CntH,CntL); inputnCLR,Clk,EN;outputreg[3:0]CntH,CntL; always@(posedgeClkornegedgenCLR)?begin? if(~nCLR)? {CntH,CntL}<=0;//異步清零 ?elseif(~EN)? ?{CntH,CntL}<={CntH,CntL};//暫停信號 elseif(((CntH>5)||(CntL>9))||((CntH==5)&&(CntL==9))) {CntH,CntL}<=8'h00;//異常解決 ?elseif(CntL==9) beginCntH<=CntH+1'b1;CntL<=0;end//十位計數(shù) else? beginCntH<=CntH;CntL<=CntL+1'b1;end//個位計數(shù)?endendmodule數(shù)碼管顯示moduleSEG7_LUT(oSEG,iDIG); input[3:0]iDIG; ??//二進制輸入 outputreg[6:0]oSEG;//7段碼輸出?always@(iDIG)?begin??case(iDIG)? ?4'h0:oSEG=7'b000_0001; ? 4'h1:oSEG=7'b100_1111;? 4'h2:oSEG=7'b001_0010;?? 4'h3:oSEG=7'b000_0110;? 4'h4:oSEG=7'b100_1100; ? 4'h5:oSEG=7'b010_0100; 4'h6:oSEG=7'b010_0000; ?4'h7:oSEG=7'b000_1111;? 4'h8:oSEG=7'b000_0000; ? 4'h9:oSEG=7'b000_0100; ??default:oSEG=7'b1111111; ?endcase endendmodule各模塊仿真模10計數(shù)器測試代碼://Inputs regnCR;?regEN;?regCP;?//Outputs wire[3:0]Q;?//Instantiat(yī)etheUnitUnderTest(UUT) counter10uut( ?.Q(Q),??.nCR(nCR), ?.EN(EN),.CP(CP)?);parameterPERIOD=40;//時鐘信號周期設(shè)立為40nsalwaysbeginCP=1'b0;#(PERIOD/2)CP=1'b1;#(PERIOD/2);end?initialbegin //InitializeInputs??nCR=0; EN=1; ?CP=1;? //Wait100nsforglobalresettofinish? #100;nCR=1; ?//Addstimulushere?endendmodule模6計數(shù)器測試代碼:?//Inputs regnCR;?regEN;?regCP; //Outputs?wire[3:0]Q; //Instantiat(yī)etheUnitUnderTest(UUT) counter6uut( ?.Q(Q),??.nCR(nCR),??.EN(EN),? .CP(CP) );parameterPERIOD=40;//時鐘信號周期設(shè)立為40nsalwaysbeginCP=1'b0;#(PERIOD/2)CP=1'b1;#(PERIOD/2);end?initialbegin //InitializeInputs? nCR=0; ?EN=1; CP=1; //Wait100nsforglobalresettofinish ?#100; nCR=1; //Addstimulushere endendmodule模24計數(shù)器測試代碼://Inputs regnCR;?regEN;?regCP; //Outputs?wire[3:0]CntH;?wire[3:0]CntL;?//InstantiatetheUnitUnderTest(UUT)?counter24uut( ?.CntH(CntH),? .CntL(CntL), .nCR(nCR), .EN(EN),? .CP(CP) );parameterPERIOD=40;//時鐘信號周期設(shè)立為40nsalwaysbeginCP=1'b0;#(PERIOD/2)CP=1'b1;#(PERIOD/2);end initialbegin? //InitializeInputs? nCR=0; EN=1; CP=1; //Wait100nsforglobalresettofinish? #100;nCR=1;? //Addstimulushere endendmodule模60計數(shù)器測試代碼://Inputs regnCLR; regClk; regEN; //Outputs?wire[3:0]CntH; wire[3:0]CntL;?//Instantiat(yī)etheUnitUnderTest(UUT) counter60uut(? .nCLR(nCLR), .Clk(Clk), .EN(EN),??.CntH(CntH),??.CntL(CntL)?);parameterPERIOD=40;//時鐘信號周期設(shè)立為40nsalwaysbeginClk=1'b0;#(PERIOD/2)Clk=1'b1;#(PERIOD/2);end initialbegin ?//InitializeInputs ?nCLR=0;??Clk=1; ?EN=1;??//Wait100nsforglobalresettofinish??#100;? nCLR=1; ?//Addstimulushere?endendmodule引腳分派NET"CLK_50"TNM_NET=CLK_50;TIMESPECTS_CLK_50=PERIOD"CLK_50"20nsHIGH50%;NET"CLK_50"LOC=B8;NET"nCR"LOC=P11;NET"EN"LOC=L3;NET"Adj_Min"LOC=K3;NET"Adj_Hour"LOC=B4;NET"Change"LOC=G3;NET"Led_Alarm"LOC=N4;NET"Adj_Clock"LOC=E2;NET"Clock_EN"LOC=N3;NET"HEX0[6]"LOC=L14;NET"HEX0[5]"

溫馨提示

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

最新文檔

評論

0/150

提交評論