多功能数字钟设计Verilog语言编写.docx
- 文档编号:5875925
- 上传时间:2023-01-01
- 格式:DOCX
- 页数:35
- 大小:811.60KB
多功能数字钟设计Verilog语言编写.docx
《多功能数字钟设计Verilog语言编写.docx》由会员分享,可在线阅读,更多相关《多功能数字钟设计Verilog语言编写.docx(35页珍藏版)》请在冰豆网上搜索。
多功能数字钟设计Verilog语言编写
多功能数字钟设计
院系:
电光学院
班级:
***
学号:
***
姓名:
***
指导老师:
***
时间:
2010.4.20.
摘要:
利用QuartusII软件设计一个数字钟,利用模块化的程序设计思想,核心模块均采用Verilog语言编写(译码显示模块采用原理图设计),软件仿真调试编译成功后,再下载到SmartSOPC实验系统中。
经过硬件测试,查找软件设计缺陷,并进一步完善软件,最终设计得到较为满意的多功能数字钟。
关键词:
QuartusII;多功能数字钟;模块化;Verilog;可编程;
Abstract:
UsingtheQuartusIIsoftwaredesignadigitalbellwiththeblockingmethod.ThedesigntakestheorydrawinginsteadofVeriloglanguage.Afteremluatinganddebugingsuccessfully,translateandeditthecode.Then,downloadtheresulttotheprogrammableSmartSOPCsystemandtestitinhardware.Realizingthesoulofdesigninghardwarebysoftware.
Keywords:
QuartusII;digitalbell;blockingmethod;VHDL;programmable;hardware
设计内容简介………………………………………………………………………3
设计要求说明………………………………………………………………………3
方案论证(整体电路设计原理)………………………………………3
各子模块设计理……………………………………………………………………5
分频模块:
………………………………………………………………………………5
计数模块:
………………………………………………………………………………7
--校准模块程序实现:
………………………………………………………………8
--秒计数模块程序实现:
……………………………………………………………9
--分计数模块程序实现:
……………………………………………………………10
--时计数模块程序实现:
……………………………………………………………10
整点报时模块:
…………………………………………………………………………12
闹钟设定模块:
…………………………………………………………………………13
--闹钟调节模块程序实现:
…………………………………………………………14
--输出信号选择模块程序实现:
……………………………………………………14
彩铃模块:
………………………………………………………………………………15
译码显示模块:
…………………………………………………………………………18
万年历模块:
……………………………………………………………………………19
--日计数模块程序设计:
……………………………………………………………20
--月计数模块程序设计:
……………………………………………………………23
--年计数模块程序设计:
……………………………………………………………23
--万年历波形仿真结果:
……………………………………………………………25
结论:
…………………………………………………………………………26
实验感想:
………………………………………………………………………26
附图:
…………………………………………………………………………………27
设计内容简介
设计一个数字计时器,可以完成00:
00:
00到23:
59:
59的计时功能,并在控制电路的作用下具有保持、清零、快速校时、快速校分、快速较秒等功能。
在设计的电路具有上述基本功能的前提下,我又进行了功能扩展:
整点报时、闹钟设置、彩铃和万年历功能。
(由于时间限制,万年历功能未经硬件测试,仅通过软件层面简单调试仿真)
设计要求说明
设计基本要求:
1、能进行正常的时、分、秒计时功能;
2、分别由六个数码管显示时分秒的计时;
3、K1是系统的使能开关(K1=0正常工作,K1=1时钟保持不变);
4、K2是系统的清零开关(K2=0正常工作,K2=1时钟的分、秒全清零);
5、K3是系统的校分开关(K3=0正常工作,K3=1时可以快速校分);
6、K4是系统的校时开关(K4=0正常工作,K4=1时可以快速校时);
设计提高部分要求
1、使时钟具有整点报时功能(当时钟计到59’53”时开始
报时,在59’53”,59’55”,59’57”时报时频率为512Hz,59’59”时报时频率为1KHz);
2、闹表设定功能;
方案论证(整体电路的工作原理)
本实验在实现实验基本功能的基础上,加入了整点报时、闹钟设置、彩铃和万年历显示调节功能。
整个电路由计数模块、分频模块、校时、校分较秒模块,清零模块、保持模块,整点报时模块,闹钟设定模块、彩铃模块,以及万年历模块构成。
(如下图所示)
基本功能:
数字计时器基本功能是计时,因此首先需要获得具有精确振荡时间的脉振信号,以此作为计时电路的时序基础,实验中可以使用的振荡频率源为48MHZ,通过分频获得所需脉冲频率(1Hz,,2Hz,4Hz,1KHz,500Hz,6MHz)。
经过Verilog编程可以轻松获得较为精确的分频信号。
在计数模块中,秒位和分位分别通过编程用模60计数器实现,时位通过编程用模24计数器实现。
校时、校分及校秒模块则通过语言选择实现。
清零及保持功能在计数模块中用判断语句可轻松实现。
计数模块总共输出6路信号:
秒位的个、十位,分位的个、十位及时位的个、十位。
整点报时:
利用计数模块的输出作为报时模块的输入,当检测到59’53”,59’55”,59
实验模块原理图
57”时令报时模块的输出为500Hz,59’59”时令报时模块的输出为1Kz.,驱动蜂鸣器产生不同的响声。
闹钟设定模块:
这里设计一个闹钟模块,输入为计数模块的输出及一系列调节信号,输出接到译码模块上。
在闹钟模块内部,核心模块是一个选择模块,选择输出的信号是闹钟显示还是正常的计数显示。
为了使闹钟模块与计数模块是相互独立的,因此单独设计模24(闹钟小时)和模60(闹钟分钟)作为选择模块的输入。
设计程序语言的思想是,当检测到与设定闹钟相同的时、分位时就输出一个信号1,并保存当前计数位(加1)当检测到当前信号与保存位相同时输出信号恢复为0。
(这个信号将作为闹铃结束的判断信号)
彩铃模块:
本程序选用了一段悠扬的梁祝音乐,该模块的输入分别为6MHz和4Hz,通过编程实现输出为符合音律的不同频率。
程序实现的思想并不复杂,只要有乐谱可以实现各种不同的音乐输出。
蜂鸣器何时鸣叫取决于闹钟模块的输出。
译码显示模块:
本模块没有采用Verilog语言实现,通过搭建原理图实现。
显示功能是通过数选器、译码器、码转换器和7段显示管实现的。
因为实验中只用一个译码显示单元,6个7段码(用于显示时分秒),所以通过1个24选4MUX和一个3-8译码器配合,显示译码器采用7447,根据计数器的信号进行数码管的动态显示。
万年历模块:
通过编程可以轻松实现,原理与上述计数模块,调节模块很是类似。
由于未经硬件测试(时间限制),将在下面的子模块介绍中给出软件层面的实现和编译调试结果。
各子模块设计原理
本数字钟设计主要用Verilog语言实现,严格采用了模块化的程序设计思想,自顶向下逐步求精,模块之间高度独立。
(仅译码显示模块采用原理图搭建)下面将分别介绍各主要子模块及其子模块以及算法语言的实现和部分波形仿真编译调试结果。
分频模块:
(clkout输出为1Hz,clkout1K输出为1Kz,clkout500输出为500Hz,clkout2输出为2Hz,clkout6M输出为6MHz,clkout4输出为4Hz.)
moduleclkdiv(clk,clkout,clkout1k,clkout500,clkout2,clkout6M,clkout4);
inputclk;
outputclkout,clkout1k,clkout500,clkout2,clkout6M,clkout4;
regclkout,clkout1k,clkout500,clkout2,clkout6M,clkout4;
reg[31:
0]cnt,cnm,cnn,cmm,caa,cbb;
always@(posedgeclk)//产生1Hz信号
begin
if(cnt==32'd24000000)
begin
clkout<=1'd1;
cnt<=cnt+32'd1;
end
elseif(cnt==32'd48000000)
begin
clkout<=1'b0;
cnt<=32'd0;
end
else
cnt<=cnt+32'd1;
end
always@(posedgeclk)//产生1KHz信号
begin
if(cnm==32'd24000)
begin
clkout1k<=1'd1;
cnm<=cnm+32'd1;
end
elseif(cnm==32'd48000)
begin
clkout1k<=1'b0;
cnm<=32'd0;
end
else
cnm<=cnm+32'd1;
end
always@(posedgeclk)//产生500Hz信号
begin
if(cnn==32'd48000)
begin
clkout500<=1'd1;
cnn<=cnn+32'd1;
end
elseif(cnn==32'd96000)
begin
clkout500<=1'b0;
cnn<=32'd0;
end
else
cnn<=cnn+32'd1;
end
always@(posedgeclk)//产生2Hz信号
begin
if(cmm==32'd12000000)
begin
clkout2<=1'd1;
cmm<=cmm+32'd1;
end
elseif(cmm==32'd24000000)
begin
clkout2<=1'b0;
cmm<=32'd0;
end
else
cmm<=cmm+32'd1;
end
always@(posedgeclk)//产生6MHz信号
begin
if(caa==32'd4)
begin
clkout6M<=1'd1;
caa<=caa+32'd1;
end
elseif(caa==32'd8)
begin
clkout6M<=1'b0;
caa<=32'd0;
end
else
caa<=caa+32'd1;
end
always@(posedgeclk)//产生4Hz信号
begin
if(cbb==32'd6000000)
begin
clkout4<=1'd1;
cbb<=cbb+32'd1;
end
elseif(cbb==32'd12000000)
begin
clkout4<=1'b0;
cbb<=32'd0;
end
else
cbb<=cbb+32'd1;
end
Endmodule
除了6MHz可以通过波形图直接观察,其他分频在程序设计原理上都可以确定是正确的,通过硬件可以作一定的观察(或者对仿真时间设定作相应调整)。
计数模块:
计数模块中包含三个校准模块和三个计数模块(分别对应着秒分时)。
(secondclka为秒脉冲输入信号1Hz,secondclkb为输入校准信号用频率2Hz,K5jiaomiao、K3jiaofen、K4jiaoshi分别为校秒、校分、校时输入信号,clkdff为D触发器输入信号(去开关抖动用),reset1K2为清零信号,start0K1为保持信号。
输出分别对应秒分时的个位和十位)
--校准模块程序实现:
modulexiaozhun(clka,clkb,cp,clko);
inputclka,clkb,cp;//正常进位信号频率、校准频率、校准使能信号
outputclko;
regclko;
always
begin
if(!
cp)clko=clka;
elseclko=clkb;
end
Endmodule
--秒计数模块程序实现:
modulesecond(clk,reset,start,SL,SH,co);
inputclk;//输入计数时钟
inputreset,start;//清零信号、保持信号
outputco=1'b0;//进位信号
regco;
output[3:
0]SL,SH;
reg[3:
0]SL,SH;
reg[7:
0]cnt;
always@(posedgeclkornegedgereset)
begin
if(!
reset)
begin
SL=4'd0;
SH=4'd0;
cnt<=8'd0;
end
else
begin
if(!
start)
begin
if(cnt==8'd59)
begin
cnt<=8'd0;
SL<=4'd0;
SH<=4'd0;
co<=1'b1;
end
else
begin
co=1'b0;
cnt=cnt+8'd1;
SL<=cnt%10;
SH<=cnt/10;
end
end
end
end
endmodule
--分计数模块程序实现:
moduleminute(clk,reset,start,ML,MH,co);
inputclk;//输入计数时钟
inputreset,start;//清零信号、保持信号
outputco=1'b0;//进位信号
regco;
output[3:
0]ML,MH;
reg[3:
0]ML,MH;
reg[7:
0]cnt;
always@(posedgeclkornegedgereset)
begin
if(!
reset)
begin
ML=4'd0;
MH=4'd0;
cnt<=8'd0;
end
else
begin
if(!
start)
begin
if(cnt==8'd59)
begin
cnt<=8'd0;
ML<=4'd0;
MH<=4'd0;
co<=1'b1;
end
else
begin
co=1'b0;
cnt=cnt+8'd1;
ML<=cnt%10;
MH<=cnt/10;
end
end
end
end
endmodule
--时计数模块程序实现:
modulehour(clk,reset,start,HL,HH);
inputclk;//输入计数时钟
inputreset,start;//清零信号、保持信号
output[3:
0]HL,HH;
reg[3:
0]HL,HH;
reg[7:
0]cnt;
always@(posedgeclkornegedgereset)
begin
if(!
reset)
begin
HL=4'd0;
HH=4'd0;
cnt<=8'd0;
end
else
begin
if(!
start)
begin
if(cnt==8'd23)
begin
cnt<=8'd0;
HL<=4'd0;
HH<=4'd0;
end
else
begin
cnt=cnt+8'd1;
HL<=cnt%10;
HH<=cnt/10;
end
end
end
end
Endmodule
(计数秒脉冲设为48MHz时可以得到如下波形仿真,验证计数器功能基本正确)
计数模块内部子模块的连接示意图如下所示,3个D触发器的作用分别为去除开关抖动。
整点报时模块:
(输入分别为秒位和分位以及报时所需的两种频率,输出为驱动蜂鸣器的频率)
modulebaoshi(sl,sh,ml,mh,clk1k,clk500,clkbeep);
input[3:
0]sl,sh,ml,mh;
inputclk1k,clk500;
outputclkbeep;
regclkbeep;
always
begin
if(mh==8'd5&&ml==8'd9&&sh==8'd5&&sl==8'd3)
clkbeep=clk500;
elseif(mh==8'd5&&ml==8'd9&&sh==8'd5&&sl==8'd5)
clkbeep=clk500;
elseif(mh==8'd5&&ml==8'd9&&sh==8'd5&&sl==8'd7)
clkbeep=clk500;
elseif(mh==8'd5&&ml==8'd9&&sh==8'd5&&sl==8'd9)
clkbeep=clk1k;
else
clkbeep=0;
end
endmodule
闹钟设定模块:
闹钟设定模块中包含2个校准模块,1个模60计数模块,1个模24计数模块和1个输出信号选择模块。
(其中计数模块与前面的类似,只是不含进位输出信号)
闹钟调节模块程序实现:
moduletiaonao(clka,cp,clko);
inputclka,cp;//闹钟调节用频率、调节输入使能信号
outputclko;
regclko;
always
begin
if(cp)clko=clka;
elseclko=0;
end
Endmodule
模24计数模块和模60计数模块的程序源码不再给出(与前面的计数模块程序基本类似,只是不输出进位信号,无清零保持信号)
输出信号选择模块程序实现:
(sl,sh,ml,mh,hl,hh为正常计数输入信号,iml,imh,ihl,ihh为闹钟输入信号,slo,sho,mlo,mho,hlo,hho为输出信号接译码显示模块,k为显示闹钟或正常计数选择信号,km为响铃判断信号)
modulenaozhxuan(sl,sh,ml,mh,hl,hh,iml,imh,ihl,ihh,slo,sho,mlo,mho,hlo,hho,k,km);
input[3:
0]sl,sh,ml,mh,hl,hh,iml,imh,ihl,ihh;
inputk;
output[3:
0]slo,sho,mlo,mho,hlo,hho;
reg[3:
0]slo,sho,mlo,mho,hlo,hho,xx;
outputkm;
regkm;
initial
begin
km=0;
End
always
begin
if(!
k)
begin
begin
slo=sl;
sho=sh;
mlo=ml;
mho=mh;
hlo=hl;
hho=hh;
end
if((mlo==iml)&&(mho==imh)&&(hlo==ihl)&&(hho==ihh))
begin
xx=mlo;
km=1;
end
elseif(mlo==xx)
km=0;
end
else
begin
slo=4'd8;
sho=4'd8;
mlo=iml;
mho=imh;
hlo=ihl;
hho=ihh;
end
end
Endmodule
彩铃模块:
梁祝源码:
(来自网络)
modulesong(clk_6MHz,clk_4Hz,speaker,high,med,low);
inputclk_6MHz,clk_4Hz;
outputspeaker;
output[3:
0]high,med,low;
reg[3:
0]high,med,low;
reg[13:
0]divider,origin;
reg[7:
0]counter;
regspeaker;
wirecarry;
assigncarry=(divider==16383);
always@(posedgeclk_6MHz)
begin
if(carry)divider=origin;
elsedivider=divider+1;
end
always@(posedgecarry)
begin
speaker=~speaker;
end
always@(posedgeclk_4Hz)
begin
case({high,med,low})
'b1:
origin=7281;
'b1:
origin=8730;
'b0:
origin=9565;
'b1:
origin=10310;
'b0:
origin=10647;
'b0:
origin=11272;
'b0:
origin=11831;
'b0:
origin=12556;
'b0:
origin=12974;
'b0:
origin=13516;
'b0:
origin=16383;
endcase
end
always@(posedgeclk_4Hz)
begin
if(counter==63)counter=0;
elsecounter=counter+1;
case(counter)
0:
{high,med,low}='b1;
1:
{high,med,low}='b1;
2:
{high,med,low}='b1;
3:
{high,med,low}='b1;
4:
{high,med,low}='b1;
5:
{high,med,low}='b1;
6:
{high,med,low}='b1;
7:
{high,med,low}='b0;
8:
{high,med,low}='b0;
9:
{high,med,low}='b0;
10:
{high,med,low}='b0;
11:
{high,med,low}='b0;
12:
{high,med,low}='b0;
13:
{high,med,low}='b0;
14:
{high,med,low}='b1;
15:
{high,med,low}='b1;
16:
{high,med,low}='b0;
17:
{high,med,low}='b0;
18:
{high,med,low}='b0;
19:
{high,med,low}='b0;
20:
{high,med,low}='b0;
21:
{high,med,low}='b0;
22:
{high,med,low}='b0;
23:
{high,med,low}='b0;
24:
{high,med,lo
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 多功能 数字 设计 Verilog 语言 编写