实用多功能数字时钟设计verilog汇总.docx
《实用多功能数字时钟设计verilog汇总.docx》由会员分享,可在线阅读,更多相关《实用多功能数字时钟设计verilog汇总.docx(20页珍藏版)》请在冰豆网上搜索。
实用多功能数字时钟设计verilog汇总
西安邮电大学
数字系统设计实验课程设计报告书
2013-2014学年第一学期
专业:
自动化
班级:
学号姓名
实用多功能数字时钟设计
1、设计要求
数字钟具有整点报时和校时功能。
(1)以4位LERD数码管显示时、分,时为24进制。
(2)时、分显示数字之间以小数点间隔,小数点以1Hz频率、50%占空比的亮、灭规律表示秒计时。
(3)整点报时采用蜂鸣器实现。
每当整点前控制蜂鸣器以低频鸣响4次,响1s、停1s,直到整点前一秒以高频响1s,整点时结束。
(4)采用两个按键分别控制“校时”或“校分”。
按下“校时”键时,时显示值以0~23循环变化;按下“校分”键时,分显示值以0~59循环变化,但时显示值不能变化。
2、背景知识介绍
(1)VerilogHDL简介
VerilogHDL是一种硬件描述语言,用于从算法级、门级到开关级的多种抽象设计层次的数字系统建模。
被建模的数字系统对象的复杂性可以介于简单的门和完整的电子数字系统之间。
数字系统能够按层次描述,并可在相同描述中显式地进行时序建模。
VerilogHDL语言具有下述描述能力:
设计的行为特性、设计的数据流特性、设计的结构组成以及包含响应监控和设计验证方面的时延和波形产生机制。
所有这些都使用同一种建模语言。
此外,VerilogHDL语言提供了编程语言接口,通过该接口可以在模拟、验证期间从设计外部访问设计,包括模拟的具体控制和运行。
VerilogHDL语言不仅定义了语法,而且对每个语法结构都定义了清晰的模拟、仿真语义。
因此,用这种语言编写的模型能够使用Verilog仿真器进行验证。
语言从C编程语言中继承了多种操作符和结构。
VerilogHDL提供了扩展的建模能力,其中许多扩展最初很难理解。
但是,VerilogHDL语言的核心子集非常易于学习和使用,这对大多数建模应用来说已经足够。
当然,完整的硬件描述语言足以对从最复杂的芯片到完整的电子系统进行描述。
(2)Modelsim简介
Modelsim仿真工具是Model公司开发的。
它支持Verilog、VHDL以及他们的混合仿真,它可以将整个程序分步执行,使设计者直接看到他的程序下一步要执行的语句,而且在程序执行的任何步骤任何时刻都可以查看任意变量的当前值,可以在Dataflow窗口查看某一单元或模块的输入输出的连续变化等,比quartus自带的仿真器功能强大的多,是目前业界最通用的仿真器之一。
(3)Quartus工程说明
创建工程时,路径中不允许有中文。
选择芯片系列:
CycloneII
选择芯片型号:
EP2C8Q208C8
其余直接下一步。
(创建的工程文件名为:
*.qpf文件)
与工程设置:
Assignments->Settings
弹窗右上角:
Device…
DeviceandPinOptions->Configuration->
Useconfigurationdevice:
EPCS1
DeviceandPinOptions->Dual-PurposePins->
nCEO:
UseasregularI/O
创建Verilog文件,和BlockDiagram文件。
完成编译后,下载。
编译:
Processing->StartCompilation
引脚分配:
Assignments->PinPlanner
下载程序:
Tools->Programmer->
HardwareSetup…:
选择对应的下载方式
Mode:
JATG
注意文件名后缀为:
*.sof
并勾选:
Program/Configure
连接下载器线,和USB电源线,点击“Start”下载。
Progress:
绿色100%,完成。
该下载方式:
掉电后消失,须重新下载。
3、硬件设计
(1)主要部件电路图
按键电路图
蜂鸣器电路图
(2)硬件配置
硬件搭建图
引脚配置图
4、软件设计
(1)Modelsim仿真
1.主程序
moduleled(clk,clr,miao,fen1,fen2,shi1,shi2,a,jiaos,jiaof,Ring,
sel,seg);
inputclk,clr;
inputjiaos,jiaof,sel;
outputmiao,fen1,fen2,shi1,shi2,seg;
reg[3:
0]fen1,fen2,shi1,shi2;
regmiao;
reg[3:
0]sfbz;
outputreg[7:
0]a;
outputregRing;
outputreg[1:
0]sel;
outputreg[6:
0]seg;
always@(posedgeclk)
begin
if(clr)
miao<=0;
else
miao=~miao;
end
always@(posedgemiaoorclr)
begin
if(clr)
a<=0;
elseif(a==8'd59)
a<=0;
else
a<=a+1;
end
always@(posedgemiaoorclr)
begin
if(clr)
fen1<=0;
elseif(jiaof&&fen1<4'd9)
fen1<=fen1+1;
elseif(jiaof&&fen1==4'd9)
fen1<=0;
elseif(fen1==4'd9&&a==8'd59)
fen1<=0;
elseif(a==8'd59&&(a+1)==8'd60)
fen1<=fen1+1;
elsefen1<=fen1;
end
always@(posedgemiaoorclr)
begin
if(clr)
fen2<=0;
elseif(jiaof&&fen1==4'd9&&fen2<5)
fen2<=fen2+1;
elseif(fen2==5&&fen1==9&&a==8'd59)
fen2<=0;
elseif(fen1==9&&a==8'd59)
fen2<=fen2+1;
else
fen2<=fen2;
end
always@(posedgemiaoorclr)
begin
if(clr)
shi1<=0;
elseif(jiaos&&shi1<4'd9)
shi1=shi1+1;
elseif(jiaos&&shi1==4'd9)
shi1<=0;
elseif(shi1==8'd3&&fen1==8'd9&&fen2==8'd5&&a==8'd59&&shi2==4'd2)
begin
shi1<=0;
shi2<=0;
end
elseif(fen1==8'd9&&fen2==8'd5&&a==8'd59&&shi1==8'd9)
shi1<=0;
elseif(fen1==8'd9&&fen2==8'd5&&a==8'd59)
shi1<=shi1+1;
elseshi1<=shi1;
end
always@(posedgemiaoorclr)
begin
if(clr)
shi2<=0;
elseif(jiaos&&shi2<4'd2)
shi2=shi2+1;
elseif(shi1==8'd3&&fen1==8'd9&&fen2==8'd5&&a==8'd59&&shi2==2)
shi2<=0;
elseif(fen1==8'd9&&fen2==8'd5&&a==8'd59&&shi1==8'd9)
shi2<=shi2+1;
elseshi2<=shi2;
end
always@(fen1orfen2ormiao)
if(fen1==8'd9&&fen2==8'd5)
case(a)
8'd51:
Ring=1;
8'd53:
Ring=1;
8'd55:
Ring=1;
8'd57:
Ring=1;
8'd59:
Ring=1;
default:
Ring=1'b0;
endcase
else
Ring=1'b0;
endmodule
2.测试程序
moduleledtest1;
regclk,clr;
wire[3:
0]fen1,fen2,shi1,shi2;
wiremiao;
wireRing;
wire[7:
0]a;
regjiaos,jiaof;
ledu1(clk,clr,miao,fen1,fen2,shi1,shi2,a,jiaos,jiaof,Ring);
initial
begin
#10clk=1;
#10clr=1;
#10clr=1;
#10clr=0;
#100jiaof=0;
#100jiaos=0;
#100000jiaof=1;
#100000jiaos=1;
#100jiaof=0;
#100jiaos=0;
clr=0;
end
always#10clk=~clk;
endmodule
3.Modelsm程序仿真
4.程序仿真波形图
(2)Quartus
仿真
1.主程序
moduleled(clk,clr,miao,jiaos,jiaof,Ring,sel,seg);
inputclk,clr;
inputjiaos,jiaof;
outputmiao,seg,sel;
reg[3:
0]fen1,fen2,shi1,shi2;
reg[21:
0]div;
regmiao,clkd;
reg[7:
0]seg;
reg[3:
0]sel,nsel;
reg[3:
0]sfbz;
reg[7:
0]a;
outputregRing;
always@(posedgeclk)
begin
if(~clr)
div<=0;
elseif(div==21'b111111111111111111111)
div<=0;
else
div<=div+1;
end
always@(posedgeclk)
begin
if(~clr)
clkd<=0;
elseif(div==21'b111111111111111111111)
clkd<=~clkd;
elseclkd<=clkd;
end
always@(posedgeclkd)
begin
if(~clr)
miao<=0;
else
miao=~miao;
end
always@(posedgemiaoornegedgeclr)
begin
if(~clr)
a<=0;
elseif(a==8'd59)
a<=0;
else
a<=a+1;
end
always@(posedgemiaoornegedgeclr)
begin
if(~clr)
fen1<=0;
elseif(!
jiaof&&fen1<4'd9)
fen1<=fen1+1;
elseif(!
jiaof&&fen1==4'd9)
fen1<=0;
elseif(fen1==4'd9&&a==8'd59)
fen1<=0;
elseif(a==8'd59&&(a+1)==8'd60)
fen1<=fen1+1;
elsefen1<=fen1;
end
always@(posedgemiaoornegedgeclr)
begin
if(~clr)
fen2<=0;
elseif(!
jiaof&&fen1==4'd9&&fen2<5)
fen2<=fen2+1;
elseif(!
jiaof&&fen1==4'd9&&fen2==5)
fen2<=0;
elseif(fen2==5&&fen1==9&&a==8'd59)
fen2<=0;
elseif(fen1==9&&a==8'd59)
fen2<=fen2+1;
else
fen2<=fen2;
end
always@(posedgemiaoornegedgeclr)
begin
if(~clr)
shi1<=0;
elseif(!
jiaos&&shi2<=1&&shi1<4'd9)
shi1<=shi1+1;
elseif(!
jiaos&&shi2==2&&shi1<4'd3)
shi1<=shi1+1;
elseif(!
jiaos&&shi1==4'd9)
shi1<=0;
elseif(!
jiaos&&shi2==2&&shi1==4'd3)
shi1<=0;
elseif(fen1==8'd9&&fen2==8'd5&&a==8'd59&&shi1==8'd9)
shi1<=0;
elseif(fen1==8'd9&&fen2==8'd5&&a==8'd59)
shi1<=shi1+1;
elseshi1<=shi1;
end
always@(posedgemiaoornegedgeclr)
begin
if(~clr)
shi2<=0;
elseif(!
jiaos&&shi2<4'd2&&shi1==9)
shi2<=shi2+1;
elseif(!
jiaos&&shi2==4'd2&&shi1==3)
shi2<=0;
elseif(shi1==8'd3&&fen1==8'd9&&fen2==8'd5&&a==8'd59&&shi2==2)
shi2<=0;
elseif(fen1==8'd9&&fen2==8'd5&&a==8'd59&&shi1==8'd9)
shi2<=shi2+1;
elseshi2<=shi2;
end
always@(fen1orfen2ormiao)
begin
if(fen1==8'd9&&fen2==8'd5)
case(a)
8'd51:
Ring=1;
8'd53:
Ring=1;
8'd55:
Ring=1;
8'd57:
Ring=1;
8'd59:
Ring=1;
default:
Ring=1'b0;
endcase
else
Ring=1'b0;
end
always@(posedgeclkornegedgeclr)
begin
if(~clr)
sel<=4'b0000;
else
sel<=nsel;
end
/*always@(posedgeclk)
begin
if(~clr)
seg=7'b11000000;
end*/
always@(sel)
begin
case(sel)
4'b0000:
nsel=4'b1000;
4'b1000:
nsel=4'b0100;
4'b0100:
nsel=4'b0010;
4'b0010:
nsel=4'b0001;
4'b0001:
nsel=4'b0000;
default:
nsel=4'b0000;
endcase
end
always@(sel)
begin
case(sel)
4'b0010:
sfbz=fen2;
4'b0001:
sfbz=fen1;
4'b1000:
sfbz=shi2;
4'b0100:
sfbz=shi1;
default:
sfbz=4'b0000;
endcase
end
always@(sfbz)
begin
case(sfbz)
4'b0000:
seg=8'b11000000;
4'b0001:
seg=8'b11111001;
4'b0010:
seg=8'b10100100;
4'b0011:
seg=8'b10110000;
4'b0100:
seg=8'b10011001;
4'b0101:
seg=8'b10010010;
4'b0110:
seg=8'b10000010;
4'b0111:
seg=8'b11111000;
4'b1000:
seg=8'b10000000;
4'b1001:
seg=8'b10010000;
default:
seg=7'b11000000;
endcase
end
endmodule
2.运行结果
5、课程设计心得体会
xx:
课程设计是我们专业课程知识综合应用的实践训练,着是我们迈向社会,从事职业工作前一个必不少的过程.”千里之行始于足下”,通过这次课程设计,我深深体会到这句千古名言的真正含义.我今天认真的进行课程设计,学会脚踏实地迈开这一步,就是为明天能稳健地在社会大潮中奔跑打下坚实的基础。
通过这次课程设计,本人在多方面都有所提高。
通过这次课程设计,综合运用本专业所学课程的理论和生产实际知识进行一次汽车尾灯设计工作的实际训练从而培养和提高学生独立工作能力,巩固与扩充了Verilog等课程所学的内容,掌握设计的方法和步骤,同时各科相关的课程都有了全面的复习,独立思考的能力也有了提高。
xx:
经过两周的实习,从刚开始拿到题目到后来做出题目,我学到了很多东西。
同时我也认识到自己的不足,所学知识不能灵活的运用,部分知识还有所欠缺。
本次课程设计,我主要负责硬件部分,通过本次课程设计的编程和对编程过程中遇到的问题的思考.
本次课程设计我们做的是数字钟,这项实验的重点在硬件部分,所以成功的关键就在于引脚的调试。
刚开始所写的程序在硬件调试的正确的,但是在给芯片里烧程序的时候结果出现了错误,经过我们的检查和老师的指导,原来是时钟那块的程序编写有点错误,后来经过几次修改之后,终于正确的显示了,连接电路板之后,一次就成功了。
经过本次课程设计,使我明白以后无论做什么事,一定要严谨,任何小细节都不能放过,有时候一个小问题都有可能是导致失败的原因。
xxx:
本次数字系统设计课程设计,我主要负责的是软件方面的编程。
在开始做该项目之前,首先需要对设计方案有一个全面的认识,把握整体与部分的关系,利用状态机确定相应的状态以及在相应状态下的系统输出控制,还有先态到下一状态的转换条件。
此外也要考虑在非正常状态下的跳转,如校时、校分,确保数字时钟运行中的准确。
在软件方面,我们组是由我和马若男两人来完成的,首先根据题目要求写出相应的主程序以实现计时、校时、响铃等功能,之后写出相应的测试程序以检测主程序是否可行。
期间,我们还遇到一些问题,如数码管的接入方式,测试程序的准确性等,在与同一课题小组的共同讨论及老师的指导中解决了问题,每一次遇到问题、解决问题都是很重要的成长机会,我们能够从中学到更多。
xxx:
在这次课程设计中,我们组做的是实用多功能数字时钟设计,我们分为软件和硬件两部分,我和另一个同学负责软件,我们需要对quartusii软件和modelsim很熟悉,能够很熟练的应用这两个软件,针对课设题目对时钟设计的各方面功能的要求来编写程序,在编写程序时,首先要有个整体的设计,如:
程序分为几个模块、分别要实现什么功能,如何编写最清楚等。
整理好思路后,我们开始写程序,包括主程序以及测试程序,并通过编译和运行,保证程序的正确性。
同时,在这次课程设计中,我还参与了部分硬件方面的工作,关于硬件方面,首先熟悉并掌握了下载流程和硬件引脚配置问题,将软硬件很好地结合在一起。
后期系统调试以及纠错,需要适当调整程序逻辑以满足硬件对软件的契合度。
总而言之,通过本次课设将已有的理论知识很好地实践,达到了学以致用的目的,完善了知识体系的构成。