1、数字秒表采用模块化设计:(1)输入信号:基准时钟 clk (20MHz),清零端 clr(高电平有效),启动/暂停信号 en_count(低电平时启动,高电平时暂停)(2)计时器:以 10ms 为计时分辨率,每 10ms 产生一个“10 毫秒脉冲”信号,每 990ms 产生一个“秒脉冲”信号,每 60 秒产生一个“分脉冲”信号;(3)取数模块:对计时器输出的分、秒、十毫秒信号进行逐位取数,变成将在数码管上显示的十进制数;(4)编码模块:将分、秒、十毫秒的十进制数转换成数码管显示的编码;(5)数码管显示控制模块:每隔 3ms 使能更新不同数码管的数据,6 位数码管更新一次共用时 18ms,刷新频
2、率大于 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
3、 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;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(e
4、n_count),.ms(ms),.sec(sec),.min(min) / output - to U1);number_mod U1.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 U2encoder U2.ms_ten(ms_ten),.ms_hu
5、n(ms_hun),/ input - from U1.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 - to U3.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 - to U3row_scan U3.min_o
6、ne_dis(min_one_dis),.min_ten_dis(min_ten_dis),.row_scan_sig(row_scan_sig) / output of top/input - from U2column_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,m
7、s,sec,min);input clk,clr,en_count; output 7: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 else= count1 + 1b1;beginr_min = 8
8、 r_sec r_ms endelse if(en_count) begin= r_min;= r_sec;= r_ms;end elseif(count1 = T10MS) beginif(r_ms = 8d99) beginr_ms if(r_sec = 8d59)r_sec if(r_min = 8 else= r_min + 1= r_sec + 1= r_ms + 1assign ms = r_ms;assign sec = r_sec; assign min = r_min;endmodule4.3 取数模块基准时钟 clk,清零端 clr,启动/暂停信号 en_count,分 m
9、in、秒 sec、毫秒 ms毫秒的十位 ms_ten、毫秒的百位 ms_hun、秒的个位 sec_one、秒的十位 sec_ten、分的个位 min_one、分的十位 min_tenmodule number_modclk,clr,en_count,ms,sec,min, ms_ten,ms_hun,sec_one,sec_ten,min_one,min_ten input 7:output 3:/*/reg 31:0r_ms_hun,r_ms_ten,r_sec_ten,r_sec_one,r_min_ten,r_min_one; /*在 quartus II 9.0 版本中,“除法器”可以
10、自己定义。在更高级的版本中,默认下“除法器”和“求余器”是 32 位输出。但是经过“编译”过后,编译器会“自动优化”最适合的位宽*/r_ms_ten = 32 r_ms_hun else if( 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
11、 /*/assign ms_ten = r_ms_ten3:0;assign ms_hun = r_ms_hun3:assign sec_one = r_sec_one3:assign sec_ten = r_sec_ten3:assign min_one = r_min_one3:assign min_ten = r_min_ten3:/*/4.4 编码模块基准时钟 clk,清零端 clr,启动/暂停信号 en_count,毫秒的十位 ms_ten、毫秒的百位ms_hun、秒的个位 sec_one、秒的十位 sec_ten、分的个位 min_one、分的十位 min_ten毫秒的十位编码 m
12、s_ten_dis、毫秒的百位编码 ms_hun_dis、秒的个位编码 sec_one_dis、秒的十位编码 sec_ten_dis、分的个位编码 min_one_dis、分的十位编码 min_ten_dismodule encoderclk,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_disinput 3:0 ms_ten,ms_hun,sec_ten,sec_one,min_ten
13、,min_one;/* 不带小数点的数码管显示 */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
14、_ = 8b0011_0000, _4_ = 8b0001_1001, _5_ = 8b0001_0010, _6_ = 8b0000_0010, _7_ = 8b0111_1000, _8_ = 8b0000_0000, _9_ = 8b0001_0000;/*/0r_ms_ten_dis;r_ms_ten_dis = _0; else if( en_count )= r_ms_ten_dis;case(ms_ten)4d0 : r_ms_ten_dis d1 := _1;d2 := _2;d3 := _3;d4 := _4;d5 := _5;d6 := _6;d7 := _7;d8 :=
15、_8;d9 := _9; endcase/*/0r_ms_hun_dis;always (posedge clk or posedge clr) if( clr )r_ms_hun_dis = r_ms_hun_dis;case(ms_hun) r_ms_hun_dis 0r_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:0r_sec_ten_dis;r_sec_ten_dis = r_sec_ten_dis;case(sec_ten) r_sec_ten_dis 0r_min_one_dis;r_min_one_dis = r_min_one_dis;case(min_one) r_min_one_dis 0r_min_ten_dis;r_min_ten_dis = r_min_ten_dis;case(min_ten) r_min_ten_dis d
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1