⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 alarm.v

📁 用verlog HDL写的电子日历,可以显示年,月,日和时间,具有闹铃的功能
💻 V
字号:
/*闹钟定时和整点报时子模块 */        
module alarm(clk_4Hz,clk_1KHz,disp_mode,sec,min,hour,set_ahr,set_amin,set,amin,ahour,alarm,ear,alarm2);          
  input clk_4Hz,clk_1KHz;    // clk_4Hz为标准时钟信号,来自clkdiv250.v的输出;clk_1KHz为产生闹铃音、报时音的时钟信号
  input[1:0] disp_mode;		 // 显示模式,来自route.v的输出
  input set_ahr,set_amin;    // 来自route.v,为设置闹钟定时中的分或小时的时钟信号
  input set;                 // 设置计数初值信号,每按一次,计数器加1;若按住set键不放,可屏蔽闹铃音(这里只用来屏蔽闹铃音) 
  input[7:0] sec,min,hour; 
  output amin,ahour;		 // BCD计数器,用于设置闹钟定时中的分钟和小时
  output alarm;              // 输出到扬声器的信号,用于产生闹铃音和整点报时音
  output alarm2,ear;         // 便于仿真
  reg[7:0] amin,ahour;       
  reg[1:0] loop1,num1;       // 中间变量,用于设置初值时连续快速加1
  reg[1:0] sound;			 // 计数器,用来确定ear为1或0
  reg alarm1,alarm2,ear;	 // 中间变量,alarm1,alarm2分别用于产生闹铃信号和整点报时信号,ear用于产生或屏蔽整点报时音

// ----(1)闹钟定时中的小时设置  
  always @(posedge set_ahr)            
    begin
      if(disp_mode==3)                 // =3时为闹钟定时               
        begin
          if(ahour==8'h23)             // 若计到23小时
            ahour[7:0]<=0;
          else 
            begin
              if(ahour[3:0]==9)
                begin
                  ahour[3:0]<=0;
                  ahour[7:4]<=ahour[7:4]+1;
                end
              else ahour[3:0]<=ahour[3:0]+1;
            end
        end
      else ahour[7:0]<=0; 
    end

//----(2)闹钟定时中的分设置
  always @(posedge set_amin)
    begin
      if(disp_mode==3)                
        begin
          if(amin==8'h59)             // 若计到59分
            amin[7:0]<=0;
          else 
            begin
              if(amin[3:0]==9)
                begin
                  amin[3:0]<=0;
                  amin[7:4]<=amin[7:4]+1;
                end
              else amin[3:0]<=amin[3:0]+1;
            end
        end
      else amin[7:0]<=0; 
    end

//----(3)闹铃功能  
  always @(posedge clk_4Hz)               
    if(disp_mode==0)                // 在正常计时状态下
      if ((min==amin)&&(hour==ahour)&&(amin||ahour)&&(!set)) // 按住set键不放,可屏蔽闹铃音
        if(sec<=8'h20) alarm1<=1;              // 闹铃为持续20s的嘀嘀音
        else alarm1<=0;
      else alarm1<=0;
    else alarm1<=0;

//----(4)整点报时功能  
always @(posedge clk_4Hz)          
   begin
     if(sound==3)			//ear信号(周期为1s)用于产生或屏蔽整点报时音 
       begin
         sound<=0;
         ear<=1;
       end
     else
       begin
         sound<=sound+1;
         ear<=0;
       end
  end
always @(posedge clk_4Hz)  		//产生整点报时信号alarm2        
   begin
     if((min==8'h59)&&(sec>8'h55)||(!(min||sec)))		//如果计到超过59分55秒,或者达到0分0秒
       if(sec>8'h54) alarm2<=ear&clk_1KHz; 				//如果计到超过59分55秒,则产生频率为1KHz的短音(四声)
       else alarm2<=!ear&clk_1KHz;						//如果达到0分0秒,则产生长音(一声)
     else                      
       alarm2<=0;
   end

assign alarm=((alarm1)? clk_4Hz :0) | alarm2;
      // 当alarm1为1时,以4Hz的频率产生闹铃音:alarm=clk_4Hz;在scheme1中此句为assign alarm=((alarm1)? clk_4Hz&clk_1KHz :0) | alarm2;
      // 当alarm1为0时,alarm=alarm2,若计到整点的时间,则产生四短一长的报时音
endmodule 
/* 注1:在(2)中语句if(disp_mode==3)保证只有其值为3时,set_ahr或set_amin可设置ahour或amin;
        而在其他情况下set_ahr或set_amin对ahour或amin无

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -