VHDL-数字秒表设计.doc_第1页
VHDL-数字秒表设计.doc_第2页
VHDL-数字秒表设计.doc_第3页
VHDL-数字秒表设计.doc_第4页
VHDL-数字秒表设计.doc_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

通达学院2017/2018学年 第一学期课程设计 实验报告模 块 名 称 VHDL课程设计 专 业 学 生 班 级 学 生 学 号 学 生 姓 名 指 导 教 师 设计题目数字秒表设计任务要求(1)计时精度10ms,计时范围04分59.99秒;(2)设置启动、停止和复位键控制秒表的工作(3)用数码管实时显示计时结果。设备及软件Quaster 目 录一、课程设计目的与要求11.1 课程设计目的11.2 基本要求1二、设计方案-数字秒表的设计12.1 设计功能12.2 秒表基本原理及设计方法22.3 数字秒表设计原理2三、开发环境3四、模块结构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七、参考文献20一、课程设计目的与要求1.1 课程设计目的EDA 技术综合设计与实践(注:EDA 即电子设计自动化,Electronics Design Automation)是继模拟电子技术基础、数字电子技术基础、电子技术基础实验、EDA等课程后,电子类等专业学生在电子技术实验技能方面综合性质的实验训练课程,是电子技术基础的一个部分,其目的和任务是通过一周的时间,让学生掌握 EDA 的基本方法,熟悉一种 EDA 软件(Quartus II),并能利用 EDA 软件设计一个电子技术综合问题,并在实验板上成功下载,为以后进行工程实际问题的研究打下设计基础。1.2 基本要求(1)通过课程设计使学生能熟练掌握一种 EDA 软件(Quartus II)的使用方法,能熟练进行设计输入、编译、管脚分配、下载等过程。(2)通过课程设计使学生能利用 EDA 软件(Quartus II)进行至少一个电子技术综合问题的设计(内容可由老师指定或自由选择),设计输入采用 VerilogHDL 硬件描述语言输入法。(3)通过课程设计使学生初步具有分析、寻找和排除电子电路中常见故障的能力。(4)通过课程设计使学生能独立写出严谨的、有理论根据的、实事求是的、文理通顺的课程设计报告。二、设计方案-数字秒表的设计2.1 设计功能(1)计时功能:设计一个秒表,该秒表计时范围为 0-59 分 59 秒 990 毫秒,分辨率为 10 毫秒(0.01秒)。(2)显示功能:分、秒、毫秒各用 2 位数码管(共 6 位数码管)显示。(3)清零,启动计时,暂停及继续计时功能:02.2 秒表基本原理及设计方法(1)秒表的基本结构:该秒表有 3 个输入端,分别为时钟输入(输入时钟为 1 毫秒)、复位输入和启动/暂停。(2)复位信号高电平有效,可以对整个系统异步清 0;当启动/暂停为低电平时秒表开始计时,为高电平时暂停,变低后在原来的数值基础上再计数。(3)百分秒、秒和分钟信号用七段 LED 显示。(4)“毫秒计数器”采用 100 进制计数器,每累计 1000 毫秒(1 秒)产生一个“秒脉冲”信号,该信号将作为“秒计数器”的时钟脉冲。“秒计数器”采用 60 进制计数器,每累计 60 秒,发出一个“分脉冲”信号,该信号将被送到“分计数器”。“分计数器”采用 60 进制计时器,可实现对 60 分钟的累计。2.3 数字秒表设计原理数字秒表采用模块化设计:(1)输入信号:基准时钟 clk(20MHz),清零端 clr(高电平有效),启动/暂停信号 en_count(低电平时启动,高电平时暂停)(2)计时器:以 10ms 为计时分辨率,每 10ms 产生一个“10 毫秒脉冲”信号,每 990ms 产生一个“秒脉冲”信号,每 60 秒产生一个“分脉冲”信号;(3)取数模块:对计时器输出的分、秒、十毫秒信号进行逐位取数,变成将在数码管上显示的十进制数;(4)编码模块:将分、秒、十毫秒的十进制数转换成数码管显示的编码;(5)数码管显示控制模块:每隔 3ms 使能更新不同数码管的数据,6 位数码管更新一次共用时 18ms,刷新频率大于 50HZ,利用人的视觉暂留,好像 6 位 LED 是同时点亮的,并不察觉有闪烁现象;(6)数码管地址选择模块:每隔 3ms 使能点亮不同的数码管,6 位数码管一共用时 18ms。三、开发环境开发环境:1、PC 机一台2、Windows XP 32 位操作系统3、Altera 公司的 Quartus II 9.0 软件4、基于 Cyclone II 型 EP2C8Q208C8 的开发板四、模块结构4.1 数字秒表RTL级电路module counter_top(clk,en_count,clr,row_scan_sig,column_scan_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(.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_one),.min_ten(min_ten) / output - to U2);encoder U2(.clk(clk),.clr(clr),.en_count(en_count),20.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),/ 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_ten_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输出信号:分 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;reg 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;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_sec = 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;endmodule4.3 取数模块输入信号:基准时钟 clk,清零端 clr,启动/暂停信号 en_count,分 min、秒 sec、毫秒 ms输出信号:毫秒的十位 ms_ten、毫秒的百位 ms_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,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;endelse if( en_count ) beginr_sec_one = r_sec_one; r_sec_ten = r_sec_ten;end elsebeginr_sec_one = sec % 10; r_sec_ten = sec / 10;endalways ( posedge clk or posedge clr ) if( clr )beginr_min_one = 32d0; r_min_ten = 32d0;endelse if( en_count ) beginr_min_one = r_min_one; r_min_ten = r_min_ten;end elsebeginr_min_one = min % 10; r_min_ten = min / 10;end /*/assign ms_ten = r_ms_ten3:0; assign ms_hun = r_ms_hun3:0; assign sec_one = r_sec_one3:0;assign sec_ten = r_sec_ten3:0; assign min_one = r_min_one3:0; assign min_ten = r_min_ten3:0;/*/endmodule4.4 编码模块输入信号:基准时钟 clk,清零端 clr,启动/暂停信号 en_count,毫秒的十位 ms_ten、毫秒的百位ms_hun、秒的个位 sec_one、秒的十位 sec_ten、分的个位 min_one、分的十位 min_ten输出信号:毫秒的十位编码 ms_ten_dis、毫秒的百位编码 ms_hun_dis、秒的个位编码 sec_one_dis、秒的十位编码 sec_ten_dis、分的个位编码 min_one_dis、分的十位编码 min_ten_dismodule encoder(clk,clr,en_count, ms_ten,ms_hun,ms_ten_dis,ms_hun_dis, sec_one,sec_ten,sec_one_dis,sec_ten_dis, min_one,min_ten,min_one_dis,min_ten_dis);input clk,clr,en_count;input 3:0ms_ten,ms_hun,sec_ten,sec_one,min_ten,min_one;output 7:0 ms_ten_dis,ms_hun_dis,sec_ten_dis,sec_one_dis,min_ten_dis,min_one_dis;/* 不带小数点的数码管显示 */parameter_0 = 8b1100_0000, _1 = 8b1111_1001, _2 = 8b1010_0100, _3 = 8b1011_0000, _4 = 8b1001_1001, _5 = 8b1001_0010, _6 = 8b1000_0010, _7 = 8b1111_1000, _8 = 8b1000_0000, _9 = 8b1001_0000;/* 带小数点的数码管显示 */parameter_0_ = 8b0100_0000, _1_ = 8b0111_1001, _2_ = 8b0010_0100, _3_ = 8b0011_0000, _4_ = 8b0001_1001, _5_ = 8b0001_0010, _6_ = 8b0000_0010, _7_ = 8b0111_1000, _8_ = 8b0000_0000, _9_ = 8b0001_0000;/*/reg 7:0r_ms_ten_dis;always ( posedge clk or posedge clr ) if( clr )r_ms_ten_dis = _0; else if( en_count )r_ms_ten_dis = r_ms_ten_dis;elsecase(ms_ten)4d0 : r_ms_ten_dis = _0;4d1 : r_ms_ten_dis = _1;4d2 : r_ms_ten_dis = _2;4d3 : r_ms_ten_dis = _3;4d4 : r_ms_ten_dis = _4;4d5 : r_ms_ten_dis = _5;4d6 : r_ms_ten_dis = _6;4d7 : r_ms_ten_dis = _7;4d8 : r_ms_ten_dis = _8;4d9 : r_ms_ten_dis = _9; endcase/*/reg 7:0r_ms_hun_dis;always (posedge clk or posedge clr) if( clr )r_ms_hun_dis = _0; else if( en_count )r_ms_hun_dis = r_ms_hun_dis;elsecase(ms_hun)4d0 : r_ms_hun_dis = _0;4d1 : r_ms_hun_dis = _1;4d2 : r_ms_hun_dis = _2;4d3 : r_ms_hun_dis = _3;4d4 : r_ms_hun_dis = _4;4d5 : r_ms_hun_dis = _5;4d6 : r_ms_hun_dis = _6;4d7 : r_ms_hun_dis = _7;4d8 : r_ms_hun_dis = _8;4d9 : r_ms_hun_dis = _9; endcase/*/reg 7:0r_sec_one_dis;always ( posedge clk or posedge clr ) if( clr )r_sec_one_dis = _0_; else if( en_count )r_sec_one_dis = r_sec_one_dis; elsecase(sec_one)4d0 : r_sec_one_dis = _0_;4d1 : r_sec_one_dis = _1_;4d2 : r_sec_one_dis = _2_;4d3 : r_sec_one_dis = _3_;4d4 : r_sec_one_dis = _4_;4d5 : r_sec_one_dis = _5_;4d6 : r_sec_one_dis = _6_;4d7 : r_sec_one_dis = _7_;4d8 : r_sec_one_dis = _8_;4d9 : r_sec_one_dis = _9_; endcase/*/ reg 7:0r_sec_ten_dis;always ( posedge clk or posedge clr ) if( clr )r_sec_ten_dis = _0; else if( en_count )r_sec_ten_dis = r_sec_ten_dis;elsecase(sec_ten)4d0 : r_sec_ten_dis = _0;4d1 : r_sec_ten_dis = _1;4d2 : r_sec_ten_dis = _2;4d3 : r_sec_ten_dis = _3;4d4 : r_sec_ten_dis = _4;4d5 : r_sec_ten_dis = _5;4d6 : r_sec_ten_dis = _6;4d7 : r_sec_ten_dis = _7;4d8 : r_sec_ten_dis = _8;4d9 : r_sec_ten_dis = _9; endcase/*/reg 7:0r_min_one_dis;always ( posedge clk or posedge clr ) if( clr )r_min_one_dis = _0_; else if( en_count )r_min_one_dis = r_min_one_dis;elsecase(min_one)4d0 : r_min_one_dis = _0_;4d1 : r_min_one_dis = _1_;4d2 : r_min_one_dis = _2_;4d3 : r_min_one_dis = _3_;4d4 : r_min_one_dis = _4_;4d5 : r_min_one_dis = _5_;4d6 : r_min_one_dis = _6_;4d7 : r_min_one_dis = _7_;4d8 : r_min_one_dis = _8_;4d9 : r_min_one_dis = _9_; endcase/*/reg 7:0r_min_ten_dis;always ( posedge clk or posedge clr ) if( clr )r_min_ten_dis = _0; else if( en_count )r_min_ten_dis = r_min_ten_dis;elsecase(min_ten)4d0 : r_min_ten_dis = _0;4d1 : r_min_ten_dis = _1;4d2 : r_min_ten_dis = _2;4d3 : r_min_ten_dis = _3;4d4 : r_min_ten_dis = _4;4d5 : r_min_ten_dis = _5;4d6 : r_min_ten_dis = _6;4d7 : r_min_ten_dis = _7;4d8 : r_min_ten_dis = _8;4d9 : r_min_ten_dis = _9; endcase/*/assign ms_ten_dis = r_ms_ten_dis; assign ms_hun_dis = r_ms_hun_dis; assign sec_one_dis = r_sec_one_dis; assign sec_ten_dis = r_sec_ten_dis; assign min_one_dis = r_min_one_dis; assign min_ten_dis = r_min_ten_dis;endmodule4.5 数码管显示控制模块输入信号:基准时钟 clk,清零端 clr,启动/暂停信号 en_count,毫秒的十位编码 ms_ten_dis、毫秒的百位编码 ms_hun_dis、秒的个位编码 sec_one_dis、秒的十位编码 sec_ten_dis、分的个位编码min_one_dis、分的十位编码 min_ten_dis输出信号:数码管显示控制信号 row_scan_sig7:0module row_scan(clk,clr,en_count,row_scan_sig,ms_ten_dis,ms_hun_dis, sec_one_dis,sec_ten_dis,min_one_dis,min_ten_dis);input clk; input clr; input en_count;input 7:0 ms_ten_dis; input 7:0 ms_hun_dis; input 7:0 sec_one_dis; input 7:0 sec_ten_dis; input 7:0 min_one_dis; input 7:0 min_ten_dis; output 7:0 row_scan_sig;parameter T3MS = 16d59_999;/ parameter T3MS = 16d1; /*set T3MS = 16d1 for simulation*/reg 15:0 count3; reg 2:0 t;reg 7:0 rdata;always ( posedge clk or posedge clr )/* 3ms counter*/ if( clr )count3 = 16d0; else if( count3 = T3MS )count3 = 16d0; elsecount3 = count3 + 16b1;/*控制扫描的次序,寄存器 t 表示了当前扫描的是第几个数码管*/ always ( posedge clk or posedge clr )if( clr )t = 3d0;else if( t = 3d6 ) t = 3d0;else if( count3 = T3MS ) t = t + 1b1;always ( posedge clk or posedge clr ) if( clr )rdata = 8b1100_0000; else if( en_count )rdata = rdata;else if( count3 = T3MS ) case(t)3d0 : rdata = ms_ten_dis;3d1 : rdata = ms_hun_dis;3d2 : rdata = sec_one_dis;3d3 : rdata = sec_ten_dis;3d4 : rdata = min_one_dis;3d5 : rdata = min_ten_dis; endcaseassign row_scan_sig = rdata;endmodule4.6 数码管地址选择模块输入信号:基准时钟 clk,清零端 clr输出信号:数码管地址选择信号 column_scan_sig5:0module column_scan(clk,clr,column_scan_sig);input clk; input clr;output 5:0column_scan_sig;parameter T3MS = 16d59_999;/ parameter T3MS = 16d1; /*set T3MS = 16d1 for simulation*/reg 16:0 count2; reg 2:0 t;reg 5:0 rcolumn_scan;always (posedge clk or posedge clr)/*3ms counter*/ if( clr )count2 = 16d0; else if( count2 = T3MS )count2 = 16d0; elsecount2 = count2 + 16b1;/*控制扫描的次序,寄存器 t 表示了当前扫描的是第几个数码管*/ always ( posedge clk or posedge clr)if( clr )t = 3d0;else if( t = 3d6 ) t = 3d0;else if( count2 = T3MS ) t = t + 1b1;always ( posedge clk or posedge clr) if( clr )rcolumn_scan = 6b000000; else if( count2 = T3MS )case( t )3d0 : rcolumn_scan = 6b111110;3d1 : rcolumn_scan = 6b111101;3d2 : rcolumn_scan = 6b111011;3d3 : rcolumn_scan = 6b110111;3d4 : rcolumn_scan = 6b101111;3d5 : rcolumn_scan = 6b011111; endcaseassign column_scan_sig = rcolumn_scan;endmodule5、 设计仿真和实验5.1 计时器模块仿真由于对系统时钟分频系数较大,在软件中仿真不易实现,因此将分频系数适当改小来仿真逻辑功能即可,下面对计时器模块(count.v 文件)单独进行功能仿真和时序仿真。由仿真结果波形图可知,当毫秒计数 ms 计到 99 后,秒计数 sec 加 1,分计数 min 与秒计数 sec 类似,均满足正常计数的逻辑功能;当清零信号 clr 为高电平时,系统输出 min、sec、ms 均异步置零;当启动/暂停信号 en_count 为高电平时暂停计时,变低后在原来的数值基础上再计时。计时器模块功能仿真结果计时器模块时序仿真结果5.2 秒表仿真将计时器分频系数、数码管显示控制扫描时间、数码管地址选择扫描时间适当改小来仿真逻辑功能,下面对秒表系统进行功能仿真和时序仿真。由仿真结果波形图可知,清零信号 clr 为高电平时,数码管地址选择信号 column_scan_sig 为000000,同时点亮 6 位数码管(column_scan_sig 为 0 时点亮数码管),数码管显示控制信号 row_scan_si

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论