课程设计多功能数字钟电路设计.docx
- 文档编号:3983257
- 上传时间:2022-11-26
- 格式:DOCX
- 页数:26
- 大小:284.37KB
课程设计多功能数字钟电路设计.docx
《课程设计多功能数字钟电路设计.docx》由会员分享,可在线阅读,更多相关《课程设计多功能数字钟电路设计.docx(26页珍藏版)》请在冰豆网上搜索。
课程设计多功能数字钟电路设计
2009—2010学年第二学期
数字电子技术课程设计报告
专业班级自动化08—2班
姓名
学号
开课系室电工电子学教学中心
设计日期2010年8月23日~27日
设计题目:
多功能数字钟电路设计
一、设计任务及要求:
本次课程设计任务是设计一个多功能数字钟。
具体要求是:
1.钟表的工作机理,整个钟表的工作应该是在1Hz信号的作用下进行,这样每来一个时钟信号,秒增加1秒,当秒从59秒跳转到00秒时,分钟增加1分,同时当分钟从59分跳转到00分时,小时增加1小时,但是需要注意的是,小时的范围是从0~23时。
2.小时-分钟-秒钟。
3.整点报时,在整点前5秒LED开始按照1HZ频率闪烁,过整点后,停止闪烁。
4.调整时间的按键用按键模块的S1和S2,S1调节小时,每按下一次,小时增加一个小时,S2调整分钟,每按下一次,分钟增加一分钟。
另外用S8按键作为系统时钟复位,复位后全部显示00-00-00。
二、设计原理与方案:
(一)、顶层设计方案:
(包括原理框图及其工作原理说明等内容)
图1原理框图
工作原理说明:
clk用于输入50MHZ时钟,s1用于给小时加1,s2用于给分钟加1,s8用于复位。
分频器分出三个频率的时钟,clkout1输出1HZ,clkout2输出1千HZ,clkout1输出2HZ。
控制器输入端口t1用于控制灯闪烁,输出端口led接小灯,ss1、ss2、reset分别储存s1、s2、s8的值并将其传给计数器。
计数器输出端口shis表示小时的十位,shig表示小时的各位,mins表示分钟的十位,ming表示分钟的个位。
secs表示秒的十位,secg表示秒的个位。
显示器输出端口leds接七段数码管,wei接数码管的控制端。
当clkout1出现上升沿时,秒执行加1或进位操作,若秒进位,则分钟执行加1或进位操作,若分秒都进位,则小时进行加1或进位操作。
小时进位前5秒,灯开始以1HZ频率闪烁。
按下s1时小时加1或进位,按下s2时分钟加1或进位,若分钟进位,小时同时进行加1或进位操作。
整体仿真源文件:
图2整体仿真源文件
说明:
s1、s2、s8按下时为0,不按下时为1。
当s8按下时,全部归0。
当s1按下时,小时假1,当s2按下时,分钟加1。
输入波形中刚开始s8为0,归0。
然后让其运行一段时间,再让s1为0,再过一段时间让s2为0,再过一段时间让s8为0。
clk为脉冲信号,10ps一周期。
输出放大截图:
图3输出仿真波形放大截图第一部分
图4输出仿真波形放大截图第二部分(灯的闪烁)
说明:
仿真时计数器控制器都是12分频,灯闪烁是6分频,显示器是2分频,因此能看到输出的6个数码管的值。
并对其进行初步判断。
由于数码管数值不易分辨,所以不用全部看到,只看一部分即可。
(二)、各个电路子模块:
1.分频器设计方案
设计思路:
设计计数变量cout1、cout2、cout3,每来一个脉冲加1。
cout1加到50000000时归0,同时clkout1加1,否则clkout1归0。
cout2到25000000时归0,同时clkout2加1,否则clkout2归0。
cout3到25000000时归0,同时clkout3加1,否则clkout3归0。
源程序:
modulefenpin(clk,clkout1,clkout2,clkout3);
inputclk;//下载时clk为50MHz
outputclkout1,clkout2,clkout3;//clkout1输出1赫兹,clkout2为1千赫兹,clkout3为2赫兹
regclkout1,clkout2,clkout3;
integercout1,cout2,cout3;//cout1,cout2,cout3均为计数变量
always@(posedgeclk)
begin
cout1<=(cout1==32'd50000000)?
32'd0:
(cout1+32'd1);
clkout1<=(cout1==32'd5*******)?
1'd1:
1'd0;//50000000分频
cout3<=(cout3==32'd25000000)?
32'd0:
(cout3+32'd1);
clkout3<=(cout3==32'd25000000)?
1'd1:
1'd0;//25000000分频
cout2<=(cout2==32'd50000)?
32'd0:
(cout2+32'd1);
clkout2<=(cout2==32'd50000)?
1'd1:
1'd0;//50000分频
end
endmodule
//仿真时,改clkout1为12分频,clkout2为2频,clkout1为6分频
//下载时,由于clk为50MHz,改clkout1为50000000分频,输出1赫兹,clkout2为50000分频,输出1千赫兹,clkout3为5000000分频,输出2赫兹
分频器仿真源文件:
图5分频器仿真源文件
仿真输出文件:
图6频器仿真输出文件
2.控制器设计方案
控制器输入端口t1用于控制灯闪烁,输出端口led接小灯,ss1、ss2、reset分别储存s1、s2、s8的值并将其传给计数器
设计思路:
ss1、ss2、reset储存s1、s2、s8的值传给计数器执行其他功能。
这一部分由1赫兹进行驱动。
led是灯,t1为1时led闪烁。
这一部分由2赫兹进行驱动。
源程序:
modulekongzhi(clkout1,clkout3,s1,s2,s8,t1,led,ss1,ss2,reset);
inputclkout1,clkout3,s1,s2,s8,t1;//clkout1输入1赫兹,clkout3输入2赫兹,t1控制闪烁
outputled,ss1,ss2,reset;//led是灯,ss1、ss2、reset储存s1、s2、s8的值传给计数器
regled,ss1,ss2,reset;
always@(posedgeclkout1)
begin
reset=s8;
ss1=s1;
ss2=s2;
end
always@(posedgeclkout3)
begin
if(t1==1)led=~led;elseif(t1==0)led=0;//当t1=1时闪烁,否则不闪
end
endmodule
控制器仿真源文件:
图7控制器仿真源文件
说明:
clkout1的周期是clkout3的一倍。
s1、s2、s3均有0和1出现,t1之后为1
控制器仿真输出文件:
图8控制器仿真输出文件
说明:
从图中可以看出s1、s2、s3的值分别赋给了ss1、ss2、reset。
Led在t1为1时闪烁。
3.计时器设计方案
计数器输出端口shis表示小时的十位,shig表示小时的各位,mins表示分钟的十位,ming表示分钟的个位。
secs表示秒的十位,secg表示秒的个位。
设计思路:
判断ss1是否为0,若为0,小时加1或归0。
同时判断ss2是否为0,若为0,则分钟加1或归0并进1。
同时判断reset是否为0,若为0,全部归0。
若不为0则嵌套if语句判断sec、min、shi的值并进行加1或归0操作。
当59分54秒到59秒时让t1为1,灯闪烁。
其他时候t1为0,灯灭。
modulejishu(clkout1,ss1,ss2,reset,shis,shig,mins,ming,secs,secg,t1);
inputclkout1,ss1,ss2,reset;//clkout1为1赫兹,ss1、ss2、reset是储存的s1、s2、s8的值
output[1:
0]shis;//小时的十位
output[3:
0]shig;//小时的个位
output[2:
0]mins;//分钟的十位
output[3:
0]ming;//分钟的个位
output[2:
0]secs;//秒的十位
output[3:
0]secg;//秒的个位
outputt1;//返回闪烁的控制变量
regt1;
reg[5:
0]shi;//小时
reg[5:
0]min,sec;//分钟,秒
always@(posedgeclkout1)
begin
if(ss1==0&&shi<24)shi=shi+1;//s1为0和shi小于23时,小时加1
if(ss1==0&&shi==24)shi=0;//s1为0和shi等于24时,小时变0
if(ss2==0&&min<60)min=min+1;//s2为0和min小于60时,分钟加1
if(ss2==0&&min==60)beginmin=0;t1=0;end//s2为0和min等于60时,分钟变0if(reset==0)beginshi=0;min=0;sec=0;t1=0;end//执行复位功能
elseif(sec==59)beginsec=sec+5;//sec为59是sec归0,判断min的值是否为59
if(min==59)begin//若min=59,min归0并判断shi>22
min=min+5;t1=0;
if(shi>22)shi=0;//若等于22,归0
elseshi=shi+1;//若不等,shi加1
end
elsebeginmin=min+1;end//若min不等于59,min加1
end
elsebeginsec=sec+1;t1=0;end//若sec不为59,sec加1,令t1为0
if(min==59&&sec>54&&sec<60)t1=1;若整点前5秒,令t1为1,灯闪烁
end
assignshis=shi/10;//将小时的十位赋给shis
assignshig=shi%10;//将小时的个位赋给shig
assignmins=min/10;//将分钟的十位赋给mins
assignming=min%10;//将分钟的个位赋给ming
assignsecs=sec/10;//将秒的十位赋给secs
assignsecg=sec%10;//将秒的个位赋给secg
endmodule
计时器仿真源文件:
图9计时器仿真源文件
说明:
reset先为0,令其复位。
运行一段时间之后先让ss1加1,再让ss2加1,clkout1始终有输入。
整体仿真图:
图10整体仿真图
说明:
从图中可以看出灯闪烁变量t1的变化,也可以看出小时shi加1的变化,其他的在下面有放大图。
秒进位:
图11秒进位仿真截图
说明:
从图中可以看出秒十位secs为5,个位secg为9时,秒归0,分钟个位ming加1。
分钟进位:
图12分钟进位仿真截图
说明:
从图中可以看出,分钟59时(ming为9,mins为5时),分钟归0,小时加1
S1起作用
图13s1起作用仿真截图
说明:
从图中可以看出ss1为0时,每过一个上升沿,小时加1(shig加1或进位)
S2起作用:
图14s2起作用仿真截图
说明:
从图中可以看出ss2为0后,分钟开始加1或进位。
(ming加1或进位)
S8起作用:
图15s8起作用仿真截图
说明:
s8为0时,reset为0,其余均为0(除输入外)。
4.显示器设计方案:
(包括设计思路及其工作原理)
设计思路:
1千赫兹输入,用wei来确定数码管的位置,分别给不同的数码管赋不同的值。
使数码管从左到右依次显示小时—分钟—秒。
modulexianshi(clkout2,shis,shig,mins,ming,secs,secg,leds1,wei);
inputclkout2;//clkout2为1千赫兹
input[1:
0]shis;//小时的十位
input[3:
0]shig;//小时的个位
input[2:
0]mins;//分钟的十位
input[3:
0]ming;//分钟的个位
input[2:
0]secs;//秒的十位
input[3:
0]secg;//秒的个位
output[6:
0]leds1;//leds1为数码管
reg[6:
0]leds1;
output[2:
0]wei;//wei表示数码管的位置
reg[2:
0]wei;
reg[3:
0]a;//中间变量
always@(posedgeclkout2)
begin
if(wei==6)begina=shis;//当wei为6时,加1,第7号数码管显示小时的十位
case(a)
4'd0:
leds1=7'b0111111;
4'd1:
leds1=7'b0000110;
4'd2:
leds1=7'b1011011;
default:
leds1=7'b1111110;
endcase
wei=wei+1;
end
elseif(wei==5)begina=shig;//当wei为5时,加1,第6号数码管显示小时的个位
case(a)
4'd0:
leds1=7'b0111111;
4'd1:
leds1=7'b0000110;
4'd2:
leds1=7'b1011011;
4'd3:
leds1=7'b1001111;
4'd4:
leds1=7'b1100110;
4'd5:
leds1=7'b1101101;
4'd6:
leds1=7'b1111101;
4'd7:
leds1=7'b0000111;
4'd8:
leds1=7'b1111111;
4'd9:
leds1=7'b1101111;
default:
leds1=7'b1111110;
endcase
wei=wei+1;
end
elseif(wei==4)beginleds1=7'b1000000;wei=wei+1;
//当wei为4时,加1,第5号数码管显示横杠
end
elseif(wei==3)begina=mins;//当wei为3时,加1,第4号数码管显示分钟的十位
case(a)
4'd0:
leds1=7'b0111111;
4'd1:
leds1=7'b0000110;
4'd2:
leds1=7'b1011011;
4'd3:
leds1=7'b1001111;
4'd4:
leds1=7'b1100110;
4'd5:
leds1=7'b1101101;
default:
leds1=7'b1111110;
endcase
wei=wei+1;
end
elseif(wei==2)begina=ming;//当wei为2时,加1,第3号数码管显示分钟的个位
case(a)
4'd0:
leds1=7'b0111111;
4'd1:
leds1=7'b0000110;
4'd2:
leds1=7'b1011011;
4'd3:
leds1=7'b1001111;
4'd4:
leds1=7'b1100110;
4'd5:
leds1=7'b1101101;
4'd6:
leds1=7'b1111101;
4'd7:
leds1=7'b0000111;
4'd8:
leds1=7'b1111111;
4'd9:
leds1=7'b1101111;
default:
leds1=7'b1111110;
endcase
wei=wei+1;
end
elseif(wei==1)beginleds1=7'b1000000;wei=wei+1;
//当wei为1时,加1,第2号数码管显示横杠
end
elseif(wei==0)begina=secs;//当wei为0时,加1,第1号数码管显示秒的十位
case(a)
4'd0:
leds1=7'b0111111;
4'd1:
leds1=7'b0000110;
4'd2:
leds1=7'b1011011;
4'd3:
leds1=7'b1001111;
4'd4:
leds1=7'b1100110;
4'd5:
leds1=7'b1101101;
default:
leds1=7'b1111110;
endcase
wei=wei+1;
end
elseif(wei==7)begina=secg;//当wei为7时,加1,第0号数码管显示秒的个位
case(a)
4'd0:
leds1=7'b0111111;
4'd1:
leds1=7'b0000110;
4'd2:
leds1=7'b1011011;
4'd3:
leds1=7'b1001111;
4'd4:
leds1=7'b1100110;
4'd5:
leds1=7'b1101101;
4'd6:
leds1=7'b1111101;
4'd7:
leds1=7'b0000111;
4'd8:
leds1=7'b1111111;
4'd9:
leds1=7'b1101111;
default:
leds1=7'b1111110;
endcase
wei=wei+1;
endend
endmodule
数码管仿真源文件:
图16数码管仿真源文件
说明:
只输入了一组值13时43分12秒
仿真输出文件:
图17数码管仿真文件
说明:
从图中可以看出八个数码管对应的值。
wei=000时0号数码管输出1011011对应秒的个位为2;
wei=001时1号数码管输出0000110对应秒的十位为1;
wei=010时2号数码管输出1000000对应输出“—”;
wei=011时3号数码管输出1001111对应输出分钟的个位为3;
wei=100时4号数码管输出1100110对应输出分钟的十位为4;
wei=101时5号数码管输出1000000对应输出“—”;
wei=110时6号数码管输出1001111对应输出小时的个位为3;
wei=111时7号数码管输出0000110对应输出小时的十位为1;
即输出为“13—43—12”
三、分析与讨论:
(一)课程设计综述:
本次课程设计我总共进行了两天,感觉整个程序就是一个精密的机器,由很多简单的部件构成,而我的任务就是仔细的设计部件组成机器,否则就很容易出错。
第一天上午我编写了分频程序和控制器程序,这两个程序是最简单的。
分频程序一个是输出1赫兹,一个是输出1千赫兹,另一个是输出2赫兹。
控制器三个变量就是用来存储三个按键的值,还有就是控制闪烁。
这一部分没出现什么问题,就是出现了一些警告。
警告1.VerilogHDLassignmentwarningat
truncatedwithsize
原因:
在HDL设计中对目标的位数进行了设定,如:
reg[4:
0]a;而默认为32位,要将位数裁定到合适的大小。
解决方案:
如果结果正确,无须加以修正,如果不想看到这个警告,可以改变设定的位数。
2.Following9pinshavenothing,GND,orVCCdrivingdatainport--changestothisconnectivitymaychangefittingresults
原因:
第9脚,空或接地或接上了电源。
解决方案:
有时候定义了输出端口,但输出端直接赋‘0’,便会被接地,赋‘1’接电源。
如果你的设计中这些端口就是这样用的,那便可以不理会这些warning
3.Foundpinsasundefinedclocksand/ormemoryenables
原因:
是你作为时钟的PIN没有约束信息.可以对相应的PIN做一下设定就行了。
主要是指你的某些管脚在电路当中起到了时钟管脚的作用,比如flip-flop的clk管脚,而此管脚没有时钟约束,因此QuartusII把“clk”作为未定义的时钟。
解决方案:
clk应该是时钟,如果不是,最好改一个名字。
4.Designcontains
原因:
输入引脚没有驱动逻辑(驱动其他引脚),所有的输入引脚需要有输入逻辑。
解决方案:
如果这种情况是故意的,无须理会,如果非故意,输入逻辑驱动。
最好是输入时钟作为驱动逻辑。
5.Can'tanalyzefile--fileE:
//quartusii/*/*.vismissing
原因:
试图编译一个不存在的文件,该文件可能被改名或者删除了。
解决方案:
不管他,没什么影响。
6.Warning(10268):
VerilogHDLinformationatlcd7106.v(63):
AlwaysConstructcontainsbothblockingandnon-blockingassignments
原因:
一个always模块中同时有阻塞和非阻塞的赋值
解决方案:
最好是全部用阻塞赋值,或者全是非阻塞赋值。
当混合使用时,对同一变量必须全部用同一种赋值方式。
第一天下午编写计数器。
计数器是最难编的一个程序,因为计数器才是真正起作用的部分。
计数器的逻辑驱动是1赫兹。
它的工作原理应为:
1.每过一秒,如果秒数小于59,秒数加1。
如果是59秒,就让秒数归0并判断分钟。
2.此时,如果分钟数小于59,分钟数加1。
如果分钟是59,就把分钟归0并判断小时。
3.此时,如果小时小于23,小时进1。
如果小时是23,就让小时归0。
4.如果s1按下,小时加1。
如果s2按下,分钟加1。
如果s8按下,全部归0。
5.如果是59分,在秒数为55到59之间让灯以1Hz闪烁。
前三步的实现是采用嵌套if语句,最后一个功能是并列if语句。
需要注意的是按按键时小时加1不能超过23,分钟加1不能超过59,复位时秒数不能走。
这样,复位优先级要高于走秒的优先级,判断按键s1s2按下时加1的方式,还要判断其他条件。
第三部分编写好之后,就还差一个显示模块。
这时候就可以进行仿真了,我把分频器、控制器、计数器在顶层文件连接好进行仿真。
这样,程序的输出变为灯led、小时十位、小时个位、分钟十位、分钟个位、秒数十位、秒数个位,看波形就可以看到小时、分钟、秒数、小灯的运行过程。
经过对波形的分析我发现两个问题,第一是秒数、分钟和小时会越过他们的界限。
原因是我给它们赋了6位的值,如果不加限制,它们在运行时都可以达到63。
增加了限制条件后一切正常。
第二是灯闪烁时间太早,我把时间调整后,波形正常。
下面就是显示模块。
显示模块采用扫描方式给数码管输出,因此是1千赫兹驱动。
位置控制的变量从0开始每运行1次加1到7,再加1到0,数码管输出相应的值。
这一部分也还可以。
最后是合成整个程序,编译、
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课程设计 多功能 数字 电路设计