数字钟汽车尾灯.docx

上传人:b****1 文档编号:3202154 上传时间:2023-05-05 格式:DOCX 页数:32 大小:422.64KB
下载 相关 举报
数字钟汽车尾灯.docx_第1页
第1页 / 共32页
数字钟汽车尾灯.docx_第2页
第2页 / 共32页
数字钟汽车尾灯.docx_第3页
第3页 / 共32页
数字钟汽车尾灯.docx_第4页
第4页 / 共32页
数字钟汽车尾灯.docx_第5页
第5页 / 共32页
数字钟汽车尾灯.docx_第6页
第6页 / 共32页
数字钟汽车尾灯.docx_第7页
第7页 / 共32页
数字钟汽车尾灯.docx_第8页
第8页 / 共32页
数字钟汽车尾灯.docx_第9页
第9页 / 共32页
数字钟汽车尾灯.docx_第10页
第10页 / 共32页
数字钟汽车尾灯.docx_第11页
第11页 / 共32页
数字钟汽车尾灯.docx_第12页
第12页 / 共32页
数字钟汽车尾灯.docx_第13页
第13页 / 共32页
数字钟汽车尾灯.docx_第14页
第14页 / 共32页
数字钟汽车尾灯.docx_第15页
第15页 / 共32页
数字钟汽车尾灯.docx_第16页
第16页 / 共32页
数字钟汽车尾灯.docx_第17页
第17页 / 共32页
数字钟汽车尾灯.docx_第18页
第18页 / 共32页
数字钟汽车尾灯.docx_第19页
第19页 / 共32页
数字钟汽车尾灯.docx_第20页
第20页 / 共32页
亲,该文档总共32页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

数字钟汽车尾灯.docx

《数字钟汽车尾灯.docx》由会员分享,可在线阅读,更多相关《数字钟汽车尾灯.docx(32页珍藏版)》请在冰点文库上搜索。

数字钟汽车尾灯.docx

数字钟汽车尾灯

 

电子线路设计报告

(数字钟及汽车尾灯)

题目:

数字钟与汽车尾灯

院系:

电子与信息工程系

班级:

姓名:

学号:

试验号:

指导老师:

2009.6.24

 

【实验目的】①掌握可编程逻辑器件的应用开发技术——设计输入、编译、仿真和器件编程;

②熟悉一种EDA软件——MAX+PlusⅡ的使用;

③掌握Verilog设计方法;

④掌握分模块分层次的设计方法;

⑤用Verilog完成一个多功能数字钟和汽车尾灯控制的设计。

【实验原理】采用分模块分层次的设计方法,用Verilog语言由顶层模块逐层向下设计,顶层模块调用底层模块来完成相应的功能。

完成电路的编译与适配后进行电路的仿真实验,在仿真结果满足实验要求的情况下进行电路的配置,即将生成的*.sof文件下载到开发板上,验证实验结果。

【实验开发环境】

①开发软件:

MAX+PlusⅡ,其开发流程为设计输入、编译、仿真、和编程与验证。

②开发语言:

Verilog,一种专门为ASIC设计而开发的,通常用于寄存器传输级(RTL)门电路级的描述,是一种相对低级的描述语言。

③实验板:

EDAPro2K实验开发系统,是一种基于CPLD可编程逻辑器件的开发板。

【实验模块设计】

一、多功能数字钟系统组成

图1多功能数字钟系统组成框图

由上面的设计框图容易看出,数字钟部分的实验由主体电路和扩展电路组成,其中主体电路主要是完成小时、分钟、秒的显示,通过分频器得到秒脉冲,通过秒计数器完成60进制的计数,然后用译码电路完成秒在数码管上的显示,分钟和小时显示的实现与秒类似,主要是脉冲不同而已,其中小时又分为12进制和24进制;扩展电路是用来完成计时之外的一些附加功能,比如定时控制、仿电台报时、自动报整点时数、触摸报整点时数等。

其详细设计将在下面逐一提到。

二、各模块的设计及仿真

1数字钟主体电路顶层模块

图2数字钟主体电路的层次结构图

数字钟主体电路顶层模块由三部分组成,小时计数器、分计数器和秒计数器,分计数器和秒计数器是60进制的,用8位BCD码表示,高4位为6进制,0、1、2、3、4、5、0、1…这样显示;低4位为10进制,0、1、2、3、4、5、6、7、8、9、0、1…这样显示。

