1、F512Hz的信号脉冲通过六进制计数器一个三位二进制数,把它作为六选一多路选择器和位选端控制器的输入。六选一多路选择器根据要求把输出信号给到译码器。位选端控制器产生一个六位二进制数决定哪个译码管亮。由于扫描频率超出人眼识别能力,所以表面上看每个译码管是同时亮的。图1-6 显示器 二 各模块说明2.1消抖模块2.1.1消抖模块原理按键开关是各种电子设备不可或缺的人机接口。在实际应用中,很大一部分的按键是机械按键。在机械按键的触点闭合和断开时,都会产生抖动,为了保证系统能正确识别按键的开关,就必须对按键的抖动进行处理。为了消除机械开关的抖动,可在开关与输出端点之间接人一个RS触发器,就能使输出端产
2、生很清晰的阶跃信号。2.1.2消抖模块程序代码module xiaodou(BJ_CLK,BUTTON_IN,BUTTON_OUT);input BJ_CLK;input BUTTON_IN;output BUTTON_OUT;reg BUTTON_IN_Q, BUTTON_IN_2Q, BUTTON_IN_3Q;always (posedge BJ_CLK)beginBUTTON_IN_Q = BUTTON_IN;BUTTON_IN_2Q = BUTTON_IN_Q;BUTTON_IN_3Q = BUTTON_IN_2Q;endwire BUTTON_OUT = BUTTON_IN_2Q |
3、 BUTTON_IN_3Q;endmodule仿真波形:2.2或门2.2.1或门原理对于计时和计分电路既需要低位的进位信号,又需要手动按键调时,所以需要将两个信号通过或门后给到计时器和计分器。对于或门,可用连续赋值语句C=A+B;实现。2.2.2或门程序代码module huo(in_1,in_2,huo_out);input in_1,in_2;output huo_out;assign huo_out=in_1+in_2;仿真波形2.3六进制计数器(不带进位端)2.3.1六进制计数器(不带进位端)原理该六进制计数器没有进位端,用于六选一多路选择器的输入,控制其输出计时器的计时信号。同时它也
4、作为位选端控制器的输入,决定哪个数码管亮。六进制计数器采用时序逻辑电路,从0开始计时到5后归零,重新进行开始计时。2.3.2六进制计数器(不带进位端)程序代码module liujinzhi(clk512,cout);output cout;input clk512;reg2:0 cout;always (posedge clk512)if(clk512) begin if(cout=3b101) cout=0; else=cout+3b1; endelsecout=cout;2.4 2分频2.4.1 2分频原理该模块用于产生秒计数脉冲。2分频即在每一个输入脉冲的上升沿(或下降沿)取反即可得到
5、。2.4.2 2分频程序代码module twofenpin (clk2,clk_out);output clk_out;input clk2;reg clk_out;always (posedge clk2)begin clk_out=clk_out;仿真波形:2.5十进制计数器2.5.1十进制计数器原理十进制计数器作为秒计数器和分计数器的低位,具有进位输出端和异步复位端,复位信号为高电平有效。它要求从0到9计数,到九清零重新计数。采用时序逻辑电路。设计时应考虑计数器能够进行级联。2.5.2十进制计数器程序代码module ji10(clk_1,reset,jinwei_1,d1);inpu
6、t clk_1,reset;output3:0 d1;output jinwei_1;reg3:reg jinwei_1;always(posedge clk_1,posedge reset)if(reset)d1=4b0;jinwei_1=1else if(d14d9)=d1+4else if(d1=42.6六进制计数器(含进位端)2.6.1六进制计数器(含进位端)原理该六进制计数器作为秒计数器和分计数器的高位, 具有进位输出端和异步复位端,复位信号为高电平有效。它要求从0到5计数,到5清零重新计数。2.6.2六进制计数器(含进位端)程序代码module liu(reset,clk_2,d2
7、,jinwei_2);output d2,jinwei_2;input reset,clk_2;0 d2;reg jinwei_2;always(posedge clk_2 or posedge reset)d2=3jinwei_2else if(d2=3d5)=d2+32.7时计数器2.7.1时计数器原理该时计数器实际是一个24进制计数器, 具有异步复位端,复位信号为高电平有效。它要求从0到23计数,到23清零重新计数。2.7.2时计数器程序代码module shi(reset,d5,d6,dw_shi);output d5,d6;input reset,dw_shi;0 d5;reg1:0
8、 d6;reg4:0 count;always(posedge reset or posedge dw_shi ) if(reset) d5 d6=2 count=5 else if(count=5d23) count=count+5=count%5d10;=count/5endmodule 2.8六选一多路选择器2.8.1六选一多路选择器原理六选一多路选择器通过六进制计数器的输出信号控制实现了对计数器产生的脉冲信号的选择性输出。加入此模块是为了实现数码管的动态扫描输出。六选一多路选择器的输入是一个三位二进制数,输出是计时器、计分器、计秒器的高位或低位。2.8.2六选一多路选择器程序代码mod
9、ule liutoyi(cin,d1,d2,d3,d4,d5,d6,cout);input2:0cin;input3:0d1,d3,d5;0d2,d4;input1:0d6;0cout;always(cin)case(cin)3b000:=d1;b001:=d2;b010:=d3;b011:=d4;b100:=d5;b101:=d6;endcase2.9位选端控制器2.9.1位选端控制器原理该数字钟采用动态扫描方式输出,数码管每一时刻只有一个在亮,因为切换频率超过人眼识别能力,所以可以认为它们是同时亮的。位选端控制器通过六进制计数器的输出决定哪一个数码管亮。位选端控制器实际是一个3-6译码器。
10、当输入是三位2进制数时,输出为6位2进制数。2.9.2位选端控制器程序代码module weixuan(cin,v);output v;0 cin;reg5:0 v;v=6b111110;b111101;b111011;b110111;b101111;b011111;default:b111111;2.10七段译码器2.10.1七段译码器原理七段译码器是对输入的信号对应的位置进行编码,使其能显示出输入的数的值。本文所介绍的译码器将小数点dp通过位拼接符将其与计数器的计数值组合,然后一同给到译码管,便于输出。计时器低位的小数点要求常亮,即dp=1;计分器的低位小数点要求以1Hz的频率闪烁,可以让
11、它以2分频的输出为值。2.10.2七段译码器程序代码module yimaguan(cin_7,cout_7,xuan_tong,clk_dp);0 cin_7;output cout_7;reg dpy;input clk_dp;0 xuan_tong;reg7:0 cout_7;always(xuan_tong)case(xuan_tong)dpy=clk_dp;always(cin_7)case(cin_7)b0000:cout_7=dpy,7b0111111;b0001:b0000110;b0010:b1011011;b0011:b1001111;b0100:b1100110;b010
12、1:b1101101;b0110:b1111101;b0111:b0000111;b1000:b1111111;b1001:b1101111;2.11综合模块2.11.1综合模块原理综合模块采用模块例化的方法实现。2.11.2综合模块程序代码module zonghe(reset,hour_add,f64,min_add,f2,f512,z_out,z_wx);input reset,hour_add,f64,min_add,f2,f512;output 7:0 z_out;output5:0 z_wx;wire f_2,x1,x2,m1,f1,j1,j2,j3,j4,huo1,huo2;wi
13、re3:0 dd1,dd3,dd5,qi1;wire2:0 dd2,dd4,six1;wire1:0 dd6;xiaodou xd1(.BJ_CLK(f64),.BUTTON_IN(min_add),.BUTTON_OUT(x1);xiaodou xd2(.BJ_CLK(f64),.BUTTON_IN(hour_add),.BUTTON_OUT(x2);twofenpin tfp1(.clk2(f2),.clk_out(f_2);ji10 ji101(.clk_1(f_2),.reset(reset),.jinwei_1(j1),.d1(dd1);liu l1(.reset(reset),.c
14、lk_2(j1),.d2(dd2),.jinwei_2(j2);huo h1(.in_1(x1),.in_2(j2),.huo_out(huo1);ji10 ji102(.clk_1(huo1),.reset(reset),.jinwei_1(j3),.d1(dd3);liu l2(.reset(reset),.clk_2(j3),.d2(dd4),.jinwei_2(j4);huo h2(.in_1(x2),.in_2(j4),.huo_out(huo2);shi sh1(.reset(reset),.d5(dd5),.d6(dd6),.dw_shi(huo2);liutoyi li1(.c
15、in(six1),.d1(dd1),.d2(dd2),.d3(dd3),.d4(dd4),.d5(dd5),.d6(dd6),.cout(qi1);liujinzhi ji1(.clk512(f512),.cout(six1);weixuan w1(.cin(six1),.v(z_wx);yimaguan(.cin_7(qi1),.cout_7(z_out),.xuan_tong(six1),.clk_dp(f_2);三 总结3.1硬件问题焊接前要先弄清楚要焊接的元件,尤其是各种不同的电阻、电容。焊接最需要注意的是焊接的温度和时间,我觉得焊接的时间最重要而且不太容易把握。焊接的时间不能太短,那
16、样焊点的温度就会太低,焊点融化不充分,很容易造成虚焊;而焊接时间长,则会使焊锡流淌,使元件过热,易于损坏,还容易烫坏电路板,同样会造成虚焊的现象。焊接芯片时应该先焊接好底端插座,注意插座方向灯。焊接完成后,焊点应呈现锥形,这才是好的焊点。3.2程序过大程序方面,由于EPM3 064 ALC44 -10芯片只有64个宏单元,编写程序时有可能导致所需的宏单元数超过提供的数量,经过分析在处理小数点的时候,直接把其作为与其它段显示一起定义成八位变量,这样就会增加芯片内存消耗,但实际要求中只用到两个小数点,所以把这个小数点单独进行操作处理,大大减少了宏单元的利用,这样才能编译成功。3.3赋值问题初次实验,第一次按键不起作用。原因是出在阻塞与非阻塞赋值上。非阻塞赋值在过程块执行完后才赋值,由于变量初始值为0,所以第一次按键变量的值并未随之改变。此时我们可以适当调整赋值顺序,将其改变为阻塞赋值。即可解决这一问题。参考文献978-7-81124-309-3 夏宇闻.Verilog数字系统设计教程.北京航空航天大学出版社,2008年6月,1212页EDA技术实验指导书 河北大学 2014年2月