08课程设计多功能数字钟 verilog语言暑期实习石油大学.docx

上传人:b****8 文档编号:30559054 上传时间:2023-08-16 格式:DOCX 页数:29 大小:290.16KB
下载 相关 举报
08课程设计多功能数字钟 verilog语言暑期实习石油大学.docx_第1页
第1页 / 共29页
08课程设计多功能数字钟 verilog语言暑期实习石油大学.docx_第2页
第2页 / 共29页
08课程设计多功能数字钟 verilog语言暑期实习石油大学.docx_第3页
第3页 / 共29页
08课程设计多功能数字钟 verilog语言暑期实习石油大学.docx_第4页
第4页 / 共29页
08课程设计多功能数字钟 verilog语言暑期实习石油大学.docx_第5页
第5页 / 共29页
点击查看更多>>
下载资源
资源描述

08课程设计多功能数字钟 verilog语言暑期实习石油大学.docx

《08课程设计多功能数字钟 verilog语言暑期实习石油大学.docx》由会员分享,可在线阅读,更多相关《08课程设计多功能数字钟 verilog语言暑期实习石油大学.docx(29页珍藏版)》请在冰豆网上搜索。

08课程设计多功能数字钟 verilog语言暑期实习石油大学.docx

08课程设计多功能数字钟verilog语言暑期实习石油大学

 

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'd2*******)?

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:

truncatedwithsizetomatchsizeoftarget(

原因:

在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.Designcontainsinputpin(s)thatdonotdrivelogic

原因:

输入引脚没有驱动逻辑(驱动其他引脚),所有的输入引脚需要有输入逻辑。

解决方案:

如果这种情况是故意的,无须理会,如果非故意,输入逻辑驱动。

最好是输入时钟作为驱动逻辑。

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,数码管输出相应的值。

这一部分也还可以

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 法学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1