实验 7 数字钟设计

本文详细描述了一个使用EDA开发的数字钟的设计过程,包括时钟功能、校准机制、LED数码管显示以及电路实现。设计中涉及计数器、按键控制和24小时制计数规则,展示了如何使用HDL编写顶层电路图和模块代码,以及如何进行测试和分析。
摘要由CSDN通过智能技术生成

7.1 实 验 目 的

设计一个具有时功能和校的数字钟。

7.2 实 验 仪 器 与 器 材

1. EDA 开发软件 一 套

2.微机 一 台

3.实验开发系统 一 台

4.打印机 一 台

5.其他器件与材料 若 干

7.3 实 验 说 明

用 数码管显示小时 、 分 钟 和 秒钟。 三 个 按键用于时钟校准。 K1 用 与切换 正 常 计 时 , 校 准 小 时 和 分 钟 。 K2 用 于 时钟的 “+”。 K3 用 于 时钟的 “-”。 校准相应 的刻度,该数码管闪烁。

7.4 实 验 要 求

1. 1 分 钟 =60 秒 ; 当 秒 钟 计时为 59 时 , 分 钟 计 数 +1;

 2. 1 小 时 =60 分 钟 ;当 分 钟 计时为 59,并且秒到分再次进位时,时钟计数个位 加 1;分钟计数置位为 0;

3. 显 示 为 24 小时制,当 时 钟计数十位 小 于 2 时 , 时钟个位计数到计数到 9 时 , 分钟到 时 钟 再次进位 时 , 十 位 加 1;

4. 24 小时制计满归零 ,23:59:59 时 ,秒 到 分 再 次 进 位 时 ,时 、分 、秒 三 部 分 计 数均归零。

7.5 实 验 报 告 要 求

1. 写出全部设计文件。

module clock(

input rst,

input clk0,

output reg [6:0] led1,

output reg [6:0] led2,

output reg [6:0] led3,

output reg [6:0] led4,

output reg [6:0] led5,

output reg [6:0] led6,

input wire k1, // 切换键

input wire k2, // 加键

input wire k3, // 减键

output reg led);

reg clk1;

wire clk;

reg [30:0] counter;

parameter COUNTER_MAX = 25000000;  // 计数器最大值,控制时钟频率

reg [5:0]s;

reg [5:0]f;

reg [5:0]m;

reg [5:0]count;

reg [5:0]m1;

reg [5:0]m2;

reg [5:0]f1;

reg [5:0]f2;

reg [5:0]s1;

reg [5:0]s2;

reg [23:0] blink_counter = 0; // 24位计数器用于闪烁

reg blink = 0;

reg k;

initial

       begin

              s=0;

              f=0;

              m=0;

              count=0;

              clk1=0;

              led=1;

       end

//时钟   

