zhaorj8780 发表于 2012-12-29 14:10

自己编的数字钟,哪里分享,初学不要笑我欧

可以显示时,分,秒,具有五个按键,一个复位,一个小时加,一个小时减,一个分钟加,一个分钟减。

zhaorj8780 发表于 2012-12-29 14:11

module clk_1k(inputclk, outputCPout);
reg Cout;
reg CP_En;
always @(posedge clk )                        //将50MHz分频为1kHz
        begin
if(Cout==32'd25000)
begin
Cout<=32'd0;
CP_En<=~CP_En;
end
else
Cout<=Cout+32'd1;
    end
assign CPout=CP_En;
endmodule

zhaorj8780 发表于 2012-12-29 14:12

module ctl( clk,S1,S2,S3,S4,RST,Hour1,Minute1,Second1,Hour2,Minute2,Second2,LED );

input clk,S1,S2,S3,S4,RST;
//CPout=50M,Cpout=1kHz,S1和S2分别用来调整小时和分钟,RST用来进行复位

output Hour1,Hour2;//小时显示数
output Minute1,Minute2;//分显示数
output Second1,Second2;//秒显示数
output LED;//整点报时灯

reg Hour11,Hour21;
reg Minute11,Minute21;
reg Second11,Second21;


reg LED1;
reg S1_r,S1_n,S2_r,S2_n,RST_r,RST_n;//用于按键去抖动
reg S3_r,S3_n,S4_r,S4_n;

reg cnt; //按键去抖动计数用
reg Cout;
reg Clk_En;//用于分频,产生1HZ的记时时钟
always @ (posedge clk)
cnt <= cnt+1'b1;   //循环计数
always @(posedge clk)
if(cnt==20'hfffff)
begin
S1_n<=S1;
S2_n<=S2;
RST_n<=RST;
S3_n<=S3;
S4_n<=S4;
end
always @(posedge clk)
begin
S1_r<=S1_n;
S2_r<=S2_n;
RST_r<=RST_n;
S3_r<=S3_n;
S4_r<=S4_n;
end

wire S1_f=(~S1_n)&S1_r;
wire S2_f=(~S2_n)&S2_r;
wire S3_f=(~S3_n)&S3_r;
wire S4_f=(~S4_n)&S4_r;
wire RST_f=(~RST_n)&RST_r;//按键去抖动所用

always@(posedge clk)      
begin
              if(S1_f==1)//对小时的控制
                          begin
                                if((Hour11<4'b1001)&&(Hour21<4'b0010))
                          begin
                          Hour11<=Hour11+4'b0001;
                                   end
                          else if((Hour11<4'b0011)&&(Hour21==4'b0010))
                             Hour11<=Hour11+4'b0001;
                          else
                          begin
                          Hour11<=4'b0000;
                          if(Hour21<4'b0010)
                          Hour21<=Hour21+4'b0001;
                          else
                          begin
                          Hour21<=4'b0000;
                          end
                          end
                       end
                 if(S3_f==1)//对小时的控制
                          begin
                                if(Hour11>4'b0000)
                          begin
                          Hour11<=Hour11-4'b0001;
                                   end
                          else if((Hour11==4'b0000)&&(Hour21>4'b0000))
                             begin
                             Hour11<=4'b1001;
                             Hour21<=Hour2-4'b0001;
                             end
                          else
                          begin
                          Hour11<=4'b0011;
                          Hour21<=4'b0010;
                          end
                       end
                        if(S2_f==1)//对分钟的控制
                        begin
                                if(Minute11<4'b1001)
                                        Minute11<=Minute11+4'b0001;
                                else
                                  begin
                               Minute11<=4'b0000;
                                  if(Minute21<4'b0101)
                                  Minute21<=Minute21+4'b0001;
                                  else
                                  Minute21<=4'b0000;
                                  end                               
                        end
             if(S4_f==1)//对分钟的控制
                        begin
                                if(Minute11>4'b0000)
                                        Minute11<=Minute11-4'b0001;
                                else
                                  if((Minute21>4'b0000)&&(Minute11==4'b0000))
                                   begin
                                  Minute21<=Minute21-4'b0001;
                                  Minute11<=4'b1001;
                                   end
                                  else
                                  begin
                                  Minute21<=4'b0101;
                                  Minute11<=4'b1001;
                                  end                               
                        end
                        if(RST_f==1)//清零
                        begin
                                Hour11<=4'b0000;
                                Minute11<=4'b0000;
                                Second11<=4'b0000;
                                Hour21<=4'b0000;
                                Minute21<=4'b0000;
                                Second21<=4'b0000;
                        end
         
          Cout<=(Cout==26'd5000_0000)?26'd0:(Cout + 26'd1);
                Clk_En<=(Cout==26'd5000_0000)?1'b1:1'b0;//分频,产生1Hz的时钟信号
if(Clk_En)
   begin                                               
                begin
                        if(Second11<4'b1001)//时间自动运行
                                begin
                                Second11<=Second11+4'b0001;
                                end
                        else
                        begin
                Second11<=4'b0000;
                        if(Second21<4'b0101)
                        begin
                                Second21<=Second21+4'b0001;
                        end
                        else
                          begin   
                           Second21<=4'b0000;
                          end
                   end
                end
                       
             begin
                     if((Second21==4'b0101)&&(Second11==4'b1001))
                        begin
                                if(Minute11<4'b1001)
                                        begin
                                        Minute11<=Minute11+4'b0001;
                                        end
                                else
                                begin
                                Minute11<=4'b0000;
                                if(Minute21<4'b0101)
                          begin
                          Minute21<=Minute21+4'b0001;
                          end
                          else
                          begin
                          Minute21<=4'b0000;
                          end
                          end
                        end
               end
                        begin
                        if((Second21==4'b0101)&&(Second11==4'b1001)&&(Minute21==4'b0101)&&(Minute11==4'b1001))
                     begin
                if((Hour11<4'b1001)&&(Hour21<4'b0010))
                          begin
                          Hour11<=Hour11+4'b0001;
                                   end
                          else if((Hour11<4'b0011)&&(Hour21==4'b0010))
                             Hour11<=Hour11+4'b0001;
                          else
                          begin
                          Hour11<=4'b0000;
                             if(Hour21<4'b0010)
                          Hour21<=Hour21+4'b0001;
                             else
                             Hour21<=4'b0000;
                          end
                           end
                   end
       
                        if((Minute21==4'b0101)&&(Minute11==4'b1001)&&(Second11>4'b0101)&&(Second21==4'b0101))//整点倒计时
                        begin
                                if(LED1==1)
                                        LED1<=0;
                                else
                                        LED1<=1;
                        end
                        else
                                LED1<=0;
        end
end
assign Second1=Second11;
assign Second2=Second21;
assign Minute1=Minute11;
assign Minute2=Minute21;
assign Hour1=Hour11;
assign Hour2=Hour21;
assign LED=LED1;
endmodule

zhaorj8780 发表于 2012-12-29 14:13

module display( clk,Hour1,Minute1,Second1,Hour2,Minute2,Second2,SEL,LEDAG);

inputclk;
inputHour1,Minute1,Second1,Hour2,Minute2,Second2;
output SEL;
reg    SEL_n;
output LEDAG;
reg SEL_r;
reg Led;
parameter   seg0    = 8'hc0,//共阳七段数码管的值seg0    = 8'h3f,
            seg1    = 8'hf9,//seg1    = 8'h06,
            seg2    = 8'ha4,//seg2    = 8'h5b,
            seg3    = 8'hb0,//seg2    = 8'h4f,
            seg4    = 8'h99,//seg4    = 8'h66,
            seg5    = 8'h92,//seg5    = 8'h6d,
            seg6    = 8'h82,//seg6    = 8'h7d,
            seg7    = 8'hf8,//seg7    = 8'h07,
            seg8    = 8'h80,//seg8    = 8'h7f,
            seg9    = 8'h90,//seg9    = 8'h6f;
            dian    = 8'h7f;
always @(posedge clk )
        begin
                if(SEL_r==3'b000)          //判断位选SEL的值,并将此位上的值输出到数码管
                        case(Second1)
                        4'b0000:      Led <= seg0;
                                4'b0001:      Led <= seg1;
                                4'b0010:      Led <= seg2;
                                4'b0011:      Led <= seg3;
                                4'b0100:      Led <= seg4;
                                4'b0101:      Led <= seg5;
                                4'b0110:      Led <= seg6;
                                4'b0111:      Led <= seg7;
                                4'b1000:      Led <= seg8;
                                4'b1001:      Led <= seg9;
                                default:      Led <= seg0;
                        endcase
                if(SEL_r==3'b001)
                        case(Second2)
                        4'b0000:      Led <= seg0;
                                4'b0001:      Led <= seg1;
                                4'b0010:      Led <= seg2;
                                4'b0011:      Led <= seg3;
                                4'b0100:      Led <= seg4;
                                4'b0101:      Led <= seg5;
                                4'b0110:      Led <= seg6;
                                4'b0111:      Led <= seg7;
                                4'b1000:      Led <= seg8;
                                4'b1001:      Led <= seg9;
                                default:      Led <= seg0;
                        endcase
      if(SEL_r==3'b010)
            Led<=dian;
                if(SEL_r==3'b011)
                        case(Minute1)
                        4'b0000:      Led <= seg0;
                                4'b0001:      Led <= seg1;
                                4'b0010:      Led <= seg2;
                                4'b0011:      Led <= seg3;
                                4'b0100:      Led <= seg4;
                                4'b0101:      Led <= seg5;
                                4'b0110:      Led <= seg6;
                                4'b0111:      Led <= seg7;
                                4'b1000:      Led <= seg8;
                                4'b1001:      Led <= seg9;
                                default:      Led <= seg0;
                        endcase   

                if(SEL_r==3'b100)
                        case(Minute2)
                        4'b0000:      Led <= seg0;
                                4'b0001:      Led <= seg1;
                                4'b0010:      Led <= seg2;
                                4'b0011:      Led <= seg3;
                                4'b0100:      Led <= seg4;
                                4'b0101:      Led <= seg5;
                                4'b0110:      Led <= seg6;
                                4'b0111:      Led <= seg7;
                                4'b1000:      Led <= seg8;
                                4'b1001:      Led <= seg9;
                                default:      Led <= seg0;
                        endcase
      if(SEL_r==3'b101)
            Led<=dian;
                if(SEL_r==3'b110)
                        case(Hour1)
                        4'b0000:      Led <= seg0;
                                4'b0001:      Led <= seg1;
                                4'b0010:      Led <= seg2;
                                4'b0011:      Led <= seg3;
                                4'b0100:      Led <= seg4;
                                4'b0101:      Led <= seg5;
                                4'b0110:      Led <= seg6;
                                4'b0111:      Led <= seg7;
                                4'b1000:      Led <= seg8;
                                4'b1001:      Led <= seg9;
                                default:      Led <= seg0;
                        endcase   

                if(SEL_r==3'b111)
                        case(Hour2)
                        4'b0000:      Led <= seg0;
                                4'b0001:      Led <= seg1;
                                4'b0010:      Led <= seg2;
                                4'b0011:      Led <= seg3;
                                4'b0100:      Led <= seg4;
                                4'b0101:      Led <= seg5;
                                4'b0110:      Led <= seg6;
                                4'b0111:      Led <= seg7;
                                4'b1000:      Led <= seg8;
                                4'b1001:      Led <= seg9;
                                default:      Led <= seg0;
                        endcase   
    end
always @(posedge clk )
      SEL_r<=SEL_r+3'b001;
always @(posedge clk )
begin
    case(SEL_r)
    3'b000:SEL_n<=8'b0111_1111;
    3'b001:SEL_n<=8'b1011_1111;
    3'b010:SEL_n<=8'b1101_1111;
    3'b011:SEL_n<=8'b1110_1111;
    3'b100:SEL_n<=8'b1111_0111;
    3'b101:SEL_n<=8'b1111_1011;
    3'b110:SEL_n<=8'b1111_1101;
    3'b111:SEL_n<=8'b1111_1110;
    endcase
end
assign                 LEDAG=Led;       
assign       SEL=SEL_n;
endmodule

GoldSunMonkey 发表于 2012-12-29 23:29

感谢分享

梅花望青竹 发表于 2013-1-4 18:01

可以使用NIOsII 试一试
页: [1]
查看完整版本: 自己编的数字钟,哪里分享,初学不要笑我欧