数字时钟实现与动态可调与闹钟功能的实现

设计的RTL结构

处理模块实现模式切换与计数,4位数码管解码后 595control模块控制数码管的点闪动以及调时位的半秒闪动,595function模块16位串行输出给595驱动数码管显示

module jishu
(
input clk,
input rst_n,
output [3:0] row_data,
input [3:0] col_data,
output alarm_beep,
output[3:0]seg_flash_data,
output Flag_1S,
output [15:0]bcd_seg_display_num,
input mode_in
);
wire [3:0]key_value;
juzhen key_input
(
.clk(clk),
.rst_n(rst_n),
.col_data(col_data),
.row_data(row_data),
.key_value(key_value),
.key_flag_r0(key_flag1),
.key_flag(key_flag)
);
parameter T_half_S=12500000;
parameter T_1S=25000000;

reg [24:0]count1;
reg Flag_1S_r;
[email protected](posedge clk or negedge rst_n)
begin
if(!rst_n)
begin count1<=0; Flag_1S_r <= 0; end
else if( count1 == T_half_S)
begin
count1 <= count1 + 1‘b1;
Flag_1S_r <=~ Flag_1S_r;
end
else if( count1 == T_1S)
begin
count1<=0;
Flag_1S_r <=~ Flag_1S_r;
end
else
count1 <= count1 + 1‘b1;

end
assign Flag_1S = Flag_1S_r;
wire key_in;
debounce xiaodou

(
.clk(clk),
.rst_n(rst_n),
.key_n(mode_in),
.key_pulse (key_in)
);

reg [3:0]bcd_sec_one_cnt;
reg [3:0]bcd_min_one_cnt;
reg [3:0]bcd_hour_one_cnt;
reg [3:0]bcd_sec_ten_cnt;
reg [3:0]bcd_min_ten_cnt;
reg [3:0]bcd_hour_ten_cnt;
reg[3:0] seg_flash_data_r;
wire [15:0] bcd_seg_display_num;
reg[2:0] mode;
reg [15:0] bcd_seg_display_num_r;

always @(posedge clk or negedge rst_n)
begin
if(!rst_n) begin mode<=0;end
else
begin if(key_in==1) if(mode == 3‘b110) mode <= 3‘b000;
else mode <= mode + 1‘b1;
end
end

always @(posedge clk or negedge rst_n)
if(!rst_n) begin bcd_sec_one_cnt<=0;bcd_sec_ten_cnt<=0;bcd_min_one_cnt<=0;bcd_min_ten_cnt<=0;bcd_hour_one_cnt<=0;bcd_hour_ten_cnt<=0;seg_flash_data_r<=4‘b0000;end
else
begin
case(mode)
0: begin seg_flash_data_r<=4‘b0000;
bcd_seg_display_num_r[15:0] <= {bcd_min_ten_cnt,bcd_min_one_cnt,bcd_sec_ten_cnt,bcd_sec_one_cnt};
if(count1 == T_1S)begin if(bcd_sec_one_cnt==9)
begin bcd_sec_one_cnt<=0; if(bcd_sec_ten_cnt==5)
begin bcd_sec_ten_cnt<=0;if(bcd_min_one_cnt==9)
begin bcd_min_one_cnt<=0;if(bcd_min_ten_cnt==5)
begin bcd_min_ten_cnt<=0;if(bcd_hour_ten_cnt==2&&bcd_hour_one_cnt==3)begin bcd_hour_ten_cnt<=0;bcd_hour_one_cnt<=0;end
else if(bcd_hour_one_cnt==9)begin bcd_hour_one_cnt<=0;bcd_hour_ten_cnt<=bcd_hour_ten_cnt+1;end

