基于verilog的电子时钟报告综述Word下载.docx
- 文档编号:4889790
- 上传时间:2023-05-04
- 格式:DOCX
- 页数:19
- 大小:237.64KB
基于verilog的电子时钟报告综述Word下载.docx
《基于verilog的电子时钟报告综述Word下载.docx》由会员分享,可在线阅读,更多相关《基于verilog的电子时钟报告综述Word下载.docx(19页珍藏版)》请在冰点文库上搜索。
F512Hz的信号脉冲通过六进制计数器一个三位二进制数,把它作为六选一多路选择器和位选端控制器的输入。
六选一多路选择器根据要求把输出信号给到译码器。
位选端控制器产生一个六位二进制数决定哪个译码管亮。
由于扫描频率超出人眼识别能力,所以表面上看每个译码管是同时亮的。
图1-6显示器
二各模块说明
2.1消抖模块
2.1.1消抖模块原理
按键开关是各种电子设备不可或缺的人机接口。
在实际应用中,很大一部分的按键是机械按键。
在机械按键的触点闭合和断开时,都会产生抖动,为了保证系统能正确识别按键的开关,就必须对按键的抖动进行处理。
为了消除机械开关的抖动,可在开关与输出端点之间接人一个RS触发器,就能使输出端产生很清晰的阶跃信号。
2.1.2消抖模块程序代码
modulexiaodou(BJ_CLK,BUTTON_IN,BUTTON_OUT);
inputBJ_CLK;
inputBUTTON_IN;
outputBUTTON_OUT;
regBUTTON_IN_Q,BUTTON_IN_2Q,BUTTON_IN_3Q;
always@(posedgeBJ_CLK)
begin
BUTTON_IN_Q<
=BUTTON_IN;
BUTTON_IN_2Q<
=BUTTON_IN_Q;
BUTTON_IN_3Q<
=BUTTON_IN_2Q;
end
wireBUTTON_OUT=BUTTON_IN_2Q|BUTTON_IN_3Q;
endmodule
仿真波形:
2.2或门
2.2.1或门原理
对于计时和计分电路既需要低位的进位信号,又需要手动按键调时,所以需要将两个信号通过或门后给到计时器和计分器。
对于或门,可用连续赋值语句C=A+B;
实现。
2.2.2或门程序代码
modulehuo(in_1,in_2,huo_out);
inputin_1,in_2;
outputhuo_out;
assignhuo_out=in_1+in_2;
仿真波形
2.3六进制计数器(不带进位端)
2.3.1六进制计数器(不带进位端)原理
该六进制计数器没有进位端,用于六选一多路选择器的输入,控制其输出计时器的计时信号。
同时它也作为位选端控制器的输入,决定哪个数码管亮。
六进制计数器采用时序逻辑电路,从0开始计时到5后归零,重新进行开始计时。
2.3.2六进制计数器(不带进位端)程序代码
moduleliujinzhi(clk512,cout);
outputcout;
inputclk512;
reg[2:
0]cout;
always@(posedgeclk512)
if(clk512)
begin
if(cout==3'
b101)
cout<
=0;
else
=cout+3'
b1;
end
else
cout<
=cout;
2.42分频
2.4.12分频原理
该模块用于产生秒计数脉冲。
2分频即在每一个输入脉冲的上升沿(或下降沿)取反即可得到。
2.4.22分频程序代码
moduletwofenpin(clk2,clk_out);
outputclk_out;
inputclk2;
regclk_out;
always@(posedgeclk2)
begin
clk_out<
=~clk_out;
仿真波形:
2.5十进制计数器
2.5.1十进制计数器原理
十进制计数器作为秒计数器和分计数器的低位,具有进位输出端和异步复位端,复位信号为高电平有效。
它要求从0到9计数,到九清零重新计数。
采用时序逻辑电路。
设计时应考虑计数器能够进行级联。
2.5.2十进制计数器程序代码
moduleji10(clk_1,reset,jinwei_1,d1);
inputclk_1,reset;
output[3:
0]d1;
outputjinwei_1;
reg[3:
regjinwei_1;
always@(posedgeclk_1,posedgereset)
if(reset)
d1<
=4'
b0;
jinwei_1<
=1'
elseif(d1<
4'
d9)
=d1+4'
elseif(d1==4'
2.6六进制计数器(含进位端)
2.6.1六进制计数器(含进位端)原理
该六进制计数器作为秒计数器和分计数器的高位,具有进位输出端和异步复位端,复位信号为高电平有效。
它要求从0到5计数,到5清零重新计数。
2.6.2六进制计数器(含进位端)程序代码
moduleliu(reset,clk_2,d2,jinwei_2);
outputd2,jinwei_2;
inputreset,clk_2;
0]d2;
regjinwei_2;
always@(posedgeclk_2orposedgereset)
d2<
=3'
jinwei_2<
elseif(d2==3'
d5)
=d2+3'
2.7时计数器
2.7.1时计数器原理
该时计数器实际是一个24进制计数器,具有异步复位端,复位信号为高电平有效。
它要求从0到23计数,到23清零重新计数。
2.7.2时计数器程序代码
moduleshi(reset,d5,d6,dw_shi);
outputd5,d6;
inputreset,dw_shi;
0]d5;
reg[1:
0]d6;
reg[4:
0]count;
always@(posedgeresetorposedgedw_shi)
if(reset)
d5<
d6<
=2'
count<
=5'
elseif(count==5'
d23)
count=count+5'
=count%5'
d10;
=count/5'
endmodule
2.8六选一多路选择器
2.8.1六选一多路选择器原理
六选一多路选择器通过六进制计数器的输出信号控制实现了对计数器产生的脉冲信号的选择性输出。
加入此模块是为了实现数码管的动态扫描输出。
六选一多路选择器的输入是一个三位二进制数,输出是计时器、计分器、计秒器的高位或低位。
2.8.2六选一多路选择器程序代码
moduleliutoyi(cin,d1,d2,d3,d4,d5,d6,cout);
input[2:
0]cin;
input[3:
0]d1,d3,d5;
0]d2,d4;
input[1:
0]d6;
0]cout;
always@(cin)
case(cin)
3'
b000:
=d1;
b001:
=d2;
b010:
=d3;
b011:
=d4;
b100:
=d5;
b101:
=d6;
endcase
2.9位选端控制器
2.9.1位选端控制器原理
该数字钟采用动态扫描方式输出,数码管每一时刻只有一个在亮,因为切换频率超过人眼识别能力,所以可以认为它们是同时亮的。
位选端控制器通过六进制计数器的输出决定哪一个数码管亮。
位选端控制器实际是一个3-6译码器。
当输入是三位2进制数时,输出为6位2进制数。
2.9.2位选端控制器程序代码
moduleweixuan(cin,v);
outputv;
0]cin;
reg[5:
0]v;
v<
=6'
b111110;
b111101;
b111011;
b110111;
b101111;
b011111;
default:
b111111;
2.10七段译码器
2.10.1七段译码器原理
七段译码器是对输入的信号对应的位置进行编码,使其能显示出输入的数的值。
本文所介绍的译码器将小数点dp通过位拼接符将其与计数器的计数值组合,然后一同给到译码管,便于输出。
计时器低位的小数点要求常亮,即dp=1;
计分器的低位小数点要求以1Hz的频率闪烁,可以让它以2分频的输出为值。
2.10.2七段译码器程序代码
moduleyimaguan(cin_7,cout_7,xuan_tong,
clk_dp);
0]cin_7;
outputcout_7;
regdpy;
inputclk_dp;
0]xuan_tong;
reg[7:
0]cout_7;
always@(xuan_tong)
case(xuan_tong)
dpy<
=clk_dp;
always@(cin_7)
case(cin_7)
b0000:
cout_7<
={dpy,7'
b0111111};
b0001:
b0000110};
b0010:
b1011011};
b0011:
b1001111};
b0100:
b1100110};
b0101:
b1101101};
b0110:
b1111101};
b0111:
b0000111};
b1000:
b1111111};
b1001:
b1101111};
2.11综合模块
2.11.1综合模块原理
综合模块采用模块例化的方法实现。
2.11.2综合模块程序代码
modulezonghe(reset,hour_add,f64,min_add,f2,f512,z_out,z_wx);
inputreset,hour_add,f64,min_add,f2,f512;
output[7:
0]z_out;
output[5:
0]z_wx;
wiref_2,x1,x2,m1,f1,j1,j2,j3,j4,huo1,huo2;
wire[3:
0]dd1,dd3,dd5,qi1;
wire[2:
0]dd2,dd4,six1;
wire[1:
0]dd6;
xiaodouxd1(.BJ_CLK(f64),.BUTTON_IN(min_add),.BUTTON_OUT(x1));
xiaodouxd2(.BJ_CLK(f64),.BUTTON_IN(hour_add),.BUTTON_OUT(x2));
twofenpintfp1(.clk2(f2),.clk_out(f_2));
ji10ji101(.clk_1(f_2),.reset(reset),.jinwei_1(j1),.d1(dd1));
liul1(.reset(reset),.clk_2(j1),.d2(dd2),.jinwei_2(j2));
huoh1(.in_1(x1),.in_2(j2),.huo_out(huo1));
ji10ji102(.clk_1(huo1),.reset(reset),.jinwei_1(j3),.d1(dd3));
liul2(.reset(reset),.clk_2(j3),.d2(dd4),.jinwei_2(j4));
huoh2(.in_1(x2),.in_2(j4),.huo_out(huo2));
shish1(.reset(reset),.d5(dd5),.d6(dd6),.dw_shi(huo2));
liutoyili1(.cin(six1),.d1(dd1),.d2(dd2),.d3(dd3),.d4(dd4),.d5(dd5),.d6(dd6),.cout(qi1));
liujinzhiji1(.clk512(f512),.cout(six1));
weixuanw1(.cin(six1),.v(z_wx));
yimaguan(.cin_7(qi1),.cout_7(z_out),.xuan_tong(six1),.clk_dp(f_2));
三总结
3.1硬件问题
焊接前要先弄清楚要焊接的元件,尤其是各种不同的电阻、电容。
焊接最需要注意的是焊接的温度和时间,我觉得焊接的时间最重要而且不太容易把握。
焊接的时间不能太短,那样焊点的温度就会太低,焊点融化不充分,很容易造成虚焊;
而焊接时间长,则会使焊锡流淌,使元件过热,易于损坏,还容易烫坏电路板,同样会造成虚焊的现象。
焊接芯片时应该先焊接好底端插座,注意插座方向灯。
焊接完成后,焊点应呈现锥形,这才是好的焊点。
3.2程序过大
程序方面,由于EPM3064ALC44-10芯片只有64个宏单元,编写程序时有可能导致所需的宏单元数超过提供的数量,经过分析在处理小数点的时候,直接把其作为与其它段显示一起定义成八位变量,这样就会增加芯片内存消耗,但实际要求中只用到两个小数点,所以把这个小数点单独进行操作处理,大大减少了宏单元的利用,这样才能编译成功。
3.3赋值问题
初次实验,第一次按键不起作用。
原因是出在阻塞与非阻塞赋值上。
非阻塞赋值在过程块执行完后才赋值,由于变量初始值为0,所以第一次按键变量的值并未随之改变。
此时我们可以适当调整赋值顺序,将其改变为阻塞赋值。
即可解决这一问题。
参考文献
[978-7-81124-309-3]夏宇闻.Verilog数字系统设计教程.北京航空航天大学出版社,2008年6月,1—212页
EDA技术实验指导书河北大学2014年2月
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 verilog 电子 时钟 报告 综述