打印

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

[复制链接]
1588|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhaorj8780|  楼主 | 2012-12-29 14:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
zhaorj8780|  楼主 | 2012-12-29 14:11 | 只看该作者
module clk_1k(input  clk, output  CPout);
reg [31:0] 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 [3:0] Hour1,Hour2;  //小时显示数
output [3:0] Minute1,Minute2;//分显示数
output [3:0] Second1,Second2;//秒显示数
output LED;//整点报时灯

reg [3:0] Hour11,Hour21;  
reg [3:0] Minute11,Minute21;
reg [3:0] 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 [19:0] cnt; //按键去抖动计数用
reg [25:0] 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);

input  clk;
input  [3:0]Hour1,Minute1,Second1,Hour2,Minute2,Second2;
output [7:0]SEL;
reg    [7:0]SEL_n;
output [7:0]LEDAG;
reg [2:0] SEL_r;
reg [7:0] 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

使用特权

评论回复
5
GoldSunMonkey| | 2012-12-29 23:29 | 只看该作者
感谢分享

使用特权

评论回复
6
梅花望青竹| | 2013-1-4 18:01 | 只看该作者
可以使用NIOsII 试一试

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

17

帖子

0

粉丝