本科毕业设计论文eda课程设计报告多功能数字钟设计.docx
《本科毕业设计论文eda课程设计报告多功能数字钟设计.docx》由会员分享,可在线阅读,更多相关《本科毕业设计论文eda课程设计报告多功能数字钟设计.docx(24页珍藏版)》请在冰豆网上搜索。
本科毕业设计论文eda课程设计报告多功能数字钟设计
湖北大学物电学院
EDA课程设计报告(论文)
题目:
多功能数字钟设计
专业班级:
14微电子科学与工程
姓名:
黄山
时间:
2016年12月20日
指导教师:
万美琳卢仕
完成日期:
2015年12月20日
多功能数字钟设计任务书
1.设计目的与要求
了解多功能数字钟的工作原理,加深利用EDA技术实现数字系统的理解
2.设计内容
1,能正常走时,时分秒各占2个数码管,时分秒之间用小时个位和分钟个位所在数码管的小数点隔开;
2,能用按键调时调分;
3,能整点报时,到达整点时,蜂鸣器响一秒;
4,拓展功能:
秒表,闹钟,闹钟可调
3.编写设计报告
写出设计的全过程,附上有关资料和图纸,有心得体会。
4.答辩
在规定时间内,完成叙述并回答问题。
目录(四号仿宋加粗居中)
(空一行)
1引言………………………………………………………………………………1
2总体设计方案……………………………………………………………………1
2.1设计思路………………………………………………………………………1
2.2总体设计框图……………………………………………………………2
3设计原理分析………………………………………………………………3
3.1分频器…………………………………………………………………………4
3.2计时器和时间调节…….……………………………………………………4
3.3秒表模块…………………………………………………………………………5
3.4状态机模块…………………………………………………………………6
3.5数码管显示模块…………………………………………………………………7
3.6顶层模块……………………………………………………………8
3.7管脚绑定和顶层原理图…………………………………………………………9
4总结与体会……………………………………………………………………11
多功能电子表
摘要:
本EDA课程主要利用QuartusII软件Verilog语言的基本运用设计一个多功能数字钟
,进行试验设计和软件仿真调试,分别实现时分秒计时,闹钟闹铃,时分手动较时,时分秒清零,时间保持和整点报时等多种基本功能
关键词:
Verilog语言,多功能数字钟,数码管显示;
1引言
QuartusII是Altera公司的综合性PLD/FPGA开发软件,支持原理图、VHDL、VerilogHDL以及AHDL(AlteraHardwareDescriptionLanguage)等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计流程,解决了传统硬件电路连线麻烦,出错率高且不易修改,很难控制成本的缺点。
利用软件电路设计连线方便,修改容易;电路结构清楚,功能一目了然
2总体设计方案
2.1设计思路
根据系统设计的要求,系统设计采用自顶层向下的设计方法,由时钟分频部分,计时部分,按键调时部分,数码管显示部分,蜂鸣器四部分组成。
这些模块在顶层原理图中相互连接作用
2.2总体设计框图
3设计原理分析
3.1分频器
分频模块:
将20Mhz晶振分频为1hz,100hz,1000hz分别用于计数模块,秒表模块,状态机模块
moduleoclk(CLK,oclk,rst,clk_10,clk_100);
inputCLK,rst;
outputoclk,clk_10,clk_100;
reg[32:
0]cnt,cnt1,cnt2;
regoclk,clk_10,clk_100;
always@(posedgeCLKornegedgerst)
begin
if(!
rst)
begin
cnt<=0;
oclk<=0;
end
else
if(cnt<10000-1)
cnt<=cnt+1;
else
begin
cnt<=0;
oclk=~oclk;
end
end
always@(posedgeCLKornegedgerst)
begin
if(!
rst)
begin
cnt1<=0;
clk_10<=0;
end
else
if(cnt1<=10000000-1)
cnt1<=cnt1+1;
else
begin
cnt1<=0;
clk_10<=~clk_10;
end
end
always@(posedgeCLKornegedgerst)
begin
if(!
rst)
begin
cnt2<=0;
clk_100<=0;
end
else
if(cnt2<100000-1)
cnt2<=cnt2+1;
else
begin
cnt2<=0;
clk_100=~clk_100;
end
end
endmodule
3.2计时器和时间调节
计时模块:
检测posedgeclk_10并进行计数,同时能调时调分,
最后是整点报时部分
modulecni(clk_10,rst,tiaoshi,tiaofen,ge,shi,bai,qian,wan,shiwan,bee);
inputclk_10,rst,tiaoshi,tiaofen;
outputreg[3:
0]ge,shi,bai,qian,wan,shiwan,bee;
always@(posedgeclk_10ornegedgerst)
begin
if(!
rst)
begin
ge<=0;
shi<=0;
bai<=0;
qian<=0;
wan<=0;
shiwan<=0;
end
else
begin
if((!
tiaofen)&&(bai<9))
bai<=bai+1;
elsebegin
if((!
tiaofen)&&(qian<5))
beginbai<=0;qian<=qian+1;end
if((!
tiaoshi)&&(wan<9))
wan<=wan+1;
elsebegin
if((!
tiaoshi)&&(shiwan<2))
beginwan<=0;shiwan<=shiwan+1;end
elsebegin
if((shiwan==2)&&(wan==4))
beginge<=0;shi<=0;bai<=0;qian<=0;wan<=0;shiwan<=0;end
if(ge<9)
ge<=ge+1;
else
begin
ge<=0;
if(shi<5)
shi<=shi+1;
else
begin
shi<=0;
if(bai<9)
bai<=bai+1;
else
begin
bai<=0;
if(qian<5)
qian<=qian+1;
else
begin
qian<=0;
if(wan<3)
wan<=wan+1;
else
begin
wan<=0;
if(shiwan<2)
shiwan<=shiwan+1;
else
shiwan<=0;
end
end
end
end
end
end
end
end
end
end
always@(posedgeclk_10)
begin
if((ge==0)&&(shi==0)&&(bai==0)&&(qian==0))
bee=0;
else
bee=1;
end
endmodule
3.3秒表模块
与计时部分类似,总体思想是调整进制和提高信号频率,如下
modulemiaobiao(clk_100,tm,m6,m5,m4,m3,m2,m1);
inputtm,clk_100;
outputm6,m5,m4,m3,m2,m1;
reg[3:
0]m6,m5,m4,m3,m2,m1;
always@(posedgeclk_100)
begin
if(tm)
begin
m6<=0;
m5<=0;
m4<=0;
m3<=0;
m2<=0;
m1<=0;
end
else
begin
if(m1<9)
m1<=m1+1;
else
begin
m1<=0;
if(m2<9)
m2<=m2+1;
else
begin
m2<=0;
if(m3<9)
m3<=m3+1;
else
begin
m3<=0;
if(m4<9)
m4<=m4+1;
else
begin
m4<=0;
if(m5<9)
m5<=m5+1;
else
begin
m5<=0;
if(m6<9)
m6<=m6+1;
else
m6<=0;
end
end
end
end
end
end
end
endmodule
3.4状态机模块
一般通过逻辑抽象,得出状态转换图,状态化简,状态分配,用三段式写法入下
modulestate(clk1k,rst,tm,num,wela,ge,shi,bai,qian,wan,shiwan,m6,m5,m4,m3,m2,m1);
inputclk1k,rst,tm,ge,shi,bai,qian,wan,shiwan,m6,m5,m4,m3,m2,m1;
outputnum,wela;
wire[3:
0]ge,shi,bai,qian,wan,shiwan,m6,m5,m4,m3,m2,m1;
reg[3:
0]num;
reg[5:
0]wela;
reg[3:
0]current_state,next_state;
parameter[3:
0]D1=1;
parameter[3:
0]D2=2;
parameter[3:
0]D3=3;
parameter[3:
0]D4=4;
parameter[3:
0]D5=5;
parameter[3:
0]D6=6;
parameter[3:
0]D01=7;
parameter[3:
0]D02=8;
parameter[3:
0]D03=9;
parameter[3:
0]D04=10;
parameter[3:
0]D05=11;
parameter[3:
0]D06=12;
always@(posedgeclk1kornegedgerst)
begin
if(!
rst)
current_state<=D1;
else
current_state<=next_state;
end
always@(current_state)
begin
if(tm==0)
begin
case(current_state)
D1:
begin
num=m1;
wela=6'b111110;
if(clk1k)
next_state=D01;
else
next_state=D1;
end
D01:
begin
num=12;
wela=6'b1111101;
if(clk1k)
next_state=D2;
else
next_state=D01;
end
D2:
begin
num=m2;
wela=6'b111101;
if(clk1k)
next_state=D02;
else
next_state=D2;
end
D02:
begin
num=12;
wela=6'b111011;
if(clk1k)
next_state=D3;
else
next_state=D02;
end
D3:
begin
num=m3;
wela=6'b111011;
if(clk1k)
next_state=D03;
else
next_state=D3;
end
D03:
begin
num=12;
wela=6'b110111;
if(clk1k)
next_state=D4;
else
next_state=D03;
end
D4:
begin
num=m4;
wela=6'b110111;
if(clk1k)
next_state=D04;
else
next_state=D4;
end
D04:
begin
num=12;
wela=6'b101111;
if(clk1k)
next_state=D5;
else
next_state=D04;
end
D5:
begin
num=m5;
wela=6'b101111;
if(clk1k)
next_state=D6;
else
next_state=D05;
end
D05:
begin
num=12;
wela=6'b011111;
if(clk1k)
next_state=D6;
else
next_state=D05;
end
D6:
begin
num=m6;
wela=6'b011111;
if(clk1k)
next_state=D06;
else
next_state=D6;
end
D06:
begin
num=12;
wela=6'b111110;
if(clk1k)
next_state=D1;
else
next_state=D06;
end
endcase
end
else
begin
case(current_state)
D1:
beginnum=ge;wela=6'b111110;
if(clk1k)
next_state=D01;
else
next_state=D1;
end
D01:
beginnum=15;wela=6'b111101;
if(clk1k)
next_state=D2;
else
next_state=D01;
end
D2:
beginnum=shi;wela=6'b111101;
if(clk1k)
next_state=D02;
else
next_state=D2;
end
D02:
beginnum=15;wela=6'b111011;
if(clk1k)
next_state=D3;
else
next_state=D02;
end
D3:
beginnum=bai;wela=6'b111011;
if(clk1k)
next_state=D03;
else
next_state=D3;
end
D03:
beginnum=15;wela=6'b110111;
if(clk1k)
next_state=D4;
else
next_state=D03;
end
D4:
beginnum=qian;wela=6'b110111;
if(clk1k)
next_state=D04;
else
next_state=D4;
end
D04:
beginnum=15;wela=6'b101111;
if(clk1k)
next_state=D5;
else
next_state=D04;
end
D5:
beginnum=wan;wela=6'b101111;
if(clk1k)
next_state=D05;
else
next_state=D5;
end
D05:
beginnum=15;wela=6'b011111;
if(clk1k)
next_state=D6;
else
next_state=D05;
end
D6:
beginnum=shiwan;wela=6'b011111;
if(clk1k)
next_state=D06;
else
next_state=D6;
end
D06:
beginnum=15;wela=6'b111110;
if(clk1k)
next_state=D1;
else
next_state=D06;
end
default:
next_state=D1;
endcase
end
end
endmodule
3.5数码管显示模块
moduleSEG7(num,wela,SEG);
input[3:
0]num;
input[5:
0]wela;
outputSEG;
reg[7:
0]SEG;
always@(num)
begin
if((wela==6'b111011)||(wela==6'b101111))
begin
case(num)
0:
SEG=8'b01000000;
1:
SEG=8'b01111001;
2:
SEG=8'b00100100;
3:
SEG=8'b00110000;
4:
SEG=8'b00011001;
5:
SEG=8'b00010010;
6:
SEG=8'b00000010;
7:
SEG=8'b01111000;
8:
SEG=8'b00000000;
9:
SEG=8'b00011000;
default:
SEG=8'b11111111;
endcase
end
else
begin
case(num)
0:
SEG=8'b11000000;
1:
SEG=8'b11111001;
2:
SEG=8'b10100100;
3:
SEG=8'b10110000;
4:
SEG=8'b10011001;
5:
SEG=8'b10010010;
6:
SEG=8'b10000010;
7:
SEG=8'b11111000;
8:
SEG=8'b10000000;
9:
SEG=8'b10011000;
default:
SEG=8'b11111111;
endcase
end
end
endmodule
3.6顶层模块
所有模块通过元件例化进顶层模块
moduleclock(tm,clk,rst,tiaoshi,tiaofen,wela,SEG,bee);
inputclk,rst,tiaoshi,tiaofen,tm;
output[5:
0]wela;
output[7:
0]SEG;
outputbee;
wirenet1;
wirenet9;
wirenet10;
wire[3:
0]net2;
wire[3:
0]net3;
wire[3:
0]net4;
wire[3:
0]net5;
wire[3:
0]net6;
wire[3:
0]net7;
wire[3:
0]net8;
wire[3:
0]m6,m5,m4,m3,m2,m1;
oclku1(.CLK(clk),.oclk(net1),.rst(rst),.clk_10(net9),.clk_100(net10));
stateu2(.clk1k(net1),.rst(rst),.num(net2),.tm(tm),.wela(wela),.ge(net3),.shi(net4),.bai(net5),.qian(net6),.wan(net7),.shiwan(net8),.m6(m6),.m5(m5),.m4(m4),.m3(m3),.m2(m2),.m1(m1));
SEG7u3(.num(net2),.wela(wela),.SEG(SEG));
cniu4(.clk_10(net9),.rst(rst),.tiaoshi(tiaoshi),.tiaofen(tiaofen),.ge(net3),.shi(net4),.bai(net5),.qian(net6),.wan(net7),.shiwan(net8),.bee(bee));
miaobiaou5(.tm(tm),.clk_100(net10),.m6(m6),.m5(m5),.m4(m4),.m3(m3),.m2(m2),.m1(m1));
endmodule
3.7管脚绑定和顶层原理
4总结与体会
通过学习,我对多功能数字钟已经有过一定的了解,对于程序,不断的调试仿真过程是必不可少的,无论多么仔细的编程,思路上的漏洞总是存在的,并且会完全体现在实验结果上,在不断的调试仿真过程中,许多问题的暴露使得我们不仅对数字电路原理有了更加深刻的了解也使我们对QuartusII平台的使用规则有了更多的了解。
在经过了这一切之后,实现创新功能就会变得不再那么困难。