按键控制闹钟模块 Verilog 设计与原理
按键控制闹钟模块 Verilog 设计与原理
该模块通过按键设置闹钟的时、分,达到设定时间后,响起提示音;可以用按键开启或关闭闹钟,闹钟处于开启状态用 LED 灯显示。
//闹钟
input rst; // 复位信号
input key; // 按键信号
output reg led; // LED指示灯
output reg alarm_out; // 闹钟输出信号
// 定义闹钟设置模块
reg z1;
reg z2;
reg alarm_enable ; // 闹钟使能
reg [4:0] alarm_min ; // 闹钟分钟数
reg [3:0] alarm_hour ; // 闹钟小时数
reg [3:0] shif; //状态(调节时分)
always @(posedge clk) begin
if (rst) begin
alarm_enable <= 0;
alarm_min <= 0;
alarm_hour <= 0;
shif <= 0;
end else begin
if (key) begin // 按键按下
// 设置闹钟时间
if(key_flag1 && !z1) begin
shif <= shif+1;
if(shif==4) begin
shif <= 1;
end;
end;
if(shif==1) begin
if(key_flag2 && !z2) begin
alarm_min <= alarm_min+1;
if(alarm_min==60) begin
alarm_min <= 0;
end;
end;
end;
if(shif==2) begin
if(key_flag2 && !z2) begin
alarm_hour <= alarm_hour+1;
if(alarm_hour==24) begin
alarm_hour <= 0;
end;
end;
end;
alarm_enable <= 1;
end else begin // 按键释放
alarm_enable <= 0;
end
end
z1 <= key_flag1;
z2 <= key_flag2;
end
// 定义闹钟响铃模块
reg [4:0] ring_cnt = 0; // 响铃计数器
reg [30:0] cnto=0;
设计原理:
- 定义输入信号
rst和key,表示复位信号和按键信号。 - 定义输出信号
led和alarm_out,表示 LED 指示灯和闹钟输出信号。 - 定义
reg类型变量z1、z2、alarm_enable、alarm_min、alarm_hour、shif和ring_cnt,分别表示按键状态、闹钟使能、闹钟分钟数、闹钟小时数、状态(调节时分)和响铃计数器。 - 通过
always块和posedge时钟边沿触发,实现按键操作和闹钟设置。 - 当
rst=1时,将闹钟使能、闹钟分钟数、闹钟小时数和状态都清零。 - 当
key=1时,表示有按键按下,根据状态shif的值,决定按键的操作。当shif=1时,表示正在调节闹钟分钟数,按下key时,闹钟分钟数加 1,当达到 60 时,重置为 0。当shif=2时,表示正在调节闹钟小时数,按下key时,闹钟小时数加 1,当达到 24 时,重置为 0。同时,设置闹钟使能为 1,表示开启闹钟。 - 当
key=0时,表示按键释放,将闹钟使能设为 0,表示关闭闹钟。 - 在
always块中,还需要更新按键状态z1和z2。 - 定义响铃计数器
ring_cnt和计数器cnto,用于控制闹钟响铃的持续时间。当闹钟使能为 1 且当前时间等于设定时间时,闹钟响铃,同时闹钟输出信号为 1,LED 指示灯也亮起。同时,ring_cnt计数器开始计数,当计数器达到一定值时,响铃停止,闹钟输出信号和 LED 指示灯也恢复为 0。
原文地址: http://www.cveoy.top/t/topic/oTcU 著作权归作者所有。请勿转载和采集!