1、数字时钟报告EDA设 计 课 程 实 验 报 告 实 验 题 目: 数字时钟 学 院 名 称: 专 业: 班 级: 姓 名: 高胜 学 号 小 组 成 员: 指 导 教 师: 一、 实验目的学习数字时钟的设计原理。二、 设计任务及要求利用QuartusII软件设计一个数字钟,对设计电路进行功能仿真,并下载到SmartSOPC实验系统中,可以完成00-00-00到23-59-59的计时功能,并在控制电路的作用下具有保持和清零功能,做到能够创新的添加自己能够实现的功能,例如快速校时、快速校分、整点报时等。三、 系统设计1、整体设计方案 一个完整的时钟应由3部分组成:秒脉冲发生电路、计数显示部分和时
2、钟调整部分。一个时钟的准确与否主要取决秒脉冲的准确度。为了保证计时准确,对系统时钟48MHz进行了48000000分频,从而得到1Hz的秒脉冲。数字计钟是由秒脉冲发生电路、计数显示部分和时钟调整这3个部分基本电路组成的。 数字计钟的系统框图(见图1): 图1 数字计钟的系统框图 2、功能模块电路设计 秒脉冲发生电路将分频后的脉冲输入,时钟调整电路进行响应,使数码管显示*-*-*的时间格式,并且每次脉冲使数码管实现计时功能,从00-00-00计时到23-59-59.(1) 系统模块框图(见图2)图2 系统模块框图(2) 模块逻辑表达数码管选择真值表(见表一): 表一 选择数码管真值表数码管显示位
3、真值表(见表二): 表二 数码管显示位真值表译码真值表(见表三): 表三 译码真值表(3)算法流程图(见图3) N Y 图3 算法流程图(4)Verilog源代码module clock(clk,key,dig,seg); /模块名clockinput clk; /输入时钟input1:0 key; /输入按键output7:0 dig; /数码管选择输出引脚output7:0 seg; /数码管段输出引脚reg7:0 seg_r; /定义数码管输出寄存器reg7:0 dig_r; /定义数码管选择输出寄存器reg3:0 disp_dat; /定义显示数据寄存器reg24:0count; /定
4、义计数寄存器reg23:0hour; /定义现在时刻寄存器reg sec,keyen; /定义标志位reg1:0dout1,dout2,dout3; /寄存器wire1:0key_done; /按键消抖输出assign dig = dig_r; /输出数码管选择assign seg = seg_r; /输出数码管译码结果 /秒信号产生部分always (posedge clk) /定义clock上升沿触发begin count = count + 1b1; if(count = 25d24000000) /0.5S到了吗? begin count = 25d0; /计数器清零 sec = se
5、c; /置位秒标志 endend/按键消抖处理部分assign key_done = (dout1 | dout2 | dout3); /按键消抖输出always (posedge count17)begin dout1 = key; dout2 = dout1; dout3 = dout2; endalways (negedge key_done0)begin keyen = keyen; /将琴键开关转换为乒乓开关end/数码管动态扫描显示部分always (posedge clk) /count17:15大约1ms改变一次begin case(count17:15) /选择扫描显示数据
6、3d0:disp_dat = hour3:0; /秒个位 3d1:disp_dat = hour7:4; /秒十位 3d2:disp_dat = 4ha; /显示- 3d3:disp_dat = hour11:8; /分个位 3d4:disp_dat = hour15:12; /分十位 3d5:disp_dat = 4ha; /显示- 3d6:disp_dat = hour19:16; /时个位 3d7:disp_dat = hour23:20; /时十位 endcase case(count17:15) /选择数码管显示位 3d0:dig_r = 8b11111110; /选择第一个数码管显
7、示 3d1:dig_r = 8b11111101; /选择第二个数码管显示 3d2:dig_r = 8b11111011; /选择第三个数码管显示 3d3:dig_r = 8b11110111; /选择第四个数码管显示 3d4:dig_r = 8b11101111; /选择第五个数码管显示 3d5:dig_r = 8b11011111; /选择第六个数码管显示 3d6:dig_r = 8b10111111; /选择第七个数码管显示 3d7:dig_r = 8b01111111; /选择第八个数码管显示 endcase endalways (posedge clk)begin case(disp
8、_dat) 4h0:seg_r = 8hc0; /显示0 4h1:seg_r = 8hf9; /显示1 4h2:seg_r = 8ha4; /显示2 4h3:seg_r = 8hb0; /显示3 4h4:seg_r = 8h99; /显示4 4h5:seg_r = 8h92; /显示5 4h6:seg_r = 8h82; /显示6 4h7:seg_r = 8hf8; /显示7 4h8:seg_r = 8h80; /显示8 4h9:seg_r = 8h90; /显示9 4ha:seg_r = 8hbf; /显示- default:seg_r = 8hff; /不显示 endcase if(cou
9、nt17:15= 3d2)&sec) seg_r = 8hff;end/计时处理部分always (negedge sec or negedge key_done1)/计时处理begin if(!key_done1) /是清零键吗? begin hour = 24h0; /是,则清零 end else if(!keyen) begin hour3:0 = hour3:0 + 1b1; /秒加1 if(hour3:0 = 4ha) begin hour3:0 = 4h0; hour7:4 = hour7:4 + 1b1; /秒的十位加一 if(hour7:4 = 4h6) begin hour7
10、:4 = 4h0; hour11:8 = hour11:8 + 1b1;/分个位加一 if(hour11:8 = 4ha) begin hour11:8 = 4h0; hour15:12 = hour15:12 + 1b1;/分十位加一 if(hour15:12 = 4h6) begin hour15:12 = 4h0; hour19:16 = hour19:16 + 1b1;/时个位加一 if(hour19:16 = 4ha) begin hour19:16 = 4h0; hour23:20 = hour23:20 + 1b1;/时十位加一 end if(hour23:16 = 8h24)
11、hour23:16 = 8h0; end end end end endendendmodule四、 系统调试1、仿真调试 (1)仿真代码位码代码仿真: timescale 1ns/1ns module smg_tp; /测试模块的名字 reg 2:0 c; /测试输入信号定义为reg型 wire7:0 dig; /测试输出信号定义为wire型 parameter DELY=100; /延时100秒 wei u1(c,dig); /调用测试对象 initial begin /激励波形设定 c=3b0; #DELY c=3b001 ; #DELY c=3b010 ; #DELY c=3b100
12、; #DELY c=3b101 ; #DELY c=3b110 ; #DELY c=3b111 ; #DELY $finish; end initial $monitor($time,dig=%d,c=%b ,dig,c); /输出格式i定义 endmodule module wei(c,dig); /命名模块名字 input2:0 c; output7:0 dig; /定义输入与输出 reg7:0 dig_r; reg2:0 c_r; / 定义dig_r与c_r2个reg型数据 assign dig=dig_r; /将reg型数据转化为wire型数据 always (*) /检测c_r的数据
13、是否变化 begin c_r=c; case (c_r) 3b000:dig_r=8b11111110; /c_r的数据变化而dig_r对于的数据变化 3b001:dig_r=8b11111101; 3b010:dig_r=8b11111011; 3b011:dig_r=8b11110111; 3b100:dig_r=8b11101111; 3b101:dig_r=8b11011111; 3b110:dig_r=8b10111111; 3b111:dig_r=8b01111111; default: dig_r=8b11111111; endcase /结束case语句 end /结束alwa
14、ys语句 endmodule /结束程序译码器代码仿真: timescale 1ns/1ns module duan_tp; /测试模块的名字 reg3:0 a; /测试输入信号定义为reg型 wire7:0 seg; /测试输出信号定义为wire型 parameter DELY=100; /延时100秒 duan u1(a,seg); /调用测试对象 initial begin /激励波形设定 a=4b0; #DELY a=4b0001; #DELY a=4b0010; #DELY a=4b0011; #DELY a=4b0100; #DELY a=4b0101; #DELY a=4b011
15、0; #DELY a=4b0111; #DELY a=4b1000; #DELY a=4b1001; #DELY a=4b1010; #DELY a=4b1011; #DELY a=4b1100; #DELY a=4b1101; #DELY a=4b1110; #DELY a=4b1111; #DELY $finish; end initial $monitor($time,seg=%d,a=%b,seg,a); /输出格式i定义 endmodule module duan(a,seg); /命名模块名字 input3:0 a; output7:0 seg; /定义输入与输出 reg7:0 s
16、eg_r; reg3:0 a_r; / 定义seg_r与a_r2个reg型数据 assign seg=seg_r; /将reg型数据转化为wire型数据 always (*) /检测c_r的数据是否变化 begin a_r=a; case(a_r) /七段译码 4b0000:seg_r = 8hc0; /显示0 4b0001:seg_r = 8hf9; /显示1 4b0010:seg_r = 8ha4; /显示2 4b0011:seg_r = 8hb0; /显示3 4b0100:seg_r = 8h99; /显示4 4b0101:seg_r = 8h92; /显示5 4b0110:seg_r
17、= 8h82; /显示6 4b0111:seg_r = 8hf8; /显示7 4b1000:seg_r = 8h80; /显示8 4b1001:seg_r = 8h90; /显示9 4b1010:seg_r = 8h88; /显示a 4b1011:seg_r = 8h83; /显示b 4b1100:seg_r = 8hc6; /显示c 4b1101:seg_r = 8ha1; /显示d 4b1110:seg_r = 8h86; /显示e 4b1111:seg_r = 8h8e; /显示f endcase /结束case语句 end /结束always语句 endmodule /结束程序(3)仿真波形图位码代码仿真图(见图4) 图4 位码代码仿真波形 译码器代码仿真图(见图5) 图5 译码器代码仿真波形3.波形分析 从仿真图可以看出程序是正确的。2、实际调试(1)测试条件、管脚分配引脚分配(见图6) 图6 管脚分配图(2)测试结果及数据实验箱运行开始运行时数码管显示00-00-00,并且在之后开始计时,同时数码管显示开始变化00-00-01,00-00-02,.。五、 实验感想
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1