else bcd_hour_one_cnt<=bcd_hour_one_cnt+1;
end
else bcd_min_ten_cnt<=bcd_min_ten_cnt+1;end
else bcd_min_one_cnt<=bcd_min_one_cnt+1;end
else bcd_sec_ten_cnt<=bcd_sec_ten_cnt+1;end
else bcd_sec_one_cnt<=bcd_sec_one_cnt+1;end end
/* 1: begin seg_flash_data_r <= 4‘b0001;
if(key_value==6&key_flag==1)seg_flash_data_r[3:0] <= {seg_flash_data_r[2:0],seg_flash_data_r[3]}; //左移要调整的位
if(key_value==14&key_flag==1)seg_flash_data_r[3:0] <= {seg_flash_data_r[0],seg_flash_data_r[3:1]};//右移要调整的位
bcd_seg_display_num_r[15:0] <= {bcd_min_ten_cnt,bcd_min_one_cnt,bcd_sec_ten_cnt,bcd_sec_one_cnt}; //秒分调整显示界面
if(seg_flash_data_r[0]==1&key_value==13&key_flag==1)begin if(bcd_sec_one_cnt==9)bcd_sec_one_cnt<=0; else bcd_sec_one_cnt<=bcd_sec_one_cnt+1;end
if(seg_flash_data_r[1]==1&key_value==12&key_flag==1)begin if(bcd_sec_ten_cnt==5)bcd_sec_ten_cnt<=0;else bcd_sec_ten_cnt<=bcd_sec_ten_cnt+1;end
if(seg_flash_data_r[2]==1&key_value==9&key_flag==1)begin if(bcd_min_one_cnt==9)bcd_min_one_cnt<=0;else bcd_min_one_cnt<=bcd_min_one_cnt+1;end
if(seg_flash_data_r[3]==1&key_value==8&key_flag==1)begin if(bcd_min_ten_cnt==5)bcd_min_ten_cnt<=0;else bcd_min_ten_cnt<=bcd_min_ten_cnt+1;end end

2:begin bcd_seg_display_num_r[15:0] <= {bcd_hour_ten_cnt,bcd_hour_one_cnt,bcd_min_ten_cnt,bcd_min_one_cnt}; seg_flash_data_r<=4‘b0000;end

3:begin seg_flash_data_r<=4‘b0001;
if(key_value==6&key_flag==1)seg_flash_data_r[3:0] <= {seg_flash_data_r[2:0],seg_flash_data_r[3]};
if(key_value==14&key_flag==1)seg_flash_data_r[3:0] <= {seg_flash_data_r[0],seg_flash_data_r[3:1]};
bcd_seg_display_num_r[15:0] <= {bcd_hour_ten_cnt,bcd_hour_one_cnt,bcd_min_ten_cnt,bcd_min_one_cnt};
if(seg_flash_data_r[0]==1&key_value==13&key_flag==1)begin if(bcd_min_one_cnt==9)bcd_sec_one_cnt<=0; else bcd_sec_one_cnt<=bcd_sec_one_cnt+1;end
if(seg_flash_data_r[1]==1&key_value==12&key_flag==1)begin if(bcd_min_ten_cnt==5)bcd_sec_ten_cnt<=0;else bcd_sec_ten_cnt<=bcd_sec_ten_cnt+1;end
if(seg_flash_data_r[2]==1&key_value==5&key_flag==1)begin if(bcd_hour_one_cnt==9)bcd_hour_one_cnt<=0;else bcd_hour_one_cnt<=bcd_hour_one_cnt+1;end
if(seg_flash_data_r[3]==1&key_value==4&key_flag==1)begin if(bcd_hour_ten_cnt==2)bcd_hour_ten_cnt<=0;else bcd_hour_ten_cnt<=bcd_hour_ten_cnt+1;end end*/

1 :begin seg_flash_data_r<=4‘b1000;
bcd_seg_display_num_r[15:0] <= {bcd_hour_ten_cnt,bcd_hour_one_cnt,bcd_min_ten_cnt,bcd_min_one_cnt};
if(key_value==4&key_flag==1)begin if(bcd_hour_ten_cnt==2)bcd_hour_ten_cnt<=0;else bcd_hour_ten_cnt<=bcd_hour_ten_cnt+1;end end

2: begin
seg_flash_data_r<=4‘b0100;
bcd_seg_display_num_r[15:0] <= {bcd_hour_ten_cnt,bcd_hour_one_cnt,bcd_min_ten_cnt,bcd_min_one_cnt};
if(key_value==5&key_flag==1)begin if(bcd_hour_one_cnt==9)bcd_hour_one_cnt<=0;else bcd_hour_one_cnt<=bcd_hour_one_cnt+1;end end

