FPGA的电子时钟显示程序.docx
- 文档编号:6576543
- 上传时间:2023-01-08
- 格式:DOCX
- 页数:12
- 大小:17.76KB
FPGA的电子时钟显示程序.docx
《FPGA的电子时钟显示程序.docx》由会员分享,可在线阅读,更多相关《FPGA的电子时钟显示程序.docx(12页珍藏版)》请在冰豆网上搜索。
FPGA的电子时钟显示程序
/*==========================================================================
*名称:
可调电子时钟程序
*功能:
电子时钟显示实验
*接口:
*说明:
黑金II代FPGA开发板,一个主程序,两个子程序。
*编者时间:
Ye.FuYao2014-04-28CycioneⅡEP2C8Q208C8
*===========================================================================*/
//主程序
modulemain(clk,RSTn,KEY,duan_xuan,wei_xuan);
//外部接口
inputclk,RSTn;//时钟,复位输入
input[3:
0]KEY;//物理按键key_in按为0,松开为1
output[7:
0]duan_xuan;//数码管段选输出
output[5:
0]wei_xuan;//数码管位选输出
//时钟//初始化时间
reg[7:
0]hour=8'd12;//时
reg[7:
0]min=8'd0;//分
reg[7:
0]sec=8'd0;//秒
wire[3:
0]key_val;//按键值
//调用子程序,获取按键值
key_valueU1(.clk(clk),.RSTn(RSTn),.Key_in(KEY),.key_val(key_val));//key_val返回的按键值
//秒定时器
parameterT1S=25'd19_999_999;//定时值
reg[24:
0]Count1;//计数值
always
@(posedgeclkornegedgeRSTn)
begin
if(!
RSTn)
Count1<=25'd0;
elseif(Count1==T1S)
Count1<=25'd0;
else
Count1<=Count1+1'b1;//脉冲累加
end
//计算时间
always
@(posedgeclkornegedgeRSTn)
begin
if(!
RSTn)
sec<=8'd0;
//秒计时器
elseif(Count1==T1S)//脉冲数满足T1S
begin
if(sec<8'd60)//0~59
begin
sec=sec+8'd1;//秒加1
if(sec==8'd60)//第60秒
begin
sec=8'd0;
if(min<8'd60)//0~59
begin
min=min+8'd1;//分加1
if(min==8'd60)//第60分
begin
min=8'd0;
if(hour<8'd24)//0~23
begin
hour=hour+8'd1;//时加1
if(hour==8'd24)//第24时
hour=8'd0;
end
end
end
end
end
end
//调时间,这段可以不用,直接初始化赋值
elseif(key_val==4'd4)//key4按下
begin
if(hour<8'd23)
hour<=hour+8'd1;//+1
else
hour<=8'd0;
end
elseif(key_val==4'd3)//key3按下
begin
if(hour>8'd0)
hour<=hour-8'd1;//-1
else
hour<=8'd23;
end
elseif(key_val==4'd2)//key2按下
begin
if(min>0)
min<=min-8'd1;//+1
else
min<=8'd59;
end
elseif(key_val==4'd1)//key1按下
begin
if(min<8'd59)
min<=min+8'd1;//-1
else
min<=8'd0;
end
//调时结束
end
/*==========================================================================
*名称:
调用六位数码管显示子程序
*功能:
*输入:
clk,RSTn,sec,min,hour,duan_xuan,wei_xuan
*输出:
duan_xuan,wei_xuan
*==========================================================================*/
display_LEDU2
(
.clk(clk),
.RSTn(RSTn),
.sec(sec),.min(min),.hour(hour),//input-时间参数
.duan_xuan(duan_xuan),.wei_xuan(wei_xuan)//in_out-段选位选
);
endmodule//==================================================================
/*==========================================================================
*名称:
电子时钟子程序
*功能:
六位数码管显示时钟
*接口:
*说明:
*编者时间:
Ye.FuYao2014-04-23CycioneⅡEP2C8Q208C8
*===========================================================================*/
//电子时钟子程序
moduledisplay_LED(clk,RSTn,sec,min,hour,duan_xuan,wei_xuan);
inputclk,RSTn;//时钟,复位输入
//时分秒
input[7:
0]sec;
input[7:
0]min;
input[7:
0]hour;
output[7:
0]duan_xuan;//数码管段选输出
output[5:
0]wei_xuan;//数码管位选输出
reg[7:
0]duan_xuan;
reg[5:
0]wei_xuan;
//段选码表
reg[7:
0]SMG[9:
0];//10个8位的数组
initial
begin
SMG[0]<=8'hc0;
SMG[1]<=8'hf9;
SMG[2]<=8'ha4;
SMG[3]<=8'hb0;
SMG[4]<=8'h99;
SMG[5]<=8'h92;
SMG[6]<=8'h82;
SMG[7]<=8'hf8;
SMG[8]<=8'h80;
SMG[9]<=8'h90;
end
//位选码表
reg[5:
0]wei[5:
0];//6个6位的数组
initial
begin
wei[0]<=6'b111_110;
wei[1]<=6'b111_101;
wei[2]<=6'b111_011;
wei[3]<=6'b110_111;
wei[4]<=6'b101_111;
wei[5]<=6'b011_111;
end
//======================================================
//分离数据
reg[3:
0]rsec_One;//0~9
reg[3:
0]rsec_Ten;//0~9
reg[3:
0]rmin_One;
reg[3:
0]rmin_Ten;
reg[3:
0]rhour_One;
reg[3:
0]rhour_Ten;
always
@(posedgeclkornegedgeRSTn)
begin
if(!
RSTn)
begin
rsec_Ten<=4'd0;
rsec_One<=4'd0;
end
else
begin
rsec_Ten<=sec/10;//取十位
rsec_One<=sec%10;//取个位
rmin_Ten<=min/10;//取十位
rmin_One<=min%10;//取个位
rhour_Ten<=hour/10;//取十位
rhour_One<=hour%10;//取个位
end
end
//====================================显示
//扫描定时器
parameterT4MS=17'd59_999;//4ms/20M*0.004=80000
reg[16:
0]Count2;
always
@(posedgeclkornegedgeRSTn)
begin
if(!
RSTn)
Count2<=17'd0;
elseif(Count2==T4MS)
Count2<=17'd0;
else
Count2<=Count2+17'd1;
end
//标志位
reg[3:
0]t=0;//0~7
reg[31:
0]rData=0;//暂存数据
//送数据
always
@(posedgeclkornegedgeRSTn)
begin
if(!
RSTn)//复位
begin
t<=4'd0;
rData<=32'd0;
duan_xuan<=8'b1111_1111;
wei_xuan<=6'b111_111;
end
elseif(t==4'd7)//标志清0
t<=4'd0;
elseif(Count2==T4MS)//等于4MS,标志位变化
begin
case(t)
4'd5:
rData<=rhour_Ten;
4'd0:
rData<=rhour_One;
4'd1:
rData<=rmin_Ten;
4'd2:
rData<=rmin_One;
4'd3:
rData<=rsec_Ten;
4'd4:
rData<=rsec_One;
endcase
if(t<4'd6)//0~5次
begin
duan_xuan<=SMG[rData];//送段选
wei_xuan<=wei[t];//送位选
end
if(t==4'd6)//第6次,秒闪
begin
if(rsec_One%2)
begin
duan_xuan<=8'h7f;//送段选
wei_xuan<=wei[1];//送位选
end
else
begin
duan_xuan<=8'hff;//送段选
wei_xuan<=wei[1];//送位选
end
end
t<=t+1'b1;//标志加1
end
end
endmodule
/*=====================================================================================
*名称:
按键子程序
*功能:
*接口:
*说明:
物理按键key_in按为0,松开为1
*说明:
参考/archive/2010/03/13/1684999.html
*编者时间:
Ye.FuYao2014-04-26CycioneⅡEP2C8Q208C8
*=====================================================================================*/
//按键子程序
modulekey_value(clk,RSTn,Key_in,key_val);
inputclk,RSTn;
input[3:
0]Key_in;//读取按键
output[3:
0]key_val;//返回按键值
reg[3:
0]key_val;
//①按下开始
reg[3:
0]key_samp1,key_samp1_locked;
always@(posedgeclkornegedgeRSTn)
if(!
RSTn)
begin
key_samp1<=4'b1111;
key_samp1_locked<=4'b1111;
end
else
begin
key_samp1<=Key_in;//同一脉冲,现态(如按键Key_in[0]按下1110)
key_samp1_locked<=key_samp1;//同一脉冲,原态(如无按键按下1111)
end
//当key_samp1由1变为0时
//key_changed1由0变为1,只维持一个时钟周期,下个周期key_changed1还是0;
wire[3:
0]key_changed1;//按下标志
assignkey_changed1=key_samp1_locked&(~key_samp1);//目的:
一有按键按下就标记一次
//②延时20ms
reg[3:
0]key_samp2,key_samp2_locked;
parameterT20MS=19'd399_999;
reg[18:
0]count;
always@(posedgeclkornegedgeRSTn)
if(!
RSTn)
count<=19'd0;
elseif(key_changed1)//按键按下开始清一次0
count<=19'd0;
else
count<=count+1'b1;//按键按下直到按键松开,如果没有抖动
//③再次判断
//只有当按键不变化(不抖动),且维持20ms以上时
//才将i_key采集至key_samp2
always@(posedgeclkornegedgeRSTn)
if(!
RSTn)
key_samp2<=4'b1111;
elseif(count==T20MS)//20ms后,再判断
key_samp2<=Key_in;
always@(posedgeclkornegedgeRSTn)
if(!
RSTn)
key_samp2_locked<=4'b1111;
else
key_samp2_locked<=key_samp2;
//当key_samp1由1变为0时
//key_changed1由0变为1,只维持一个时钟周期,下个周期key_changed1还是0;
wire[3:
0]key_changed2;
assignkey_changed2=key_samp2_locked&(~key_samp2);//注意:
这里按下为1松开为0!
!
//④每次按键稳定后,输出键值
always@(posedgeclkornegedgeRSTn)
if(!
RSTn)
key_val<=4'b0;
else
case(key_changed2)
4'b0001:
key_val<=4'd1;//key1按下为4'd1
4'b0010:
key_val<=4'd2;//key2按下为4'd2
4'b0100:
key_val<=4'd3;//key3按下为4'd3
4'b1000:
key_val<=4'd4;//key4按下为4'd4
default:
key_val<=4'd0;//没有按键按下4'd0
endcase
endmodule//==================================================================
//一个主程序,两个子程序,结束
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- FPGA 电子 时钟 显示 程序