实验三 数字时钟.docx
《实验三 数字时钟.docx》由会员分享,可在线阅读,更多相关《实验三 数字时钟.docx(8页珍藏版)》请在冰豆网上搜索。
实验三数字时钟
EDA实验报告
数字时钟
电信1002班
姓名:
谌晴
学号:
1404100320
数字时钟
1.实验目的
学习数字时钟的硬件设计。
2.实验内容
在SmartSOPC实验箱上完成可以计时的数字时钟,其显示时间范围是00:
00:
00~23:
59:
59且该时钟具有暂停计时和清零等功能。
3.实验原理
一个完整的时钟应由3部分组成:
秒脉冲发生电路、计数显示部分和时钟调整部分。
一个时钟的准确与否主要取决于秒脉冲的精度。
为了保证计是准确,我们对系统时钟48MHz进行了48000000分频,从而得到1Hz的秒脉冲。
至于显示部分与LED数码管原理相同,而对于校时电路可自由发挥,如定义3个键keystart,keymon和keyadd,分别用于控制时钟的计时开始、调整功能选择和加1处理,从而完成对现在时间的调整。
本实验的校时电路在此仅仅完成了暂停、清零等基本功能。
4.实验步骤
(1)在QuartusII中建立一个工程项目文件clock.qpf,并在该项目下新建VerilogHDL源程序文件clock.v输入程序代码并保存。
完整的VerilogHDL程序如下。
(2)选择目标器件并对相应的引脚进行锁定,在这里所选择的期间为Altera公司Cyclone系列的EP1C12Q240C8芯片,引脚锁定方法如表所列。
将未使用的引脚设置为三态输入。
(3)对该工程文件进行全程编译处理,若在编译工程中发现错误,则找出并更正错误,直到编译成功为止。
(4)连接硬件、下载程序。
用实验箱配置的连线将核心板上PACK区的引脚236、237、238、239分别与数码管显示区的COM3(DIG_COM)的DIG4_DIG7相对应连接。
将跳线短接冒跳接到SmartSOPC实验箱上的JP6的KEY1、KEY2,使分别与FPGA的引脚相连。
通过ByteBlasterII下载电缆连接实验箱JTAG口和主计算机,接通实验箱电源,执行下载命令,把程序下载到FPGA器件中。
5、实验结果
数码管1、2显示时钟的小时部分,4、5显示时钟的分部分,7、8显示时钟的秒部分。
当按键KEY1、KEY2置1时,数码管显示的数据如时钟计数依次增加。
当按KEY1时,实现暂停功能,数码管数字没有发生变化。
再次按KEY1时,时钟继续刚才的数据叠加。
按KEY2键时,实现清零功能,所有数码管数字全部显示0,重新开始计数。
实验程序:
moduleclock(clk,key,dig,seg);//模块名clock
inputclk;//输入时钟
input[1:
0]key;//输入按键
output[7:
0]dig;//数码管选择输出引脚
output[7:
0]seg;//数码管段输出引脚
reg[7:
0]seg_r;//定义数码管输出寄存器
reg[7:
0]dig_r;//定义数码管选择输出寄存器
reg[3:
0]disp_dat;//定义显示数据寄存器
reg[24:
0]count;//定义计数寄存器
reg[23:
0]hour;//定义现在时刻寄存器
regsec,keyen;//定义标志位
reg[1:
0]dout1,dout2,dout3;//寄存器
wire[1:
0]key_done;//按键消抖输出
assigndig=dig_r;//输出数码管选择
assignseg=seg_r;//输出数码管译码结果
//秒信号产生部分
always@(posedgeclk)//定义clock上升沿触发
begin
count=count+1'b1;
if(count==25'd24000000)//0.5S到了吗?
begin
count=25'd0;//计数器清零
sec=~sec;//置位秒标志
end
end
//按键消抖处理部分
assignkey_done=(dout1|dout2|dout3);//按键消抖输出
always@(posedgecount[17])
begin
dout1<=key;
dout2<=dout1;
dout3<=dout2;
end
always@(negedgekey_done[0])
begin
keyen=~keyen;//将琴键开关转换为乒乓开关
end
//数码管动态扫描显示部分
always@(posedgeclk)//count[17:
15]大约1ms改变一次
begin
case(count[17:
15])//选择扫描显示数据
3'd0:
disp_dat=hour[3:
0];//秒个位
3'd1:
disp_dat=hour[7:
4];//秒十位
3'd2:
disp_dat=4'ha;//显示"-"
3'd3:
disp_dat=hour[11:
8];//分个位
3'd4:
disp_dat=hour[15:
12];//分十位
3'd5:
disp_dat=4'ha;//显示"-"
3'd6:
disp_dat=hour[19:
16];//时个位
3'd7:
disp_dat=hour[23:
20];//时十位
endcase
case(count[17:
15])//选择数码管显示位
3'd0:
dig_r=8'b11111110;//选择第一个数码管显示
3'd1:
dig_r=8'b11111101;//选择第二个数码管显示
3'd2:
dig_r=8'b11111011;//选择第三个数码管显示
3'd3:
dig_r=8'b11110111;//选择第四个数码管显示
3'd4:
dig_r=8'b11101111;//选择第五个数码管显示
3'd5:
dig_r=8'b11011111;//选择第六个数码管显示
3'd6:
dig_r=8'b10111111;//选择第七个数码管显示
3'd7:
dig_r=8'b01111111;//选择第八个数码管显示
endcase
end
always@(posedgeclk)
begin
case(disp_dat)
4'h0:
seg_r=8'hc0;//显示0
4'h1:
seg_r=8'hf9;//显示1
4'h2:
seg_r=8'ha4;//显示2
4'h3:
seg_r=8'hb0;//显示3
4'h4:
seg_r=8'h99;//显示4
4'h5:
seg_r=8'h92;//显示5
4'h6:
seg_r=8'h82;//显示6
4'h7:
seg_r=8'hf8;//显示7
4'h8:
seg_r=8'h80;//显示8
4'h9:
seg_r=8'h90;//显示9
4'ha:
seg_r=8'hbf;//显示-
default:
seg_r=8'hff;//不显示
endcase
if((count[17:
15]==3'd2)&sec)
seg_r=8'hff;
end
//计时处理部分
always@(negedgesecornegedgekey_done[1])//计时处理
begin
if(!
key_done[1])//是清零键吗?
begin
hour=24'h0;//是,则清零
end
elseif(!
keyen)
begin
hour[3:
0]=hour[3:
0]+1'b1;//秒加1
if(hour[3:
0]==4'ha)
begin
hour[3:
0]=4'h0;
hour[7:
4]=hour[7:
4]+1'b1;//秒的十位加一
if(hour[7:
4]==4'h6)
begin
hour[7:
4]=4'h0;
hour[11:
8]=hour[11:
8]+1'b1;//分个位加一
if(hour[11:
8]==4'ha)
begin
hour[11:
8]=4'h0;
hour[15:
12]=hour[15:
12]+1'b1;//分十位加一
if(hour[15:
12]==4'h6)
begin
hour[15:
12]=4'h0;
hour[19:
16]=hour[19:
16]+1'b1;//时个位加一
if(hour[19:
16]==4'ha)
begin
hour[19:
16]=4'h0;
hour[23:
20]=hour[23:
20]+1'b1;//时十位加一
end
if(hour[23:
16]==8'h24)
hour[23:
16]=8'h0;
end
end
end
end
end
end
endmodule