VHDL数字秒表设计Word文档下载推荐.docx
《VHDL数字秒表设计Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《VHDL数字秒表设计Word文档下载推荐.docx(19页珍藏版)》请在冰豆网上搜索。
数字秒表采用模块化设计:
(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;
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
.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
.ms_ten(ms_ten),.ms_hun(ms_hun),
//input-fromU1
.sec_one(sec_one),.sec_ten(sec_ten),
.min_one(min_one),.min_ten(min_ten),
.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),
.min_one_dis(min_one_dis),.min_ten_dis(min_ten_dis)//output-toU3
row_scanU3
.min_one_dis(min_one_dis),.min_ten_dis(min_ten_dis),
.row_scan_sig(row_scan_sig)
//outputoftop
//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:
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<
else
=count1+1'
b1;
begin
r_min<
=8'
r_sec<
r_ms<
end
elseif(en_count)begin
=r_min;
=r_sec;
=r_ms;
endelse
if(count1==T10MS)begin
if(r_ms==8'
d99)begin
r_ms<
if(r_sec==8'
d59)
r_sec<
if(r_min==8'
else
=r_min+1'
=r_sec+1'
=r_ms+1'
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
input[7:
output[3:
/*********************************/
reg[31:
0]r_ms_hun,r_ms_ten,r_sec_ten,r_sec_one,r_min_ten,r_min_one;
/*在quartusII9.0版本中,“除法器”可以自己定义。
在更高级的版本中,默认下“除法器”和“求余器”是32位输出。
但是经过“编译”过后,编译器会“自动优化”最适合的位宽*/
r_ms_ten<
=32'
r_ms_hun<
elseif(en_count)begin
=r_ms_ten;
r_ms_hun<
=r_ms_hun;
=ms%10;
=ms/10;
r_sec_one<
r_sec_ten<
=r_sec_one;
=r_sec_ten;
=sec%10;
=sec/10;
r_min_one<
r_min_ten<
=r_min_one;
=r_min_ten;
=min%10;
=min/10;
end/***********************************/
assignms_ten=r_ms_ten[3:
0];
assignms_hun=r_ms_hun[3:
assignsec_one=r_sec_one[3:
assignsec_ten=r_sec_ten[3:
assignmin_one=r_min_one[3:
assignmin_ten=r_min_ten[3:
/***********************************/
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
input[3:
0]ms_ten,ms_hun,sec_ten,sec_one,min_ten,min_one;
/*******************不带小数点的数码管显示*********************/
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;
/*************************************/
0]r_ms_ten_dis;
r_ms_ten_dis<
=_0;
elseif(en_count)
=r_ms_ten_dis;
case(ms_ten)
4'
d0:
r_ms_ten_dis<
d1:
=_1;
d2:
=_2;
d3:
=_3;
d4:
=_4;
d5:
=_5;
d6:
=_6;
d7:
=_7;
d8:
=_8;
d9:
=_9;
endcase
/***************************************/
0]r_ms_hun_dis;
always@(posedgeclkorposedgeclr)if(clr)
r_ms_hun_dis<
=r_ms_hun_dis;
case(ms_hun)
r_ms_hun_dis<
0]r_sec_one_dis;
r_sec_one_dis<
=_0_;
=r_sec_one_dis;
case(sec_one)
r_sec_one_dis<
=_1_;
=_2_;
=_3_;
=_4_;
=_5_;
=_6_;
=_7_;
=_8_;
=_9_;
/***************************************/reg[7:
0]r_sec_ten_dis;
r_sec_ten_dis<
=r_sec_ten_dis;
case(sec_ten)
r_sec_ten_dis<
0]r_min_one_dis;
r_min_one_dis<
=r_min_one_dis;
case(min_one)
r_min_one_dis<
0]r_min_ten_dis;
r_min_ten_dis<
=r_min_ten_dis;
case(min_ten)
r_min_ten_dis<
d