1、通达学院2017/2018 学年 第一学期课程设计 实验报告模 块 名 称 VHDL 课程设计 专 业 学 生 班 级 学 生 学 号 学 生 姓 名 指 导 教 师 设计题目 数字秒表设计任务要求 (1)计时精度 10ms,计时范围 04 分 59.99 秒;(2)设置启动、停止和复位键控制秒表的工作(3)用数码管实时显示计时结果。设备及软件 Quaster 目 录一、课程设计目的与要求 .11.1 课程设计目的 .11.2 基本要求 .1二、设计方案-数字秒表的设计 .12.1 设计功能 .12.2 秒表基本原理及设计方法 .22.3 数字秒表设计原理 .2三、开发环境 .3四、模块结构
2、.44.1 数字秒表 RTL 级电路 .44.2 计时器模块 .54.3 取数模块 .74.4 编码模块 .84.5 数码管显示控制模块 .124.6 数码管地址选择模块 .13五、 设计仿真和实验 .155.1 计时器模块仿真 .155.2 秒表仿真 .155.3 pin 引脚接口图 .165.4 实验结果图 .17六、总结与体会 .196.1 错误分析 .196.2 心得体会 .19七、参考文献 .200一、课程设计目的与要求1.1 课程设计目的EDA 技术综合设计与实践 (注:EDA 即电子设计自动化,Electronics Design Automation)是继模拟电子技术基础 、
3、数字电子技术基础 、 电子技术基础实验 、 EDA等课程后,电子类等专业学生在电子技术实验技能方面综合性质的实验训练课程,是电子技术基础的一个部分,其目的和任务是通过一周的时间,让学生掌握 EDA 的基本方法,熟悉一种 EDA 软件(Quartus II) ,并能利用 EDA 软件设计一个电子技术综合问题,并在实验板上成功下载,为以后进行工程实际问题的研究打下设计基础。1.2 基本要求(1)通过课程设计使学生能熟练掌握一种 EDA 软件(Quartus II)的使用方法,能熟练进行设计输入、编译、管脚分配、下载等过程。(2)通过课程设计使学生能利用 EDA 软件(Quartus II)进行至少
4、一个电子技术综合问题的设计(内容可由老师指定或自由选择) ,设计输入采用 VerilogHDL 硬件描述语言输入法。(3)通过课程设计使学生初步具有分析、寻找和排除电子电路中常见故障的能力。(4)通过课程设计使学生能独立写出严谨的、有理论根据的、实事求是的、文理通顺的课程设计报告。二、设计方案-数字秒表的设计2.1 设计功能(1)计时功能:设计一个秒表,该秒表计时范围为 0-59 分 59 秒 990 毫秒,分辨率为 10 毫秒(0.01秒) 。(2)显示功能:分、秒、毫秒各用 2 位数码管(共 6 位数码管)显示。(3)清零,启动计时,暂停及继续计时功能:12.2 秒表基本原理及设计方法(1
5、)秒表的基本结构:该秒表有 3 个输入端,分别为时钟输入(输入时钟为 1 毫秒) 、复位输入和启动/暂停。(2)复位信号高电平有效,可以对整个系统异步清 0;当启动/暂停为低电平时秒表开始计时,为高电平时暂停,变低后在原来的数值基础上再计数。(3)百分秒、秒和分钟信号用七段 LED 显示。(4) “毫秒计数器” 采用 100 进制计数器,每累计 1000 毫秒(1 秒)产生一个“秒脉冲”信号,该信号将作为“秒计数器” 的时钟脉冲。 “秒计数器”采用 60 进制计数器,每累计 60 秒,发出一个“分脉冲”信号,该信号将被送到“ 分计数器”。 “分计数器”采用 60 进制计时器,可实现对 60 分
6、钟的累计。2.3 数字秒表设计原理数字秒表采用模块化设计:(1)输入信号:基准时钟 clk (20MHz),清零端 clr(高电平有效) ,启动/暂停信号 en_count(低电平时启动,高电平时暂停)(2)计时器:以 10ms 为计时分辨率,每 10ms 产生一个“10 毫秒脉冲”信号,每 990ms 产生一个“秒脉冲”信号,每 60 秒产生一个“分脉冲”信号;(3)取数模块:对计时器输出的分、秒、十毫秒信号进行逐位取数,变成将在数码管上显示的十进制数;(4)编码模块:将分、秒、十毫秒的十进制数转换成数码管显示的编码;(5)数码管显示控制模块:每隔 3ms 使能更新不同数码管的数据,6 位数
7、码管更新一次共用时 18ms,刷新频率大于 50HZ,利用人的视觉暂留,好像 6 位 LED 是同时点亮的,并不察觉有闪烁现象;(6)数码管地址选择模块:每隔 3ms 使能点亮不同的数码管,6 位数码管一共用时 18ms 。2三、开发环境开发环境:1、PC 机一台2、Windows XP 32 位操作系统3、Altera 公司的 Quartus II 9.0 软件4、基于 Cyclone II 型 EP2C8Q208C8 的开发板3四、模块结构4.1 数字秒表 RTL 级电路module counter_top(clk,en_count,clr,row_scan_sig,column_scan
8、_sig);input clk; /input clock 20MHzinput en_count; /start and pauseinput clr; /clearoutput 7:0 row_scan_sig; output 5:0 column_scan_sig;wire 7:0 ms,sec,min;wire 3:0 ms_hun,ms_ten,sec_ten,sec_one,min_ten,min_one;wire 7:0 ms_ten_dis,ms_hun_dis,sec_ten_dis,sec_one_dis,min_ten_dis,min_one_dis;count U0(.
9、clk(clk),.clr(clr),.en_count(en_count),.ms(ms),.sec(sec),.min(min) / output - to U1);number_mod U1(.clk(clk),.clr(clr),.en_count(en_count),.ms(ms),.sec(sec),.min(min), / input - from U0.ms_ten(ms_ten),.ms_hun(ms_hun), / output - to U2.sec_one(sec_one),.sec_ten(sec_ten), / output - to U2.min_one(min_
10、one),.min_ten(min_ten) / output - to U2);encoder U2(.clk(clk),.clr(clr),.en_count(en_count),4.ms_ten(ms_ten),.ms_hun(ms_hun), / input - from U1.sec_one(sec_one),.sec_ten(sec_ten), / input - from U1.min_one(min_one),.min_ten(min_ten), / input - from U1.ms_ten_dis(ms_ten_dis),.ms_hun_dis(ms_hun_dis),
11、/ output - to U3.sec_one_dis(sec_one_dis),.sec_ten_dis(sec_ten_dis), / output - to U3.min_one_dis(min_one_dis),.min_ten_dis(min_ten_dis) / output - to U3);row_scan U3(.clk(clk),.clr(clr),.en_count(en_count),.ms_ten_dis(ms_ten_dis),.ms_hun_dis(ms_hun_dis),.sec_one_dis(sec_one_dis),.sec_ten_dis(sec_te
12、n_dis),.min_one_dis(min_one_dis),.min_ten_dis(min_ten_dis),.row_scan_sig(row_scan_sig)/ output of top/ input - from U2/ input - from U2/ input - from U2);column_scan U4(.clk(clk),.clr(clr),.column_scan_sig( column_scan_sig ) / output of top); endmodule4.2 计时器模块输入信号:基准时钟 clk,清零端 clr,启动/暂停信号 en_count输
13、出信号:分 min、秒 sec、毫秒 msmodule count(clk,clr,en_count,ms,sec,min);input clk,clr,en_count; output 7:0 ms,sec,min;reg 17:0count1;5reg 7:0 r_min,r_sec,r_ms;parameter T10MS = 18d199_999;/ parameter T10MS = 18d1;/*set T10MS = 18d1 for simulation */always ( posedge clk or posedge clr ) if( clr )count1 = 18d0
14、;else if( count1 = T10MS ) count1 = 18d0;elsecount1 = count1 + 1b1;always ( posedge clk or posedge clr ) if( clr )beginr_min = 8d0; r_sec = 8d0; r_ms = 8d0;endelse if(en_count) beginr_min = r_min; r_sec = r_sec; r_ms = r_ms;end elsebeginif(count1 = T10MS) beginif(r_ms = 8d99) beginr_ms = 8d0; if(r_s
15、ec = 8d59)beginr_sec = 8d0; if(r_min = 8d59)r_min = 8d0; elser_min = r_min + 1b1;end elser_sec = r_sec + 1b1;end elser_ms = r_ms + 1b1;endendassign ms = r_ms;assign sec = r_sec; assign min = r_min;endmodule64.3 取数模块输入信号:基准时钟 clk,清零端 clr ,启动/暂停信号 en_count ,分 min、秒 sec 、毫秒 ms输出信号:毫秒的十位 ms_ten、毫秒的百位 ms
16、_hun、秒的个位 sec_one、秒的十位 sec_ten、分的个位 min_one、分的十位 min_tenmodule number_mod(clk,clr,en_count,ms,sec,min, ms_ten,ms_hun,sec_one,sec_ten,min_one,min_ten);input clk,clr,en_count; input 7:0 ms,sec,min;output 3:0 ms_hun,ms_ten,sec_ten,sec_one,min_ten,min_one;/*/reg 31:0r_ms_hun,r_ms_ten,r_sec_ten,r_sec_one
17、,r_min_ten,r_min_one; /*在 quartus II 9.0 版本中, “除法器”可以自己定义。在更高级的版本中,默认下“除法器”和“求余器”是 32 位输出。但是经过“编译”过后,编译器会“自动优化”最适合的位宽*/always ( posedge clk or posedge clr ) if( clr )beginr_ms_ten = 32d0; r_ms_hun = 32d0;endelse if( en_count ) beginr_ms_ten = r_ms_ten;r_ms_hun = r_ms_hun;end elsebeginr_ms_ten = ms % 10; r_ms_hun = ms / 10;endalways ( posedge clk or posedge clr ) if( clr )beginr_sec_one = 32d0; r_sec_ten = 32d0;