always @(posedge clk0 or  negedge rst) begin

    if (!rst) begin

        counter <= 0;

    end

        else begin

        if (counter == COUNTER_MAX -31'b1) begin

            counter <= 0;

            clk1 <= clk1+1;  // 每达到计数器最大值时,翻转时钟信号

        end else begin

            counter <= counter + 1;

                           

        end

    end

end

assign clk=clk1;

always@(posedge clk )

begin

led=~led;

end

//电子时钟

always@(posedge clk  )

begin

       if(count==6'b111100)

       begin

      

       count=6'b000001;

       end

       else

       count=count+6'b000001;

end

      

always @ (posedge k1) begin

  k <=  k+ 1;

    if (k == 3) begin

        k <= 0;

    end

end

      

always@(posedge clk  )

begin

       m=count;

      

        if(!rst)

              begin

                     s<=0;

                     f<=0;

                     m<=0;

              end

       else if(m==6'b111100)

              begin

                m=0;

                     if(m==0)f<=f+6'b1;

                     if(f==6'b111100)

                            begin

                                  

                                   f<=0;

                                   if(f==0)s<=s+6'b1;

                                   if(s==6'b011000)

                                          begin

                                                 f<=0;

                                                 m<=0;

                                                 s<=0;

                                          end

                            end

                end    

 case (k)

        1: begin // 校准时

            if (k2==1) begin // 加时

                s <= s + 6'b1;

                if (s == 6'b011000) begin

                   s <= 0;

                end

            end

            if (k3==1) begin // 减时

                if (s == 0) begin

                    s <= 6'b011000;

                end else begin

                    s <= s - 6'b1;

                end

            end

        end

        2: begin // 校准时

            if (k2==1) begin // 加时

                f <= f + 6'b1;

                if (f == 6'b111100) begin

                   f <= 0;

                end

            end

            if (k3==1) begin // 减时

                if (f == 0) begin

                    f<=6'b111100;

                end else begin

                    f <= f - 6'b1;

                end

            end

        end

    endcase

 end

// 闪烁逻辑

always @ (posedge clk0 or posedge rst)

begin

    if (rst)

        begin

        blink_counter <= 0;

        blink <= 0;

    end

        else

        begin

        if (k == 0)

                begin // 正常计时模式,不闪烁

            blink_counter <= 0;

            blink <= 0;

        end

                else

                begin // 校准模式,闪烁

            blink_counter <= blink_counter + 1;

            if (blink_counter == 500000)

                            begin // 闪烁频率为1Hz

                blink_counter <= 0;

                blink <= ~blink;

            end

        end

    end

end

//数码管

always @ ( posedge clk or negedge rst)

        begin

        m1=m%10;

              if (!rst)

                     led1 = 7'b0000000;

              else begin

              case (m1)

 6'b000000 : led1 = 7'b1000000;

 6'b000001 : led1 = 7'b1111001;

 6'b000010 : led1 = 7'b0100100;

 6'b000011 : led1 = 7'b0110000;

 6'b000100 : led1 = 7'b0011001;

 6'b000101 : led1 = 7'b0010010;

 6'b000110 : led1 = 7'b0000010;

 6'b000111 : led1 = 7'b1111000;

 6'b001000 : led1 = 7'b0000000;

 6'b001001 : led1 = 7'b0010000;

              default : led1 =7'b1000000;

              endcase

       end

end

always @ ( posedge clk or negedge rst)

        begin

        m2=m/10;

              if (!rst)

                     led2 = 6'b00000;

              else begin

              case (m2)

 6'b000000 : led2 = 7'b100_0000;

 6'b000001 : led2 = 7'b111_1001;

 6'b000010 : led2 = 7'b010_0100;

 6'b000011 : led2 = 7'b011_0000;

 6'b000100 : led2 = 7'b001_1001;

 6'b000101 : led2 = 7'b001_0010;

 6'b000110 : led2 = 7'b000_0010;

 6'b000111 : led2 = 7'b111_1000;

 6'b001000 : led2 = 7'b000_0000;

 6'b001001 : led2 = 7'b001_0000;

              default : led2 =7'b100_0000;

              endcase

       end

end

always @ ( posedge clk or negedge rst)

        begin

        f1=f%10;  

if (!rst)

                     led3 = 7'b0000000;

              else begin

              case (f1)

 6'b000000 : led3 = 7'b100_0000;

 6'b000001 : led3 = 7'b111_1001;

 6'b000010 : led3 = 7'b010_0100;

 6'b000011 : led3 = 7'b011_0000;

 6'b000100 : led3 = 7'b001_1001;

 6'b000101 : led3 = 7'b001_0010;

 6'b000110 : led3 = 7'b000_0010;

 6'b000111 : led3 = 7'b111_1000;

 6'b001000 : led3 = 7'b000_0000;

 6'b001001 : led3 = 7'b001_0000;

              default : led3 =7'b100_0000;

              endcase

      

 if (k == 1)

       begin // 校准时

              if (blink) led3 <= 7'b1111111;

       end

       end

end

always @ ( posedge clk or negedge rst)

        begin

        f2=f/10;

      

       if (!rst)

                     led4 = 7'b0000000;

              else begin

              case (f2)

 6'b000000 : led4 = 7'b100_0000;

 6'b000001 : led4 = 7'b111_1001;

 6'b000010 : led4 = 7'b010_0100;

 6'b000011 : led4 = 7'b011_0000;

 6'b000100 : led4 = 7'b001_1001;

 6'b000101 : led4 = 7'b001_0010;

 6'b000110 : led4 = 7'b000_0010;

 6'b000111 : led4 = 7'b111_1000;

 6'b001000 : led4 = 7'b000_0000;

 6'b001001 : led4 = 7'b001_0000;

              default : led4 =7'b100_0000;

              endcase

      

 if (k == 1)

       begin // 校准时

              if (blink) led4 <= 7'b1111111;

       end

end

end

always @ ( posedge clk or negedge rst)

        begin

        s1=s%10;

              if (!rst)

                     led5 = 6'b0000000;

              else begin

              case (s1)

 6'b000000 : led5 = 7'b100_0000;

 6'b000001 : led5 = 7'b111_1001;

 6'b000010 : led5 = 7'b010_0100;

 6'b000011 : led5 = 7'b011_0000;

 6'b000100 : led5 = 7'b001_1001;

 6'b000101 : led5 = 7'b001_0010;

 6'b000110 : led5 = 7'b000_0010;

 6'b000111 : led5 = 7'b111_1000;

 6'b001000 : led5 = 7'b000_0000;

 6'b001001 : led5 = 7'b001_0000;

              default : led5 =7'b100_0000;

              endcase 

   if (k == 1)

         begin // 校准时

               if (blink) led5 <= 7'b1111111;

         end

         end

end

always @ ( posedge clk or negedge rst)

        begin

        s2=s/10;

              if (!rst)

                     led6 = 7'b0000000;

              else begin

              case (s2)

 6'b000000 : led6 = 7'b100_0000;

 6'b000001 : led6 = 7'b111_1001;

 6'b000010 : led6 = 7'b010_0100;

 6'b000011 : led6 = 7'b011_0000;

 6'b000100 : led6 = 7'b001_1001;

 6'b000101 : led6 = 7'b001_0010;

 6'b000110 : led6 = 7'b000_0010;

 6'b000111 : led6 = 7'b111_1000;

 6'b001000 : led6 = 7'b000_0000;

 6'b001001 : led6 = 7'b001_0000;

              default : led6 =7'b100_0000;

              endcase

      

 if (k == 1)

       begin // 校准时

              if (blink) led6 <= 7'b1111111;

       end

end

end

endmodule

      

2.打印顶层电路图和主要模块的 HDL 文 件 。

 3.写出测试结果及分析

  `timescale 1ms / 1ms

module clocktb;

  reg clk, rst;

  wire[7:0]led1;

  wire[7:0]led2;

       wire[7:0]led3;

       wire[7:0]led4;

   wire[7:0]led5;

  wire[7:0]led6;

             

clock U1(.led1(led1),.clk(clk),.rst(rst),.led2(led2),.led3(led3),.led4(led4),.led5(led5),.led6(led6));

  initial begin

    {clk, rst} = 1'b0;

        #60000 rst=1'b1;

  

    forever #500 clk = ~clk;

  end

endmodule

可用视频展示进位时的效果

  • 22
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值