一、實(shí)現(xiàn)功能
1. 能正常完成時(shí)鐘的時(shí)、分、秒走時(shí);
2. 使用LED閃爍或者改變顏色等方式實(shí)現(xiàn)秒的指示,要求閃爍頻率或者顏色切換頻率為1Hz;
3. 使用兩位七段數(shù)碼管顯示時(shí)和分,其切換方式為:默認(rèn)顯示“分鐘”,按住K4鍵顯示“小時(shí)”,按下K3顯示秒針;
4. 關(guān)上開關(guān)sw2,使用K1和K2鍵調(diào)整時(shí)間,分別為“+”和“-”,則K1和K2調(diào)整“分鐘”,當(dāng)K4按下,則K1和K2調(diào)整“小時(shí)”,當(dāng)K3按下,則K1和K2調(diào)整“秒針”;
5. 整點(diǎn)報(bào)時(shí):當(dāng)時(shí)間到達(dá)每個(gè)整點(diǎn),則全彩LED以某種固定顏色按1Hz頻率閃爍相應(yīng)次數(shù)(按24小時(shí)制);
6. 鬧鐘設(shè)置,將sw3開關(guān)設(shè)置為1,開始設(shè)置固定時(shí)鐘和分鐘,當(dāng)時(shí)間計(jì)時(shí)到達(dá)時(shí),八個(gè)led燈閃爍一分鐘;
二、實(shí)驗(yàn)
1.整體結(jié)構(gòu)
2.主函數(shù)?
// Module Function:時(shí)鐘設(shè)計(jì)
?
module time_clock (clk,rst,seg_led_1,seg_led_2,led,key,sw2,sw3,led_rgb1,led_rgb2);
?
?? ?input clk,rst;
?? ?input [3:0]key;
? ? input sw2,sw3;
?? ?output reg [8:0] seg_led_1;
?? ?output reg [8:0] seg_led_2;?? ?
? ? output reg [7:0] led;
? ? output reg [2:0] led_rgb1=3'b 111;
? ? output reg [2:0] led_rgb2=3'b 111;
? ??
? ? ? ??
? ? ? ? reg ? [3:0] cnt1 ; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //定義了一個(gè)4位的計(jì)數(shù)器
? ? ? ? reg ? [3:0] count1;
? ? ? ? reg ? [3:0] count_set_1;
? ? ? ? reg ? [3:0] cnt2 ;
? ? ? ? reg ? [3:0] count2;
? ? ? ? reg ? [3:0] count_set_2;
? ? ? ? reg ? [3:0] cnt3 ; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //定義了一個(gè)4位的計(jì)數(shù)器
? ? ? ? reg ? [3:0] count3;
? ? ? ? reg ? [3:0] count_set_3;
? ? ? ? reg ? [3:0] cnt4 ;
? ? ? ? reg ? [3:0] count4;
? ? ? ? reg ? [3:0] count_set_4;
? ? ? ? reg ? [3:0] cnt5 ; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //定義了一個(gè)4位的計(jì)數(shù)器
? ? ? ? reg ? [3:0] count5;
? ? ? ? reg ? [3:0] count_set_5;
? ? ? ? reg ? [3:0] cnt6 ;
? ? ? ? reg ? [3:0] count6;
? ? ? ? reg ? [3:0] count_set_6;
? ? ? ? reg ? [30:0]count_1s;
? ? ? ? reg ? [30:0]count_05s;
? ? ? ? reg [15 : 0] count;
? ? ? ? reg [15 : 0] count0;
? ? ? ? reg [8:0] seg [9:0];?
? ? ?
? ? ? ? wire clk1s; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //定義一個(gè)中間變量,表示分頻得到的時(shí)鐘,用作計(jì)數(shù)器的觸發(fā) ? ? ? ?
? ? ? ??
? ? ? ??
? ? ? ? //間隔脈沖模塊,產(chǎn)生一個(gè) ? 秒針 ? ?時(shí)鐘信號(hào)
? ? ? ? parameter N1 = 12000000;
? ? always@(posedge clk) begin
? ? if(!rst)?
? ? ? ? count_1s <= 0;
? ? else if(count_1s == N1-1)
? ? ? ? count_1s<=0;
? ? else
? ? ? ? count_1s<= count_1s + 1;
? ? end
? ? //間隔脈沖模塊,產(chǎn)生一個(gè)調(diào)整 ?間隔 ? ? 信號(hào)時(shí)鐘信號(hào)
? ? parameter N2 = 1500000;
? ? always@(posedge clk) begin
? ? if(!rst)?
? ? ? ? count_05s <= 0;
? ? else if(count_05s == N2-1)
? ? ? ? count_05s<= 0;
? ? else
? ? ? ? count_05s<= count_05s + 1;
? ? end
? ? ? ?
? ? ?
? ? divide #(.WIDTH(32),.N(12000000)) u2 ( ? ? ? ? //傳遞參數(shù)
?? ??? ??? ?.clk(clk),
?? ??? ??? ?.rst_n(rst), ? ? ? ? ? ? ? ? ? //例化的端口信號(hào)都連接到定義好的信號(hào)
?? ??? ??? ?.clkout(clk1s)
?? ??? ??? ?); ??
? ? ?
? ? ?
? ? ? ?always @(posedge clk or negedge rst)
begin
? ? ? ? ? ??
? ? ? ? ? ? if (!rst) //---------------------------------------------異步清零
? ? ? ? ?? ? ? ? begin
? ? ? ? ?? ??? ? ? ?cnt1 <= 0;
? ? ? ? ?? ??? ? ? ?cnt2<=0;
? ? ? ? ?? ??? ? ? ?cnt3 <= 0;
? ? ? ? ?? ??? ? ? ?cnt4<=0;
? ? ? ? ?? ??? ? ? ?cnt5 <= 0;
? ? ? ? ?? ??? ? ? ?cnt6<=0;
? ? ? ? ?? ??? ? end
? ? ? ? ?? ?//----------------------------------------開始計(jì)時(shí)
? ? ? ? else
? ? ? ? begin
? ? ? ? ?? ?if(sw2==1)//sw2調(diào)整時(shí)間的開關(guān) ? 1:開始計(jì)時(shí) ? 0:調(diào)整時(shí)間 ? ?sw3為鬧鐘設(shè)置開關(guān) 設(shè)置鬧鐘模式sw3:1 ?退出設(shè)置鬧鐘模式sw3:0?
? ? ? ? ?? ?begin
? ? ? ? ? ? ? ? ? ? ? ? ? ? if(count_1s==N1-1 )
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ?begin
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ?//秒
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ? if((cnt2==5)&&(cnt1==9))
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ?begin
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ? ? ?cnt1<=0;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ? ? ?cnt2<=0;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ? ? ?//分鐘
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ? ? ?if((cnt4==5)&&(cnt3==9))
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ?begin
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ? ? ?cnt3<=0;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ? ? ?cnt4<=0;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ? ? ?//小時(shí)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ? ? ?if((cnt6==2)&&(cnt5==3))
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ?begin
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ? ? ?cnt5<=0;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ? ? ?cnt6<=0;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ? ? ?end
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ?else if(cnt5==9)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ? ? ?begin
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ? ? ?cnt5<=0;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ? ? ?cnt6<=cnt6+1;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ? ? ?end
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? else
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ?begin
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ?cnt5<=cnt5+1;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ?end
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ?//小時(shí)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ? ? ?end
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ?else if(cnt3==9)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ? ? ?begin
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ? ? ?cnt3<=0;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ? ? ?cnt4<=cnt4+1;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ? ? ?end
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? else
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ?begin
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ?cnt3<=cnt3+1;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ?end
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ? ? ?end
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ? ? ?//分鐘
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ?else if(cnt1==9)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ? ? ?begin
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ? ? ?cnt1<=0;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ? ? ?cnt2<=cnt2+1;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ? ? ?end
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? else
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ?begin
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ?cnt1<=cnt1+1;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ?end
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //秒
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? end
? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? end
? ? ? ? ? ? //-------------------------------------------------------------------暫停調(diào)整時(shí)間
? ? ? ? ? ? if(sw2==0 && sw3==0)
? ? ? ? ? ? begin
? ? ? ? ? ? ? ? if(key[2]==1 && key[3]==1)//-----------------------------------------------調(diào)整分針
? ? ? ? ? ? ? ? ? ? begin
? ? ? ? ? ? ? ? ? ? ? ? if( ?key[0]==0 )
? ? ? ? ? ? ? ? ? ? ? ? ? ? begin
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if(count_05s==N2-1)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? begin
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if((cnt4==5)&&(cnt3==9))
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ?begin
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ? ? ?cnt3<=0;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ? ? ?cnt4<=0;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ? ? ?end
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ?else if(cnt3==9 )
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ? ? ?begin
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ? ? ?cnt3<=0;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ? ? ?cnt4<=cnt4+1;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ? ? ?end
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ?else
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ?begin
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ?cnt3<=cnt3+1;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ?end
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? end
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? ? ? end
? ? ? ? ? ? ? ? ? ? ? ? else if(key[1]==0)
? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? begin
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if(count_05s==N2-1)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? begin
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if(cnt3==0 && cnt4==0)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? begin
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? cnt3<=9;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? cnt4<=5;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? end
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? else if(cnt3==0)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? begin
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? cnt3<=9;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? cnt4<=cnt4-1;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? end
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? cnt3<=cnt3-1;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? end
? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? end
? ? ? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? ? ? ? ? begin
? ? ? ? ? ? ? ? ? ? ? ? cnt3<=cnt3;
? ? ? ? ? ? ? ? ? ? ? ? cnt4<=cnt4;
? ? ? ? ? ? ? ? ? ? ? ? end
? ? ? ? ? ? ? ? ? ? end
? ? ? ? ? ??
? ? ? ? ? ? ? ? else if(key[2]==1 && key[3]==0)//-----------------------------------------------調(diào)整時(shí)針
? ? ? ? ? ? ? ? ? ? begin
? ? ? ? ? ? ? ? ? ? ? ? if( ?key[0]==0 )
? ? ? ? ? ? ? ? ? ? ? ? ? ? begin
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if(count_05s==N2-1)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? begin
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if((cnt6==2)&&(cnt5==3))
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ?begin
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ? ? ?cnt5<=0;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ? ? ?cnt6<=0;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ? ? ?end
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ?else if(cnt5==9)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ? ? ?begin
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ? ? ?cnt5<=0;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ? ? ?cnt6<=cnt6+1;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ? ? ?end
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ?else
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ?begin
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ?cnt5<=cnt5+1;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ?end
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? end
? ? ? ? ? ? ? ? ? ? ? ? ? ? end
? ? ? ? ? ? ? ? ? ? ? ? else if(key[1]==0)
? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? begin
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if(count_05s==N2-1)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? begin
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if(cnt5==0 && cnt6==0)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? begin
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? cnt5<=3;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? cnt6<=2;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? end
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? else if(cnt5==0)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? begin
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? cnt5<=9;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? cnt6<=cnt6-1;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? end
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? cnt5<=cnt5-1;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? end
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? ? ? end
? ? ? ? ? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? ? ? ? ? ? ? begin
? ? ? ? ? ? ? ? ? ? ? ? ? ? cnt5<=cnt5;
? ? ? ? ? ? ? ? ? ? ? ? ? ? cnt6<=cnt6;
? ? ? ? ? ? ? ? ? ? ? ? ? ? end
? ? ? ? ? ? ? ? ? ? end
? ? ? ? ? ? ? ? else if(key[2]==0 && key[3]==1)//-----------------------------------------------調(diào)整秒針
? ? ? ? ? ? ? ? ? ? begin
? ? ? ? ? ? ? ? ? ? ? ? if( ?key[0]==0 )
? ? ? ? ? ? ? ? ? ? ? ? ? ? begin
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if(count_05s==N2-1)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? begin
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if((cnt2==5)&&(cnt1==9))
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ?begin
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ? ? ?cnt1<=0;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ? ? ?cnt2<=0;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ? ? ?end
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ?else if(cnt1==9)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ? ? ?begin
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ? ? ?cnt1<=0;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ? ? ?cnt2<=cnt2+1;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ? ? ?end
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ?else
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ?begin
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ?cnt1<=cnt1+1;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ?end
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? end
? ? ? ? ? ? ? ? ? ? ? ? ? ? end
? ? ? ? ? ? ? ? ? ? ? ? else if(key[1]==0)
? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? begin
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if(count_05s==N2-1)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? begin
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if(cnt1==0 && cnt2==0)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? begin
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? cnt1<=9;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? cnt2<=5;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? end
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? else if(cnt1==0)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? begin
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? cnt1<=9;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? cnt2<=cnt2-1;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? end
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? cnt1<=cnt1-1;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? end
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? ? ? end
? ? ? ? ? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? ? ? ? ? ? ? begin
? ? ? ? ? ? ? ? ? ? ? ? ? ? cnt1<=cnt1;
? ? ? ? ? ? ? ? ? ? ? ? ? ? cnt2<=cnt2;
? ? ? ? ? ? ? ? ? ? ? ? ? ? end
? ? ? ? ? ? ? ? ? ? end
? ? ? ? ? ? ? ??
? ? ? ? ? ? end
? ? ? ? ? ? //-----------------------------------------------設(shè)置鬧鐘?
? ? ? ? ?
? ? ? ? ? ? if(sw3==1 )
? ? ? ? ? ? begin
? ? ? ? ? ? ? ? if(key[2]==1 && key[3]==1)//-----------------------------------------------調(diào)整分針
? ? ? ? ? ? ? ? ? ? begin
? ? ? ? ? ? ? ? ? ? ? ? if( ?key[0]==0 )
? ? ? ? ? ? ? ? ? ? ? ? ? ? begin
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if(count_05s==N2-1)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? begin
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if((count_set_4==5)&&(count_set_3==9))
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ?begin
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ? ? ?count_set_3<=0;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ? ? ?count_set_4<=0;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ? ? ?end
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ?else if(count_set_3==9 )
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ? ? ?begin
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ? ? ?count_set_3<=0;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ? ? ?count_set_4<=count_set_4+1;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ? ? ?end
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ?else
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ?begin
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ?count_set_3<=count_set_3+1;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ?end
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? end
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? ? ? end
? ? ? ? ? ? ? ? ? ? ? ? else if(key[1]==0)
? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? begin
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if(count_05s==N2-1)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? begin
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if(count_set_3==0 && count_set_4==0)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? begin
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? count_set_3<=9;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? count_set_4<=5;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? end
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? else if(count_set_3==0)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? begin
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? count_set_3<=9;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? count_set_4<=count_set_4-1;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? end
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? count_set_3<=count_set_3-1;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? end
? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? end
? ? ? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? ? ? ? ? begin
? ? ? ? ? ? ? ? ? ? ? ? count_set_3<=count_set_3;
? ? ? ? ? ? ? ? ? ? ? ? count_set_4<=count_set_4;
? ? ? ? ? ? ? ? ? ? ? ? end
? ? ? ? ? ? ? ? ? ? end
? ? ? ? ? ??
? ? ? ? ? ? ? ? else if(key[2]==1 && key[3]==0)//-----------------------------------------------調(diào)整時(shí)針
? ? ? ? ? ? ? ? ? ? begin
? ? ? ? ? ? ? ? ? ? ? ? if( ?key[0]==0 )
? ? ? ? ? ? ? ? ? ? ? ? ? ? begin
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if(count_05s==N2-1)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? begin
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if((count_set_6==2)&&(count_set_5==3))
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ?begin
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ? ? ?count_set_5<=0;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ? ? ?count_set_6<=0;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ? ? ?end
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ?else if(count_set_5==9)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ? ? ?begin
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ? ? ?count_set_5<=0;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ? ? ?count_set_6<=count_set_6+1;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ? ? ?end
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ?else
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ?begin
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ?count_set_5<=count_set_5+1;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ?end
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? end
? ? ? ? ? ? ? ? ? ? ? ? ? ? end
? ? ? ? ? ? ? ? ? ? ? ? else if(key[1]==0)
? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? begin
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if(count_05s==N2-1)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? begin
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if(count_set_5==0 && count_set_6==0)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? begin
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? count_set_5<=3;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? count_set_6<=2;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? end
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? else if(count_set_5==0)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? begin
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? count_set_5<=9;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? count_set_6<=count_set_6-1;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? end
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? count_set_5<=count_set_5-1;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? end
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? ? ? end
? ? ? ? ? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? ? ? ? ? ? ? begin
? ? ? ? ? ? ? ? ? ? ? ? ? ? count_set_5<=count_set_5;
? ? ? ? ? ? ? ? ? ? ? ? ? ? count_set_6<=count_set_6;
? ? ? ? ? ? ? ? ? ? ? ? ? ? end
? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? end
? ? ? ? ? ??
? ? ? ? ? ??
? ? ? ? ? ? end
? ? ? ? end ? ? ? ??
end
?//--------------------------------------------------------------------數(shù)碼管顯示
? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //在過程塊中只能給reg型變量賦值,Verilog中有兩種過程塊always和initial
? ? initial ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//initial和always不同,其中語句只執(zhí)行一次
?? ? ? ?begin
? ? ? ? ? seg[0] = 9'h3f; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //對存儲(chǔ)器中第一個(gè)數(shù)賦值9'b00_0011_1111,相當(dāng)于共陰極接地,DP點(diǎn)變低不亮,7段顯示數(shù)字 ?0
?? ? ? ? ?seg[1] = 9'h06; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //7段顯示數(shù)字 ?1
?? ? ? ? ?seg[2] = 9'h5b; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //7段顯示數(shù)字 ?2
?? ? ? ? ?seg[3] = 9'h4f; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //7段顯示數(shù)字 ?3
?? ? ? ? ?seg[4] = 9'h66; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //7段顯示數(shù)字 ?4
?? ? ? ? ?seg[5] = 9'h6d; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //7段顯示數(shù)字 ?5
?? ? ? ? ?seg[6] = 9'h7d; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //7段顯示數(shù)字 ?6
?? ? ? ? ?seg[7] = 9'h07; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //7段顯示數(shù)字 ?7
?? ? ? ? ?seg[8] = 9'h7f; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //7段顯示數(shù)字 ?8
?? ? ? ? ?seg[9] = 9'h6f; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //7段顯示數(shù)字 ?9
? ? ?end
always @(posedge clk)
begin?
? ? if(sw3==0)
? ? begin
? ? ? ? if(key[2]==1 && key[3]==0)
? ? ? ? ? ? begin
? ? ? ? ? ? count5<=cnt5;
? ? ? ? ? ? count6<=cnt6;
? ? ? ? ? ? seg_led_1<=seg[count6];
? ? ? ? ? ? seg_led_2<=seg[count5];?
? ??
? ? ? ? ? ? end
? ? ? ? else if(key[2]==0 && key[3]==1)
? ? ? ? begin
? ? ? ? ? ? count1<=cnt1;
? ? ? ? ? ? count2<=cnt2;
? ? ? ? ? ? seg_led_1<=seg[count2];
? ? ? ? ? ? seg_led_2<=seg[count1];?
? ? ? ? end
? ? ? ? else
? ? ? ? begin
? ? ? ? ? ? count4<=cnt4;
? ? ? ? ? ? count3<=cnt3;
? ? ? ? ? ? seg_led_1<=seg[count4];
? ? ? ? ? ? seg_led_2<=seg[count3];?
? ? ? ? end
? ? end
? ? else
? ? begin
? ? ? ? if(key[2]==1 && key[3]==0)
? ? ? ? ? ? begin
? ? ? ? ? ? count5<=count_set_5;
? ? ? ? ? ? count6<=count_set_6;
? ? ? ? ? ? seg_led_1<=seg[count6];
? ? ? ? ? ? seg_led_2<=seg[count5];?
? ??
? ? ? ? ? ? end
? ? ? ? else if(key[2]==0 && key[3]==1)
? ? ? ? begin
? ? ? ? ? ? count1<=count_set_1;
? ? ? ? ? ? count2<=count_set_2;
? ? ? ? ? ? seg_led_1<=seg[count2];
? ? ? ? ? ? seg_led_2<=seg[count1];?
? ? ? ? end
? ? ? ? else
? ? ? ? begin
? ? ? ? ? ? count4<=count_set_4;
? ? ? ? ? ? count3<=count_set_3;
? ? ? ? ? ? seg_led_1<=seg[count4];
? ? ? ? ? ? seg_led_2<=seg[count3];?
? ? ? ? end
? ? end
? ??
end
//--------------------------------------------整點(diǎn)--三色燈閃爍
always @(posedge clk1s)
begin
? ? led_rgb2[0]<=~led_rgb2[0];//--------------------------------------------三色燈秒鐘閃爍
? ? if(cnt3==0 && cnt4==0)
? ? ? ? begin
? ? ? ? ? ? led_rgb1[0]<=~led_rgb1[0];
? ? ? ? end
? ? else
? ? ? ? begin
? ? ? ? ? ? led_rgb1[0]<=1;
? ? ? ? ? ??
? ? ? ? end
? ? ? ??
end
//-------------------------------------------鬧鐘閃爍
always @(posedge clk1s)
begin
? ? if(count_set_3 == cnt3 && count_set_4 == cnt4 && count_set_5 == cnt5 && ?count_set_6 == cnt6)
? ? begin
? ? ? ? ? ??
? ? ? ? ? ? led<=~led;
? ? end ?
? ? else
? ? begin
? ? ? ? ? ? led<=8'b 11111111;
? ? end
end
??
endmodule
3.分頻器
// Module Function:任意整數(shù)時(shí)鐘分頻
module divide ( clk,rst_n,clkout);
input clk,rst_n; //輸入信號(hào),其中clk連接到FPGA的C1腳,頻率為12MHz
output clkout; //輸出信號(hào),可以連接到LED觀察分頻的時(shí)鐘
//parameter是verilog里常數(shù)語句
parameter WIDTH = 24; //計(jì)數(shù)器的位數(shù),計(jì)數(shù)的最大值為 2**WIDTH-1
parameter N = 12_000_000; //分頻系數(shù),請確保 N < 2**WIDTH-1,否則計(jì)數(shù)會(huì)溢出
reg [WIDTH-1:0] cnt_p,cnt_n; //cnt_p為上升沿觸發(fā)時(shí)的計(jì)數(shù)器,cnt_n為下降沿觸發(fā)時(shí)的計(jì)數(shù)器
reg clk_p,clk_n; //clk_p為上升沿觸發(fā)時(shí)分頻時(shí)鐘,clk_n為下降沿觸發(fā)時(shí)分頻時(shí)鐘
//上升沿觸發(fā)時(shí)計(jì)數(shù)器的控制
always @ (posedge clk or negedge rst_n ) //posedge和negedge是verilog表示信號(hào)上升沿和下降沿
//當(dāng)clk上升沿來臨或者rst_n變低的時(shí)候執(zhí)行一次always里的語句
begin
if(!rst_n)
cnt_p<=0;
else if (cnt_p==(N-1))
cnt_p<=0;
else cnt_p<=cnt_p+1; //計(jì)數(shù)器一直計(jì)數(shù),當(dāng)計(jì)數(shù)到N-1的時(shí)候清零,這是一個(gè)模N的計(jì)數(shù)器
end
//上升沿觸發(fā)的分頻時(shí)鐘輸出,如果N為奇數(shù)得到的時(shí)鐘占空比不是50%;如果N為偶數(shù)得到的時(shí)鐘占空比為50%
always @ (posedge clk or negedge rst_n)
begin
if(!rst_n)
clk_p<=0;
else if (cnt_p<(N>>1)) //N>>1表示右移一位,相當(dāng)于除以2去掉余數(shù)
clk_p<=0;
else
clk_p<=1; //得到的分頻時(shí)鐘正周期比負(fù)周期多一個(gè)clk時(shí)鐘
end
//下降沿觸發(fā)時(shí)計(jì)數(shù)器的控制
always @ (negedge clk or negedge rst_n)
begin
if(!rst_n)
cnt_n<=0;
else if (cnt_n==(N-1))
cnt_n<=0;
else cnt_n<=cnt_n+1;
end
//下降沿觸發(fā)的分頻時(shí)鐘輸出,和clk_p相差半個(gè)時(shí)鐘
always @ (negedge clk)
begin
if(!rst_n)
clk_n<=0;
else if (cnt_n<(N>>1))
clk_n<=0;
else
clk_n<=1; //得到的分頻時(shí)鐘正周期比負(fù)周期多一個(gè)clk時(shí)鐘
end
assign clkout = (N==1)?clk:(N[0])?(clk_p&clk_n):clk_p; //條件判斷表達(dá)式
//當(dāng)N=1時(shí),直接輸出clk
//當(dāng)N為偶數(shù)也就是N的最低位為0,N(0)=0,輸出clk_p
//當(dāng)N為奇數(shù)也就是N最低位為1,N(0)=1,輸出clk_p&clk_n。正周期多所以是相與
endmodule
4.廣角分配文章來源:http://www.zghlxwxcb.cn/news/detail-504655.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-504655.html
到了這里,關(guān)于FPGA小腳丫開發(fā)板實(shí)現(xiàn)數(shù)字時(shí)鐘,具備調(diào)時(shí)、整點(diǎn)報(bào)時(shí)、鬧鐘功能(含verilog代碼)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!