VHDL数字秒表设计.docx
《VHDL数字秒表设计.docx》由会员分享,可在线阅读,更多相关《VHDL数字秒表设计.docx(22页珍藏版)》请在冰豆网上搜索。
![VHDL数字秒表设计.docx](https://file1.bdocx.com/fileroot1/2023-2/24/b27a65b3-d7a0-4a99-98b7-863d4556f052/b27a65b3-d7a0-4a99-98b7-863d4556f0521.gif)
VHDL数字秒表设计
通达学院
2017/2018学年第一学期
课程设计实验报告
模块名称VHDL课程设计
专业
学生班级
学生学号
学生姓名
指导教师
设计题目
数字秒表设计
任务要求
(1)计时精度10ms,计时范围0~4分59、99秒;
(2)设置启动、停止与复位键控制秒表的工作
(3)用数码管实时显示计时结果。
设备及软件
QuasterⅡ
一、课程设计目的与要求
1、1课程设计目的
《EDA技术综合设计与实践》(注:
EDA即电子设计自动化,ElectronicsDesignAutomation)就是继《模拟电子技术基础》、《数字电子技术基础》、《电子技术基础实验》、《EDA》等课程后,电子类等专业学生在电子技术实验技能方面综合性质的实验训练课程,就是电子技术基础的一个部分,其目的与任务就是通过一周的时间,让学生掌握EDA的基本方法,熟悉一种EDA软件(QuartusII),并能利用EDA软件设计一个电子技术综合问题,并在实验板上成功下载,为以后进行工程实际问题的研究打下设计基础。
1、2基本要求
(1)通过课程设计使学生能熟练掌握一种EDA软件(QuartusII)的使用方法,能熟练进行设计输入、编译、管脚分配、下载等过程。
(2)通过课程设计使学生能利用EDA软件(QuartusII)进行至少一个电子技术综合问题的设计(内容可由老师指定或自由选择),设计输入采用VerilogHDL硬件描述语言输入法。
(3)通过课程设计使学生初步具有分析、寻找与排除电子电路中常见故障的能力。
(4)通过课程设计使学生能独立写出严谨的、有理论根据的、实事求就是的、文理通顺的课程设计报告。
二、设计方案--数字秒表的设计
2、1设计功能
(1)计时功能:
设计一个秒表,该秒表计时范围为0--59分59秒990毫秒,分辨率为10毫秒(0、01
秒)。
(2)显示功能:
分、秒、毫秒各用2位数码管(共6位数码管)显示。
(3)清零,启动计时,暂停及继续计时功能:
2、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、WindowsXP32位操作系统
3、Altera公司的QuartusII9、0软件
4、基于CycloneII型EP2C8Q208C8的开发板
四、模块结构
4、1数字秒表RTL级电路
modulecounter_top(clk,en_count,clr,row_scan_sig,column_scan_sig);
inputclk;//inputclock20MHz
inputen_count;//startandpause
inputclr;//clear
output[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;
countU0
(
、clk(clk),、clr(clr),、en_count(en_count),
、ms(ms),、sec(sec),、min(min)//output-toU1
);
number_modU1
(
、clk(clk),、clr(clr),、en_count(en_count),
、ms(ms),、sec(sec),、min(min),//input-fromU0
、ms_ten(ms_ten),、ms_hun(ms_hun),//output-toU2
、sec_one(sec_one),、sec_ten(sec_ten),//output-toU2
、min_one(min_one),、min_ten(min_ten)//output-toU2
);
encoderU2
(
、clk(clk),、clr(clr),、en_count(en_count),
、ms_ten(ms_ten),、ms_hun(ms_hun),
//input-fromU1
、sec_one(sec_one),、sec_ten(sec_ten),
//input-fromU1
、min_one(min_one),、min_ten(min_ten),
//input-fromU1
、ms_ten_dis(ms_ten_dis),、ms_hun_dis(ms_hun_dis),
//output-toU3
、sec_one_dis(sec_one_dis),、sec_ten_dis(sec_ten_dis),
//output-toU3
、min_one_dis(min_one_dis),、min_ten_dis(min_ten_dis)//output-toU3
);
row_scanU3
(
、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)
//outputoftop
//input-fromU2
//input-fromU2
//input-fromU2
);
column_scanU4
(
、clk(clk),、clr(clr),
、column_scan_sig(column_scan_sig)//outputoftop
);endmodule
4、2计时器模块
输入信号:
基准时钟clk,清零端clr,启动/暂停信号en_count
输出信号:
分min、秒sec、毫秒ms
modulecount(clk,clr,en_count,ms,sec,min);
inputclk,clr,en_count;output[7:
0]ms,sec,min;
reg[17:
0]count1;
reg[7:
0]r_min,r_sec,r_ms;
parameterT10MS=18'd199_999;
//parameterT10MS=18'd1;/*setT10MS=18'd1forsimulation*/
always@(posedgeclkorposedgeclr)if(clr)
count1<=18'd0;
elseif(count1==T10MS)count1<=18'd0;
else
count1<=count1+1'b1;
always@(posedgeclkorposedgeclr)if(clr)
begin
r_min<=8'd0;r_sec<=8'd0;r_ms<=8'd0;
end
elseif(en_count)begin
r_min<=r_min;r_sec<=r_sec;r_ms<=r_ms;
endelse
begin
if(count1==T10MS)begin
if(r_ms==8'd99)begin
r_ms<=8'd0;if(r_sec==8'd59)
begin
r_sec<=8'd0;if(r_min==8'd59)
r_min<=8'd0;else
r_min<=r_min+1'b1;
endelse
r_sec<=r_sec+1'b1;
endelse
r_ms<=r_ms+1'b1;
end
end
assignms=r_ms;
assignsec=r_sec;
assignmin=r_min;
endmodule
4、3取数模块
输入信号:
基准时钟clk,清零端clr,启动/暂停信号en_count,分min、秒sec、毫秒ms
输出信号:
毫秒的十位ms_ten、毫秒的百位ms_hun、秒的个位sec_one、秒的十位sec_ten、分的个位min_one、分的十位min_tenmodulenumber_mod
(
clk,clr,en_count,ms,sec,min,ms_ten,ms_hun,sec_one,sec_ten,min_one,min_ten
);
inputclk,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:
0]r_ms_hun,r_ms_ten,r_sec_ten,r_sec_one,r_min_ten,r_min_one;/*在quartusII9、0版本中,“除法器”可以自己定义。
在更高级的版本中,默认下“除法器”与“求余器”就是32位输出。
但就是经过“编译”过后,编译器会“自动优化”最适合的位宽*/
always@(posedgeclkorposedgeclr)if(clr)
begin
r_ms_ten<=32'd0;r_ms_hun<=32'd0;
end
elseif(en_count)begin
r_ms_ten<=r_ms_ten;
r_ms_hun<=r_ms_hun;
endelse
begin
r_ms_ten<=ms%10;r_ms_hun<=ms/10;
end
always@(posedgeclkorposedgeclr)if(clr)
begin
r_sec_one<=32'd0;r_sec_ten<=32'd0;
end
elseif(en_count)begin
r_sec_one<=r_sec_one;r_sec_ten<=r_sec_ten;
endelse
begin
r_sec_one<=sec%10;r_sec_ten<=sec/10;
end
always@(posedgeclkorposedgeclr)if(clr)
begin
r_min_one<=32'd0;r_min_ten<=32'd0;
end
elseif(en_count)begin
r_min_one<=r_min_one;r_min_ten<=r_min_ten;
endelse
begin
r_min_one<=min%10;r_min_ten<=min/10;
end/***********************************/
assignms_ten=r_ms_ten[3:
0];
assignms_hun=r_ms_hun[3:
0];
assignsec_one=r_sec_one[3:
0];
assignsec_ten=r_sec_ten[3:
0];
assignmin_one=r_min_one[3:
0];
assignmin_ten=r_min_ten[3:
0];
/***********************************/
endmodule
4、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_dismoduleencoder
(
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
);
inputclk,clr,en_count;
input[3:
0]ms_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=8'b1100_0000,_1=8'b1111_1001,_2=8'b1010_0100,_3=8'b1011_0000,_4=8'b1001_1001,_5=8'b1001_0010,_6=8'b1000_0010,_7=8'b1111_1000,_8=8'b1000_0000,_9=8'b1001_0000;
/*******************带小数点的数码管显示*********************/
parameter_0_=8'b0100_0000,_1_=8'b0111_1001,_2_=8'b0010_0100,
_3_=8'b0011_0000,_4_=8'b0001_1001,_5_=8'b0001_0010,
_6_=8'b0000_0010,_7_=8'b0111_1000,_8_=8'b0000_0000,
_9_=8'b0001_0000;
/*************************************/
reg[7:
0]r_ms_ten_dis;
always@(posedgeclkorposedgeclr)if(clr)
r_ms_ten_dis<=_0;elseif(en_count)
r_ms_ten_dis<=r_ms_ten_dis;
else
case(ms_ten)
4'd0:
r_ms_ten_dis<=_0;
4'd1:
r_ms_ten_dis<=_1;
4'd2:
r_ms_ten_dis<=_2;
4'd3:
r_ms_ten_dis<=_3;
4'd4:
r_ms_ten_dis<=_4;
4'd5:
r_ms_ten_dis<=_5;
4'd6:
r_ms_ten_dis<=_6;
4'd7:
r_ms_ten_dis<=_7;
4'd8:
r_ms_ten_dis<=_8;
4'd9:
r_ms_ten_dis<=_9;endcase
/***************************************/
reg[7:
0]r_ms_hun_dis;
always@(posedgeclkorposedgeclr)if(clr)
r_ms_hun_dis<=_0;elseif(en_count)
r_ms_hun_dis<=r_ms_hun_dis;
else
case(ms_hun)
4'd0:
r_ms_hun_dis<=_0;
4'd1:
r_ms_hun_dis<=_1;
4'd2:
r_ms_hun_dis<=_2;
4'd3:
r_ms_hun_dis<=_3;
4'd4:
r_ms_hun_dis<=_4;
4'd5:
r_ms_hun_dis<=_5;
4'd6:
r_ms_hun_dis<=_6;
4'd7:
r_ms_hun_dis<=_7;
4'd8:
r_ms_hun_dis<=_8;
4'd9:
r_ms_hun_dis<=_9;endcase
/***************************************/
reg[7:
0]r_sec_one_dis;
always@(posedgeclkorposedgeclr)if(clr)
r_sec_one_dis<=_0_;elseif(en_count)
r_sec_one_dis<=r_sec_one_dis;else
case(sec_one)
4'd0:
r_sec_one_dis<=_0_;
4'd1:
r_sec_one_dis<=_1_;
4'd2:
r_sec_one_dis<=_2_;
4'd3:
r_sec_one_dis<=_3_;
4'd4:
r_sec_one_dis<=_4_;
4'd5:
r_sec_one_dis<=_5_;
4'd6:
r_sec_one_dis<=_6_;
4'd7:
r_sec_one_dis<=_7_;
4'd8:
r_sec_one_dis<=_8_;
4'd9:
r_sec_one_dis<=_9_;endcase
/***************************************/reg[7:
0]r_sec_ten_dis;
always@(posedgeclkorposedgeclr)if(clr)
r_sec_ten_dis<=_0;elseif(en_count)
r_sec_ten_dis<=r_sec_ten_dis;
else
case(sec_ten)
4'd0:
r_sec_ten_dis<=_0;
4'd1:
r_sec_ten_dis<=_1;
4'd2:
r_sec_ten_dis<=_2;
4'd3:
r_sec_ten_dis<=_3;
4'd4:
r_sec_ten_dis<=_4;
4'd5:
r_sec_ten_dis<=_5;
4'd6:
r_sec_ten_dis<=_6;
4'd7:
r_sec_ten_dis<=_7;
4'd8:
r_sec_ten_dis<=_8;
4'd9:
r_sec_ten_dis<=_9;endcase
/***************************************/
reg[7:
0]r_min_one_dis;
always@(posedgeclkorposedgeclr)if(clr)
r_min_one_dis<=_0_;elseif(en_count)
r_min_one_dis<=r_min_one_dis;
else
case(min_one)
4'd0:
r_min_one_dis<=_0_;
4'd1:
r_min_one_dis<=_1_;
4'd2:
r_min_one_dis<=_2_;
4'd3:
r_min_one_dis<=_3_;
4'd4:
r_min_one_dis<=_4_;
4'd5:
r_min_one_dis<=_5_;
4'd6:
r_min_one_dis<=_6_;
4'd7:
r_min_one_dis<=_7_;
4'd8:
r_min_one_dis<=_8_;
4'd9:
r_min_one_dis<=_9_;endcase
/***************************************/
reg[7:
0]r_min_ten_dis;
always@(posedgeclkorposedgeclr)if(clr)
r_min_ten_dis<=_0;elseif(en_count)
r_min_ten_dis<=r_min_ten_dis;
else
case(min_ten)
4'd0:
r_min_ten_dis<=_0;
4'd1:
r_min_ten_dis<=_1;
4'd2:
r_m