小时计数器用12进制和24进制同时计时,12进制为01、02、03、04、05、06、07、08、09、10、12、01、02…这样显示;24进制为00、01、02、03、04、05、06、07、08、09、10、12、13、14、15、16、17、18、19、20、21、22、23、00、01…这样显示。

②6进制计数器的设计及仿真

在没计数到5之前,每来一个CP脉冲计数就加1,到5时变为0.

Ⅰ,Verilog代码:

//counter6.v6进制计数器

modulecounter6(Q,nCR,EN,CP);

inputCP,nCR,EN;//时钟CP、清零nCR、使能EN

output[3:

0]Q;

reg[3:

0]Q;

always@(posedgeCPornegedgenCR)

begin

if(~nCR)Q<=4'b0000;//异步清零

elseif(~EN)Q<=Q;

elseif(Q==4'b0101)Q<=4'b0000;//计数到5时赋值为0

elseQ<=Q+1'b1;//未计数到5时在时钟来时加1

end

endmodule

Ⅱ,仿真结果:

图36进制计数器仿真截图

由仿真截图可以看出在CP的上升沿来临时输出Q的值加1,计数到5时变为

0,继续计数,完成了6进制计数器的功能。

仿真结果与实验的预期结果吻合,

说明此模块是成功的。

Ⅲ,模块符号图:

③10进制计数器的设计及仿真

Ⅰ,Verilog代码:

//counter10.v10进制计数器

modulecounter10(Q,nCR,EN,CP);

inputCP,nCR,EN;//时钟CP、清零nCR、使能EN

output[3:

0]Q;

reg[3:

0]Q;

always@(posedgeCPornegedgenCR)

begin

if(~nCR)Q<=4'b0000;//异步清零

elseif(~EN)Q<=Q;

elseif(Q==4'b1001)Q<=4'b0000;//计数到9时赋值为0

elseQ<=Q+1'b1;//未计数到9时在时钟来时加1

end

endmodule

Ⅱ,仿真结果:

图410进制计数器仿真截图

由仿真截图可以看出在CP的上升沿来临时输出Q的值加1,计数到9时变为

0,继续计数,完成了10进制计数器的功能。

仿真结果与实验的预期结果吻合,

说明此模块是成功的。

Ⅲ,模块符号图:

④60进制计数器的设计及仿真

模块结构图如下

图560进制计数器的层次结构

Ⅰ,Verilog代码:

//counter60.v60进制计数器

modulecounter60(Cnt,nCR,EN,CP);

inputnCR,EN,CP;//时钟CP、清零nCR、使能EN

output[7:

0]Cnt;

wire[7:

0]Cnt;

wireENP;

counter10UC0(Cnt[3:

0],nCR,EN,CP);//低4位调用10进制计数器

counter6UC1(Cnt[7:

4],nCR,ENP,CP);//高4位调用6进制计数器

assignENP=(Cnt[3:

0]==4'h9);//低位计到9时向高位发送使能信号

endmodule

Ⅱ,仿真结果:

图660进制计数器仿真截图_1

图760进制计数器仿真截图_2

由仿真截图可以看出在CP的上升沿来临时输出Q的值加1,计数到59时为

0,继续计数,完成了60进制计数器的功能。

仿真结果与实验的预期结果吻合,

说明此模块是成功的。

Ⅲ,模块符号图:

⑤12进制计数器的设计及仿真

Ⅰ,Verilog代码:

//counter12.v12进制计数器

modulecounter12(CntH,CntL,nCR,EN,CP);

inputCP,nCR,EN;//时钟CP、清零nCR、使能EN

output[3:

0]CntH,CntL;//高4位和低4为输出

reg[3:

0]CntH,CntL;

always@(posedgeCPornegedgenCR)

begin

if(~nCR){CntH,CntL}<=8'h00;//异步清零

elseif(~EN){CntH,CntL}<={CntH,CntL};

elseif((CntH>1)||((CntH==1)&&(CntL>=2)))

{CntH,CntL}<=8'h01;//非法计数情况均置数为8'h01

elseif((CntH==0)&&(CntL==9))

{CntH,CntL}<=8'h10;//到9时变为10

elseif((CntH==1)&&CntL<2)//11与12的计数

begin

CntH<=CntH;

CntL<=CntL+1'b1;

end

else

begin

CntH<=CntH;//其它情况低位加1计数

CntL<=CntL+1'b1;

end

end

endmodule

Ⅱ,仿真结果:

图812进制计数器仿真截图

由仿真截图可以看出在CP的上升沿来临时输出Q的值加1,计数到12时为

01,继续计数,完成了12进制计数器的功能。

仿真结果与实验的预期结果吻合,

说明此模块是成功的。

Ⅲ,模块符号图:

⑥24进制计数器的设计及仿真

Ⅰ,Verilog代码:

//counter24.v24进制计数器

modulecounter24(CntH,CntL,nCR,EN,CP);

inputCP,nCR,EN;//时钟CP、清零nCR、使能EN

output[3:

0]CntH,CntL;//高4位和低4为输出

reg[3:

0]CntH,CntL;

always@(posedgeCPornegedgenCR)

begin

if(~nCR){CntH,CntL}<=8'h00;//异步清零

elseif(~EN){CntH,CntL}<={CntH,CntL};

elseif((CntH>2)||(CntL>9)||((CntH==2)&&(CntL>=3)))

{CntH,CntL}<=8'h00;//非法计数情况均置数为00

elseif((CntH==2)&&CntL<3)//20,21,22,23的计数

begin

CntH<=CntH;

CntL<=CntL+1'b1;

end

elseif(CntL==9)//低位为9时,高位加1,低位置4'b0000

begin

CntH<=CntH+1'b1;

CntL<=4'b0000;

end

else

begin

CntH<=CntH;//其它情况低位正常计数

CntL<=CntL+1'b1;

end

end

endmodule

Ⅱ,仿真结果:

图924进制计数器仿真截图

由仿真截图可以看出在CP的上升沿来临时输出Q的值加1,计数到23时为

00,继续计数,完成了24进制计数器的功能。

仿真结果与实验的预期结果吻合,

说明此模块是成功的。

Ⅲ,模块符号图:

⑦分频模块的设计与仿真

Ⅰ,Verilog代码:

//Divided_Frequency.v分频模块产成1Hz与512Hz的脉冲

moduleDivided_Frequency(_1HzOut,_512HzOut,nCR,_1024HzIN);

input_1024HzIN,nCR;

output_1HzOut,_512HzOut;//输出1Hz与512Hz

supply1Vdd;

wire[11:

0]Q;

wireEN1,EN2;

counter10DU0(Q[3:

0],nCR,Vdd,_1024HzIN);

counter10DU1(Q[7:

4],nCR,EN1,_1024HzIN);

counter10DU2(Q[11:

8],nCR,EN2,_1024HzIN);//3次调用10进制

assignEN1=(Q[3:

0]==4'h9);

assignEN2=(Q[7:

4]==4'h9)&&(Q[3:

0]==4'h9);

assign_1HzOut=Q[11];//最高位为1.024Hz

assign_512HzOut=Q[0];//最低位为512Hz

endmodule

Ⅱ,仿真结果:

图10分频模块1Hz输出(最下的)仿真截图

图11分频模块512Hz输出(倒数第二的)仿真截图

由上图可以看出512Hz的输出脉冲符合要求,周期是1024Hz的两倍,1Hz的脉冲输出由于是1024Hz的1000倍,在仿真图上无法准确验证,只能猜想大概是对的,者还需将程序下载到开发板上来验证,而且由于我在开始的设计师想调用更多的模块,所以1Hz脉冲的产生有些误差。

其它的从仿真来看与设计相吻合。

Ⅲ,模块符号图:

⑧2选1选择器的设计与仿真

Ⅰ,Verilog代码:

//_2to1MUX.v2选1选择器

module_2to1MUX(OUT,SEL,X,Y);

input[7:

0]X,Y;//两输入变量

inputSEL;

output[7:

0]OUT;

assignOUT=SEL?

X:

Y;

endmodule

Ⅱ,仿真结果:

图122选1选择器仿真截图

由上图可以清晰地看出,当SEL为高电平时输出OUT为X的值,当SEL为低电平时输出OUT为Y的值,仿真结果与设计预期结果相吻合,说明此模块的设计是成功的。

Ⅲ,模块符号图:

⑨4比特比较器的设计与仿真

Ⅰ,Verilog代码:

//_4bitcomparator.v4比特比较器

module_4bitcomparator(EQU,AMORPM,AMORPMCLOCK,A,B);

input[3:

0]A,B;

inputAMORPM,AMORPMCLOCK;//显示的上下午与闹钟设置的上下午

outputEQU;

assignEQU=((A==B)&&(AMORPM==AMORPMCLOCK));

endmodule

Ⅱ,仿真结果:

图134比特比较器仿真截图

有上面的仿真图可以看出当A=B且AMORPM=AMORPMCLOCK是,输出EQU会有一个高电平输出,当两者有一个不满足条件时,EQU为低电平时。

此模块用于下面的闹钟模块,当设置的时间与当前时间相等时,EQU会有一个高电平输出。

仿真结果与设计相吻合,说明此模块是成功的。

Ⅲ,模块符号图:

⑩仿电台报时模块的设计与仿真

Ⅰ,Verilog代码:

//Radio.v仿电台报时

moduleRadio(ALARM_Radio,Minute,Second,_1024HzIN,_512Hz);

input_1024HzIN,_512Hz;

input[7:

0]Minute,Second;

outputALARM_Radio;

regALARM_Radio;

always@(MinuteorSecond)

if(Minute==8'h59)

case(Second)

8'h51,

8'h53,

8'h55,

8'h57:

ALARM_Radio=_512Hz;//在每个小时的59分51,53,55,57秒的//时候发出4声512Hz的低/音

8'h59:

ALARM_Radio=_1024HzIN;//在每个小时的59分59秒时发1024Hz

//的一声高音

default:

ALARM_Radio=1'b0;//其它情况在此模块下不发出声音

endcase

elseALARM_Radio=1'b0;//其它情况在此模块下不发出声音

endmodule

Ⅱ,仿真结果:

图14仿电台报时仿真截图

有上面的仿真可以清楚地看出,在某小时的59分51,53,55,57秒的时候,ALARM_Radio发出了四声512Hz的低音,在59分59秒的时候发出了一声1024Hz的高音,仿真结果与设计预期相符,说明此模块是成功的。

Ⅲ,模块符号图:

闹钟模块的设计与仿真

闹钟设模块设计框图如下:

图15闹钟设定模块框图

由以上框图很容易用Verilog语言实现闹钟功能。

Ⅰ,Verilog代码:

//Bell.v

moduleBell(ALARM_Clock,Set_Hr,Set_Min,Hour,Minute,Second,SetHrkey,

SetMinkey,AMORPM,AMORPMCLOCK,_1024HzIN,_512Hz,_1Hz,CtrlBell);

outputALARM_Clock;

output[7:

0]Set_Hr,Set_Min;//设定的闹钟的小时与分钟

wireALARM_Clock;

wire[7:

0]Set_Hr,Set_Min;

input_1024HzIN,_512Hz,_1Hz;

inputSetHrkey,SetMinkey;//设定闹钟的小时与分钟的按键

inputCtrlBell;//闹铃控制,CtrlBel=1时,闹钟在设定的时刻发出闹铃

inputAMORPM;//主时钟的上下午标志

wireAMORPM;

inputAMORPMCLOCK;//闹钟的上下午标志

wireAMORPMCLOCK;

input[7:

0]Hour,Minute,Second;//主时钟的小时,分钟,秒

supply1Vdd;

wireHrH_EQU,HrL_EQU,MinH_EQU,MinL_EQU;

wireTime_EQU;

counter60SU1(Set_Min,Vdd,SetMinkey,_1Hz);

counter12SU2(Set_Hr[7:

4],Set_Hr[3:

0],Vdd,SetHrkey,_1Hz);

//闹钟小时与分钟的设定

_4bitcomparatorSU4(HrH_EQU,AMORPM,AMORPMCLOCK,Set_Hr[7:

4],Hour[7:

4]);

//比较主时钟与闹钟的小时高4位是否相等

_4bitcomparatorSU5(HrL_EQU,AMORPM,AMORPMCLOCK,Set_Hr[3:

0],Hour[3:

0]);

//比较主时钟与闹钟的小时低4位是否相等

_4bitcomparatorSU6(MinH_EQU,AMORPM,AMORPMCLOCK,Set_Min[7:

4],Minute[7:

4]);

//比较主时钟与闹钟的分钟高4位是否相等

_4bitcomparatorSU7(MinL_EQU,AMORPM,AMORPMCLOCK,Set_Min[3:

0],Minute[3:

0]);

//比较主时钟与闹钟的分钟低4位是否相等

assignTime_EQU=(HrH_EQU&&HrL_EQU&&MinH_EQU&&MinL_EQU);

//时间相等

assignALARM_Clock=CtrlBell?

(Time_EQU&&(((Second[0]==1'b1)&&_512Hz)||((

Second[0]==1'b0)&&_1024HzIN))):

1'b0;

//若两时间相等则发出高低音交错的闹铃1024HzIN和512Hz

Endmodule

Ⅱ,仿真结果:

图16闹钟模块仿真截图

由以上的仿真截图可以清晰地看出当主时钟与闹钟设定的时间相等时,ALARM_Clock会输出1024HzIN和512Hz高低交错的脉冲,且会持续1分钟,这与设计预期相符,说明此模块是成功的。

Ⅲ,模块符号图:

自动整点报时模块的设计与仿真

此模块的设计思想为利用case语句将所有小时都包含进去,并且在相应小时的case通过赋值语句将相应应该响的声数定义好,从而实现了几点报几时的功能,考虑到要与整点报时的声音区分开来故选择了在偶数秒响。

具体如下:

Ⅰ,Verilog代码:

//Complete_auto.v

moduleComplete_auto(ALARM_Complete_auto,Hour,Minute,Second,_512Hz);

input[7:

0]Hour,Minute,Second;

input_512Hz;

outputALARM_Complete_auto;

regALARM_Complete_auto;

always@(MinuteorSecond)

if(Minute==8'h00)

case(Hour)

8'h01:

ALARM_Complete_auto=(Second==8'h02)&&_512Hz;

//1点是响1下

8'h02:

ALARM_Complete_auto=(Second==8'h02||Second==8'h04)&&_512Hz;

//2点是响2下

8'h03:

ALARM_Complete_auto=(Second==8'h02||Second==8'h04||Second==8'h06)&&_512Hz;

//3点是响3下

8'h04:

ALARM_Complete_auto=(Second==8'h02||Second==8'h04||Second==8'h06||Second==8'h08)&&_512Hz;

//4点是响4下

8'h05:

ALARM_Complete_auto=(Second==8'h02||Second==8'h04||Second==8'h06||Second==8'h08||Second==8'h10)&&_512Hz;

//5点是响5下

8'h06:

ALARM_Complete_auto=(Second==8'h02||Second==8'h04||Second==8'h06||Second==8'h08||Second==8'h10||Second==8'h12)&&_512Hz;

//6点是响6下

8'h07:

ALARM_Complete_auto=(Second==8'h02||Second==8'h04||Second==8'h06||Second==8'h08||Second==8'h10||Second==8'h12||Second==8'h14)&&_512Hz;

//7点是响7下

8'h08:

ALARM_Complete_auto=(Second==8'h02||Second==8'h04||Second==8'h06||Second==8'h08||Second==8'h10||Second==8'h12||Second==8'h14||Second==8'h16)&&_512Hz;

//8点是8下

8'h09:

ALARM_Complete_auto=(Second==8'h02||Second==8'h04||Second==8'h06||Second==8'h08||Second==8'h10||Second==8'h12||Second==8'h14||Second==8'h16||Second==8'h18)&&_512Hz;

//9点是响9下

8'h10:

ALARM_Complete_auto=(Second==8'h02||Second==8'h04||Second==8'h06||Second==8'h08||Second==8'h10||Second==8'h12||Second==8'h14||Second==8'h16||Second==8'h18||Second==8'h20)&&_512Hz;

//10点是响10下

8'h11:

ALARM_Complete_auto=(Second==8'h02||Second==8'h04||Second==8'h06||Second==8'h08||Second==8'h10||Second==8'h12||Second==8'h14||Second==8'h16||Second==8'h18||Second==8'h20||Second==8'h22)&&_512Hz;

//11点是响11下

8'h12:

ALARM_Complete_auto=(Second==8'h02||Second==8'h04||Second==8'h06||Second==8'h08||Second==8'h10||Second==8'h12||Second==8'h14||Second==8'h16||Second==8

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

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2