数电——闹钟

闹钟

module clock(key_0,key_1,key_2,Q1,Q2,Q3,Q4,min,s,clock,buzzer  );
    input  key_0;//分键
    input  key_1;//秒键
    input  key_2;//启动,暂停键,key_2=0暂停,key_2=1启动
    output reg [5:0]min=6'd0;
    output reg[5:0] s=6'd0;   
    output  reg [6:0] Q1;
    output reg [6:0] Q2;
    output reg[6:0] Q3;
    output reg [6:0]Q4;
    input clock;
   reg [3:0]min_shi;
   reg [3:0]min_ge;
   reg [3:0]s_shi;
   reg [3:0]s_ge;
    reg zheng;                                                                                                                                                                                                                                                                                                                                                                                                   
    reg count=0;//count=1开始计时,count=0停止计时
    reg set=0;//设置状态,如果为1,则为设置状态
    output reg buzzer=0;//蜂鸣器,当为1的时候蜂鸣,为0的时候停止
    always@(posedge key_0 or posedge key_1)//分键或者秒键变化之后执行
    begin
        if((key_0&key_1)==1)//如果同时按下分键与秒键
         begin
            count=0;//停止计数
             set=1;//转到设置状态
            min=6'd0;s=6'd0;//重置
         end
        if((set&!(key_1&key_0)==1))//此时到设置状态
         begin
             if(key_0==1)//如果分键按下
                begin
                    if(min==6'd99)
                        min=6'd0;
                    else
                         min=min+6'd1;
                 end
             else if(key_1==1)//如果秒键按下
                begin
                    if(s==6'd59)
                     s=6'd0;
                     else
                     s=s+6'd1;
                 end
           end
  end
 always@(set)
   begin
    if(min==6'd0&&s==6'd0)
      zheng=1;
    else
      zheng=0;
    end

always@(posedge clock)//按下启动暂停键之后,使其随时间计数
    if(count==1)//如果启动键为1,则开始计时
     begin
       if(zheng==1)//正计时
         begin
           if(s<6'd59)
           s=s+1;
           else if(s==6'd59)
           begin
            s=6'd0;
            min=min+1;
          end
         end
   else//倒计时
 begin
   begin
      if(s>6'd0)
       s=s-6'd1;
      else if(s==6'd0&&min!=6'd0)
       begin
       s=6'd59;
       min=min-6'd1;
       end
       else
       begin
       buzzer=1;//当分秒都为1时,蜂鸣器响
       end
    end
    end
    end
always@( posedge key_2)//如果按下启动暂停键
   begin
    if(buzzer==1)
     begin
      buzzer<=0;
       set<=1;
       count<=0;
     end
   else
    begin
     count<=~count;//每按一次计时取反
     set<=0;//此时如果在设置状态,跳出设置状态
    end
   end
always@(min)
  begin
  min_shi<=min/10;
  min_ge<=min%10;
  end
always@(s)
  begin
  s_shi<=s/10;
  s_ge<=s%10;
  end
always @ (min_shi)
  case(min_shi)
   4'b0000: Q1<=7'b0111111;
   4'b0001: Q1<=7'b0000110;
   4'b0010: Q1<=7'b1011011;
   4'b0011: Q1<=7'b1001111;
   4'b0100: Q1<=7'b1100110;
   4'b0101: Q1<=7'b1101101;
   4'b0110: Q1<=7'b1111101;
   4'b0111: Q1<=7'b0000111;
   4'b1000: Q1<=7'b1111111;
   4'b1001: Q1<=7'b1101111;
  default: Q1<=7'b0000000;
  endcase
  always @ (min_ge)
  case(min_ge)
   4'b0000: Q2<=7'b0111111;
   4'b0001: Q2<=7'b0000110;
   4'b0010: Q2<=7'b1011011;
   4'b0011: Q2<=7'b1001111;
   4'b0100: Q2<=7'b1100110;
   4'b0101: Q2<=7'b1101101;
   4'b0110: Q2<=7'b1111101;
   4'b0111: Q2<=7'b0000111;
   4'b1000: Q2<=7'b1111111;
   4'b1001: Q2<=7'b1101111;
  default: Q2<=7'b0000000;
  endcase
  always @ (s_shi)
  case(s_shi)
   4'b0000: Q3<=7'b0111111;
   4'b0001: Q3<=7'b0000110;
   4'b0010: Q3<=7'b1011011;
   4'b0011: Q3<=7'b1001111;
   4'b0100: Q3<=7'b1100110;
   4'b0101: Q3<=7'b1101101;
   4'b0110: Q3<=7'b1111101;
   4'b0111: Q3<=7'b0000111;
   4'b1000: Q3<=7'b1111111;
   4'b1001: Q3<=7'b1101111;
  default: Q3<=7'b0000000;
  endcase
  always @ (s_ge)
  case(s_ge)
   4'b0000: Q4<=7'b0111111;
   4'b0001: Q4<=7'b0000110;
   4'b0010: Q4<=7'b1011011;
   4'b0011: Q4<=7'b1001111;
   4'b0100: Q4<=7'b1100110;
   4'b0101: Q4<=7'b1101101;
   4'b0110: Q4<=7'b1111101;
   4'b0111: Q4<=7'b0000111;
   4'b1000: Q4<=7'b1111111;
   4'b1001: Q4<=7'b1101111;
  default: Q4<=7'b0000000;
  endcase

endmodule

2.testbench文件记录

module test_clock( );
wire [6:0] Q1;
wire [6:0] Q2;
wire [6:0] Q3;
wire [6:0] Q4;
reg key_0;
reg key_1;
reg key_2;
wire [5:0]min;
wire [5:0]s;
reg clock;
wire buzzer;

clock unit(.buzzer(buzzer),.clock(clock),.Q1(Q1),.Q2(Q2),.Q3(Q3),.Q4(Q4),.key_0(key_0),.key_1(key_1),.key_2(key_2),.min(min),.s(s));
initial
begin
clock=0;//倒计数
key_2=0;
key_0=0;key_1=0;
#10 key_0=1;key_1=1;
#10 key_0=~key_0;key_1=0;
#10 key_0=~key_0;
#10 key_0=~key_0;
#10 key_0=~key_0;
#10 key_0=~key_0;
#10 key_0=~key_0;
#10 key_0=~key_0;
#10 key_0=~key_0;
#10 key_0=~key_0;
#10 key_0=~key_0;
#10 key_0=~key_0;
#10 key_1=~key_1;
#10 key_1=~key_1;
#10 key_1=~key_1;
#10 key_1=~key_1;
#10 key_1=~key_1;
#10 key_1=~key_1;
#10 key_2=1;
#10 key_2=0;
#10 key_2=1;
#10 key_2=0;
#10 key_2=1;
#10 key_2=0;
#7000 key_2=1;
#10 key_2=0;

end
always #10 clock=~clock;
endmodule

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值