Spartan-6 -XC6SLX9/Verilog 數字鐘

module digitalclk(
             input clk,//時鐘
             input reset,//復位
             input set_m,//分鐘調時
             input set_h,//時鐘較時
             output reg [3:0]hour_g=0,//時鐘數的個位
             output reg [3:0]hour_s=0,//時鐘數的十位
             
             output reg[3:0]minute_g,//分數的個位
             output reg[3:0]minute_s,//分數的十位
            
             output reg [3:0]second_g,//秒個位
             output reg [3:0]second_s,//秒十位
             
             output reg[6:0]ds_reg,//接數碼管
             output reg[3:0]ds_en, //數碼管選擇
             output reg DS_DP
       );
            
            
            reg [31:0]cnt;
 //聲明常量           
parameter [6:0]NUM_0=7'b0111111;
parameter [6:0]NUM_1=7'b0000110;
parameter [6:0]NUM_2=7'b1011011;
parameter [6:0]NUM_3=7'b1001111;
parameter [6:0]NUM_4=7'b1100110;
parameter [6:0]NUM_5=7'b1101101;
parameter [6:0]NUM_6=7'b1111101;
parameter [6:0]NUM_7=7'b0000111;
parameter [6:0]NUM_8=7'b1111111;
parameter [6:0]NUM_9=7'b1101111;
parameter [6:0]NUM_BLK=7'b0000000;

parameter [3:0]EN_1=4'b1110;
parameter [3:0]EN_2=4'b1101;
parameter [3:0]EN_3=4'b1011;
parameter [3:0]EN_4=4'b0111;
parameter [3:0]EN_A=4'b0000;

    
always@(posedge clk or negedge reset)
begin  
    if(reset==0)//清零
    begin
    hour_g<=0;
    hour_s<=0;
    minute_g<=0;
    minute_s<=0;
    second_g<=0;
    second_s<=0;    
    end
    else
    begin
      if(cnt==50000000)//時間達到一秒-50000000*20ns(默認時鐘爲50Hz,週期爲20ns)
         begin
            cnt<=0;
                if(set_m==0)//設置分鐘
                begin
                    if(minute_g==9)
                    begin 
                        minute_g<=0;
                        if(minute_s==5)
                            minute_s<=0;
                        else 
                            minute_s<=minute_s+1; 
                    end
                    else
                            minute_g<=minute_g+1;
                end
                if(set_h==0)//設置小時
                begin
                    if(hour_g==9)
                    begin //
                        hour_g<=0;
                        hour_s<=hour_s+1; 
                    end//
                    else
                    begin 
                        if(hour_g==3 && hour_s==2)
                        begin 
                            hour_g<=0;hour_s<=0;
                        end 
                        else 
                            hour_g<=hour_g+1;
                    end
                end
                if(second_g==9)//05
                    begin
                    second_g<=0;
                    
                    if(second_s==5)//04
                        begin
                        
                        second_s<=0;
                        if(minute_g==9)//03
                            begin
                            minute_g<=0;
                            if(minute_s==5)//02
                                begin
                                minute_s<=0;
                                    if(hour_g==3&&hour_s==2)
                                        begin
                                        hour_g<=0;
                                        hour_s<=0;
                                        end
                                    else 
                                        begin 
                                        if(hour_g==9)//01
                                                    begin hour_g<=0;hour_s<=hour_s+1;end//00
                                              else
                                                    hour_g<=hour_g+1;//01                            
                                        end
                                end
                            else
                                minute_s<=minute_s+1;//02
                            end
                        else
                            minute_g<=minute_g+1;//03    
                        end
                    else
                        second_s<=second_s+1;//04
                    end
                else 
                    begin second_g<=second_g+1;DS_DP<=1;end//05
        end
          else
        begin cnt<=cnt+1;DS_DP<=0;end;
      end     
end
            