3: begin
seg_flash_data_r<=4‘b0010;
bcd_seg_display_num_r[15:0] <= {bcd_hour_ten_cnt,bcd_hour_one_cnt,bcd_min_ten_cnt,bcd_min_one_cnt};
if(key_value==8&key_flag==1)begin if(bcd_min_ten_cnt==5)bcd_min_ten_cnt<=0;else bcd_min_ten_cnt<=bcd_min_ten_cnt+1;end end

4: begin
seg_flash_data_r<=4‘b0001;
bcd_seg_display_num_r[15:0] <= {bcd_hour_ten_cnt,bcd_hour_one_cnt,bcd_min_ten_cnt,bcd_min_one_cnt};
if(key_value==9&key_flag==1)begin if(bcd_min_one_cnt==9)bcd_min_one_cnt<=0;else bcd_min_one_cnt<=bcd_min_one_cnt+1;end end

5:begin
seg_flash_data_r<=4‘b0010;
bcd_seg_display_num_r[15:0] <= {bcd_min_ten_cnt,bcd_min_one_cnt,bcd_sec_ten_cnt,bcd_sec_one_cnt};
if(key_value==12&key_flag==1)begin if(bcd_sec_ten_cnt==5)bcd_sec_ten_cnt<=0;else bcd_sec_ten_cnt<=bcd_sec_ten_cnt+1;end end

6:begin
seg_flash_data_r<=4‘b0001;
bcd_seg_display_num_r[15:0] <= {bcd_min_ten_cnt,bcd_min_one_cnt,bcd_sec_ten_cnt,bcd_sec_one_cnt};
if(key_value==13&key_flag==1)begin if(bcd_sec_one_cnt==9)bcd_sec_one_cnt<=0; else bcd_sec_one_cnt<=bcd_sec_one_cnt+1;end end
//default:begin bcd_sec_one_cnt<=0;bcd_sec_ten_cnt<=0;bcd_min_one_cnt<=0;bcd_min_ten_cnt<=0;bcd_hour_one_cnt<=0;bcd_hour_ten_cnt<=0;end
endcase
end
assign seg_flash_data[3:0] = Flag_1S_r ?seg_flash_data_r[3:0]:4‘b0000;
assign bcd_seg_display_num[15:0] = bcd_seg_display_num_r[15:0];

wire alarm =(bcd_hour_ten_cnt==1&&bcd_hour_one_cnt==2&&bcd_min_ten_cnt==0&&bcd_min_one_cnt==0&&bcd_sec_ten_cnt==0&&bcd_sec_one_cnt==0);

reg [26:0]beep_count;