//數碼管動態顯示(時:分)
always @(*)
    begin
        
        if(cnt[16:15] == 2'b00)//選任意幾位其實都可以,關鍵是弄清楚掃描頻率:當掃描頻率大於25Hz,肉眼將看不出變化
            case (hour_s)
            4'h0 :   begin ds_reg = NUM_0; ds_en=EN_1;end
            4'h1 :   begin ds_reg = NUM_1; ds_en=EN_1;end
            4'h2 :   begin ds_reg = NUM_2; ds_en=EN_1;end
            4'h3 :   begin ds_reg = NUM_3; ds_en=EN_1;end
            4'h4 :   begin ds_reg = NUM_4; ds_en=EN_1;end
            4'h5 :   begin ds_reg = NUM_5; ds_en=EN_1;end
            4'h6 :   begin ds_reg = NUM_6; ds_en=EN_1;end
            4'h7 :   begin ds_reg = NUM_7; ds_en=EN_1;end
            4'h8 :   begin ds_reg = NUM_8; ds_en=EN_1;end
            4'h9 :   begin ds_reg = NUM_9; ds_en=EN_1;end
            
            default: begin ds_reg = NUM_BLK; ds_en=EN_1;end
            endcase  
        if(cnt[16:15] == 2'b01)
            case (hour_g)
            4'h0 :   begin ds_reg = NUM_0; ds_en=EN_2;end
            4'h1 :   begin ds_reg = NUM_1; ds_en=EN_2;end
            4'h2 :   begin ds_reg = NUM_2; ds_en=EN_2;end
            4'h3 :   begin ds_reg = NUM_3; ds_en=EN_2;end
            4'h4 :   begin ds_reg = NUM_4; ds_en=EN_2;end
            4'h5 :   begin ds_reg = NUM_5; ds_en=EN_2;end
            4'h6 :   begin ds_reg = NUM_6; ds_en=EN_2;end
            4'h7 :   begin ds_reg = NUM_7; ds_en=EN_2;end
            4'h8 :   begin ds_reg = NUM_8; ds_en=EN_2;end
            4'h9 :   begin ds_reg = NUM_9; ds_en=EN_2;end
            
            default: begin ds_reg = NUM_BLK; ds_en=EN_2;end
            endcase  
        if(cnt[16:15] == 2'b10)
            case (minute_s)
            4'h0 :   begin ds_reg = NUM_0; ds_en=EN_3;end
            4'h1 :   begin ds_reg = NUM_1; ds_en=EN_3;end
            4'h2 :   begin ds_reg = NUM_2; ds_en=EN_3;end
            4'h3 :   begin ds_reg = NUM_3; ds_en=EN_3;end
            4'h4 :   begin ds_reg = NUM_4; ds_en=EN_3;end
            4'h5 :   begin ds_reg = NUM_5; ds_en=EN_3;end
            4'h6 :   begin ds_reg = NUM_6; ds_en=EN_3;end
            4'h7 :   begin ds_reg = NUM_7; ds_en=EN_3;end
            4'h8 :   begin ds_reg = NUM_8; ds_en=EN_3;end
            4'h9 :   begin ds_reg = NUM_9; ds_en=EN_3;end
            
            default: begin ds_reg = NUM_BLK; ds_en=EN_3;end
            endcase  
        if(cnt[16:15] == 2'b11)
            case (minute_g)
            4'h0 :   begin ds_reg = NUM_0; ds_en=EN_4;end
            4'h1 :   begin ds_reg = NUM_1; ds_en=EN_4;end
            4'h2 :   begin ds_reg = NUM_2; ds_en=EN_4;end
            4'h3 :   begin ds_reg = NUM_3; ds_en=EN_4;end
            4'h4 :   begin ds_reg = NUM_4; ds_en=EN_4;end
            4'h5 :   begin ds_reg = NUM_5; ds_en=EN_4;end
            4'h6 :   begin ds_reg = NUM_6; ds_en=EN_4;end
            4'h7 :   begin ds_reg = NUM_7; ds_en=EN_4;end
            4'h8 :   begin ds_reg = NUM_8; ds_en=EN_4;end
            4'h9 :   begin ds_reg = NUM_9; ds_en=EN_4;end
            
            default: begin ds_reg = NUM_BLK; ds_en=EN_4;end
            endcase  
    end 


endmodule

/*.ucf文件*/

NET "clk" LOC = P56;

#KEY
#NET "KEY2" LOC = P21;
NET "set_m" LOC = P17;
NET "set_h" LOC = P16;
NET "reset" LOC = P15;
#

#DIGITAL CUBE
NET "DS_DP" LOC =P85;
NET "ds_reg[6]" LOC = P84;
NET "ds_reg[2]" LOC = P83;
NET "ds_reg[3]" LOC = P82;
NET "ds_reg[4]" LOC = P81;
NET "ds_reg[0]" LOC = P80;
NET "ds_reg[1]" LOC = P79;
NET "ds_reg[5]" LOC = P78;

NET "ds_en[0]" LOC = P66;
NET "ds_en[1]" LOC = P74;
NET "ds_en[2]" LOC = P67;
NET "ds_en[3]" LOC = P75;
#

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章