[email protected](posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
beep_count <= 0;
end
else if(alarm)
beep_count <= 27‘d125000000;
else if(beep_count>0)
beep_count <= beep_count - 1;

end

assign alarm_beep = (beep_count>0 && ((beep_count[24]&& beep_count[14])||(~beep_count[24]&& beep_count[13])));
endmodule

显示控制模块

module seg595_control_module(clk,rst_n,num1_ten_smg_data,num1_one_smg_data,num2_ten_smg_data,num2_one_smg_data,seg_flash_data,duan_wei_data,Flag_1S,start_sig,done_sig);
input clk;
input rst_n;
input [7:0] num1_ten_smg_data;
input [7:0] num1_one_smg_data;
input [7:0] num2_ten_smg_data;
input [7:0] num2_one_smg_data;
input [3:0] seg_flash_data;
output [15:0]duan_wei_data;
output start_sig;
input done_sig;
input Flag_1S;

parameter T_1S=25000000;
//parameter T_1S=2500;

reg [15:0]duan_wei_data_r;
reg start_sig_r;
reg [3:0]state;

[email protected](posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
state<=0;
start_sig_r <= 1‘b0;
end
else

case (state)
0:
begin duan_wei_data_r[15:0] <= {num2_one_smg_data,8‘h27}; state <= state + 1; start_sig_r <= 1‘b1; end

1:
begin start_sig_r <= 1‘b0; state<=4; end

2:
if(done_sig) begin duan_wei_data_r[15:0] <= {(seg_flash_data[3]?8‘h00:num2_ten_smg_data),Flag_1S?8‘h1e:8‘h2e}; state <= state + 1; start_sig_r <= 1‘b1; end//{num2_ten_smg_data,4‘h2,(4‘he&seg_flash_data)}; state <= state + 1; start_sig_r <= 1‘b1; end

3:
begin start_sig_r <= 1‘b0; state <= state + 1; end

4:
if(done_sig) begin duan_wei_data_r[15:0] <= {(seg_flash_data[2]?8‘h00:num2_one_smg_data),Flag_1S?8‘h1d:8‘h2d};state <= state + 1; start_sig_r <= 1‘b1; end//{num2_one_smg_data,4‘h2,(4‘hd&seg_flash_data)};state <= state + 1; start_sig_r <= 1‘b1; end

5:
begin start_sig_r <= 1‘b0; state <= state + 1; end

6:
if(done_sig) begin duan_wei_data_r[15:0] <= {(seg_flash_data[1]?8‘h00:num1_ten_smg_data),Flag_1S?8‘h1b:8‘h
b}; state <= state + 1; start_sig_r <= 1‘b1; end//{num1_ten_smg_data,4‘h2,(4‘hb&seg_flash_data)}; state <= state + 1; start_sig_r <= 1‘b1; end

7:
begin start_sig_r <= 1‘b0; state <= state + 1; end

8:
if(done_sig) begin duan_wei_data_r[15:0] <= {(seg_flash_data[0]?8‘h00:num1_one_smg_data),Flag_1S?8‘h17:8‘h27}; state <= state + 1; start_sig_r <= 1‘b1; end//{num1_one_smg_data,4‘h2,(4‘h7&seg_flash_data)}; state <= state + 1; start_sig_r <= 1‘b1; end

9:
begin start_sig_r <= 1‘b0; state<=2; end

default:
begin state <= 0; start_sig_r <= 1‘b0; end
endcase
end

assign start_sig = start_sig_r;
assign duan_wei_data = duan_wei_data_r;
endmodule

显示模块

module seg595_function_module(clk,rst_n,duan_wei_data,start_sig,done_sig,sck,rck,dout);
input clk;
input rst_n;
input [15:0]duan_wei_data;
input start_sig;
output done_sig;
output sck;
output rck;
output dout;

//分出5M频率

reg [2:0]count1;
reg sck_r;

always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
begin count1<=0; sck_r<=0; end
else if(count1 == 3‘d4)
begin count1<=0; sck_r = ~ sck_r; end
else count1 <= count1 +1 ;
end

//整出下降沿脉冲
reg sck_flag1;
reg sck_flag2;
always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
sck_flag1 <= 1‘b1;
sck_flag2 <= 1‘b1;
end
else
begin
sck_flag1 <= sck_r;
sck_flag2 <= sck_flag1;
end
end

wire sck_negedge;

assign sck_negedge= (sck_flag2 && ~sck_flag1)?1‘b1:1‘b0;

reg [6:0]state;
reg rck_r;
reg dout_r;
reg done_sig_r;

// 每一个sck,下降沿放入数据,上升沿到,输入输出。 rck 每16个sck拉高一次。

always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
dout_r <= 0;
state <= 0;
done_sig_r <= 1‘b0;
end
else
case (state)
0: if(start_sig) state <= state + 1;
1: if(sck_negedge)begin dout_r <= duan_wei_data[15]; rck_r <= 1‘b1; state <= state + 1; end
2: if(sck_negedge)begin dout_r <= duan_wei_data[14]; state <= state + 1; end
3: if(sck_negedge)begin dout_r <= duan_wei_data[13]; state <= state + 1; end
4: if(sck_negedge)begin dout_r <= duan_wei_data[12]; state <= state + 1; end
5: if(sck_negedge)begin dout_r <= duan_wei_data[11]; state <= state + 1; end
6: if(sck_negedge)begin dout_r <= duan_wei_data[10]; state <= state + 1; end
7: if(sck_negedge)begin dout_r <= duan_wei_data[9]; state <= state + 1; end
8: if(sck_negedge)begin dout_r <= duan_wei_data[8]; state <= state + 1; end
9: if(sck_negedge)begin dout_r <= duan_wei_data[7]; state <= state + 1; end
10: if(sck_negedge)begin dout_r <= duan_wei_data[6]; state <= state + 1; end
11: if(sck_negedge)begin dout_r <= duan_wei_data[5]; state <= state + 1; end
12: if(sck_negedge)begin dout_r <= duan_wei_data[4]; state <= state + 1; end
13: if(sck_negedge)begin dout_r <= duan_wei_data[3]; state <= state + 1; end
14: if(sck_negedge)begin dout_r <= duan_wei_data[2]; state <= state + 1; end
15: if(sck_negedge)begin dout_r <= duan_wei_data[1]; state <= state + 1; end
16: if(sck_negedge)begin dout_r <= duan_wei_data[0]; rck_r <= 1‘b0; state <= state + 1; done_sig_r <= 1‘b1; end
17: begin done_sig_r <= 1‘b0; state <= 0; end

default: begin dout_r <= 0; state <= 0; done_sig_r <= 1‘b0; end
endcase
end

assign done_sig = done_sig_r;
assign dout = dout_r;
assign rck = rck_r;
assign sck = sck_r;

endmodule

数码管解码模块

module smg_encoder_module(clk,rst_n,num,smg_data);

input clk;
input rst_n;
input [3:0]num;
output [7:0]smg_data;

/*共阴极数码管: 位选为低电平(即0)选中数码管; 各段选为高电平(即1接+5V时)选中各数码段;*/

//由0到f的编码为

parameter
SEG_NUM0=8‘h3f,

SEG_NUM1=8‘h06,

SEG_NUM2=8‘h5b,

SEG_NUM3=8‘h4f,

SEG_NUM4=8‘h66,

SEG_NUM5=8‘h6d,

SEG_NUM6=8‘h7d,

SEG_NUM7=8‘h07,

SEG_NUM8=8‘h7f,

SEG_NUM9=8‘h6f,

SEG_NUMA=8‘h77,

SEG_NUMB=8‘h7c,

SEG_NUMC=8‘h39,

SEG_NUMD=8‘h5e,

SEG_NUME=8‘h79,

SEG_NUMF=8‘h71;

reg [7:0]smg_data_r;

always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
smg_data_r <= 8‘b00000000;
else
case (num)
4‘d0: smg_data_r <= SEG_NUM0;
4‘d1: smg_data_r <= SEG_NUM1;
4‘d2: smg_data_r <= SEG_NUM2;
4‘d3: smg_data_r <= SEG_NUM3;
4‘d4: smg_data_r <= SEG_NUM4;
4‘d5: smg_data_r <= SEG_NUM5;
4‘d6: smg_data_r <= SEG_NUM6;
4‘d7: smg_data_r <= SEG_NUM7;
4‘d8: smg_data_r <= SEG_NUM8;
4‘d9: smg_data_r <= SEG_NUM9;

default: smg_data_r <= 8‘b00000000;
endcase
end

assign smg_data=smg_data_r;

endmodule

时间: 2024-10-24 05:25:25

数字时钟实现与动态可调与闹钟功能的实现的相关文章

js实现动态数字时钟

1.效果如下 2.html部分 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>JS — 实现简单的数字时钟效果</title> <link rel="stylesheet" type="text/css" href=""> </head> <body&g

HandlerThread实现数字时钟

1.描述 刚看完Android多线程编程,对HandlerThread比较感兴趣,趁热巩固练习,实现一个了数字时钟,希望对学习HandlerThread有所帮助.如下: 启动一个HandlerThread不断获取时间 每隔一秒钟通过Handler通知UI线程更新界面的显示 界面上有按钮可以暂停.继续的计时 2.代码实现 创建一个TimerDemo工程,内容很简单,主要是两个文件:布局文件activity_main.xml和Activity文件MainActivity.java.先看activit

桌面小控件的实例-----数字时钟

为了实现一个数字时钟的桌面组件,开发者需要在程序界面上定义8个ImageView,其中6个ImageView用于显示小时.分钟.秒钟的数字,另外两个ImageView用于显示小时.分钟.秒钟之间的冒号. 为了让桌面组件实时的显示当前时间,程序需要每个1秒更新一次程序界面上的6个ImageView,让它们显示当前小时.分钟.秒钟的数字即可. import java.text.SimpleDateFormat;import java.util.Date;import java.util.Timer;

梵高数字时钟壁纸下载-电脑时钟壁纸

壁纸名称:冷高轮时间梵高数字时钟 壁纸样式:梵高数字动态时钟,王思聪吃热狗数字动态时钟,手势数字动态时钟,大写数字动态时钟,中文汉字动态时钟,麻将数字动态时钟,扑克数字动态时钟 电脑壁纸下载可在wallpaper engine或者upupoo上搜索全称“冷高轮时间‘ 电脑屏保可在冷高轮时间官网下载:lenggaolun.com(com前面是点不是句号) 手机APP可在android和ios各大应用市场搜索全称'冷高轮时间“下载. 原文地址:https://www.cnblogs.com/leng

男神数字时钟壁纸-冷高轮时间出品

壁纸名称:冷高轮时间男神数字时钟 壁纸样式:梵高数字动态时钟,王思聪吃热狗数字动态时钟,手势数字动态时钟,大写数字动态时钟,中文汉字动态时钟,麻将数字动态时钟,扑克数字动态时钟,男神数字动态时钟,女神数字动态时钟 电脑壁纸下载可在wallpaper engine或者upupoo上搜索全称“冷高轮时间‘ 电脑屏保可在冷高轮时间官网下载:lenggaolun.com(com前面是点不是句号) 手机APP可在android和ios各大应用市场搜索全称'冷高轮时间“下载. 原文地址:https://ww

[Java项目01][数字时钟]

我从2016年3月份开始学Java,看的是某宝得来的视频,目前Java SE还没学完. 前几天手痒在网上搜Java小项目,看到Youtube上的歪果仁们做的Java数字时钟,非常简单,适合我这样的新手,于是也做了一份. 效果大概是是这样的: 源代码传到了GitHub上: https://github.com/jpch89/Digital-Clock 另外还录了份视频,免得以后自己忘了怎么做,传到了Vimeo上: https://vimeo.com/159116313 参考资料如下: 1. Cre

Qt仿Android带特效的数字时钟源码分析(滑动,翻页,旋转效果)

这个数字时钟的源码可以在Qt Demo中找到,风格是仿Android的,不过该Demo中含有三种动画效果(鉴于本人未曾用过Android的系统,因此不知道Android的数字时钟是否也含有这三种效果),其分别为滑动.翻页和旋转. 由于本人的Qt Creator输入中文后显示的都是乱码,因而在此只能使用英文进行注释,后期如果有时间再进行中文的相关整理.可能有些地方理解并不是很正确.希望大家多多指正! 以下为源码: [cpp] view plaincopy #include <QtCore> #i

MFC数字时钟在VS2013的简易制作

首先,新建一个项目:文件--->新建-->项目.选择MFC应用程序.命名为Clock 下一步后选择基于对话框的应用程序,单击完成. 二,先将对话框中的确定和取消等按钮删除,在工具栏中添加两个Static Text的静态文本框,在俩个文本框的属性设置中,将文字(Align Text)设置居中,边界(Border)设置False,名字(Caption)中的Static删除,分别将两个文本框框的ID设置为IDC_STATIC1和IDC_STATIC2.                        

中国MOOC_面向对象程序设计——Java语言_第2周 对象交互_1有秒计时的数字时钟

第2周编程题 查看帮助 返回 第2周编程题,在课程所给的时钟程序的基础上修改 依照学术诚信条款,我保证此作业是本人独立完成的. 温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业截止时间之前不限次数提交答案,系统将取其中的最高分作为最终成绩. 1 有秒计时的数字时钟(10分) 题目内容: 这一周的编程题是需要你在课程所给的时钟程序的基础上修改而成.但是我们并不直接给你时钟程序的代码,请根据视频自己输入时钟程序的Display和Clock类的代码,