湖北大学物电学院 EDA课程设计报告(论文)
题目:多功能数字钟设计
专业班级: 14微电子科学与工程 姓 名: 黄山 时 间: 2016年12月20日 指导教师: 万美琳 卢仕
完成日期: 2015年 12月 20日
--
--
多功能数字钟设计任务书
1. 设计目的与要求
了解多功能数字钟的工作原理,加深利用EDA技术实现数字系统的理解 2.设计内容
1, 能正常走时,时分秒各占2个数码管,时分秒之间用小时个位和分钟个位所在数码管的小数点隔开;
2,ﻩ能用按键调时调分;
3,ﻩ能整点报时,到达整点时,蜂鸣器响一秒; 4, 拓展功能:秒表,闹钟,闹钟可调 3.编写设计报告
写出设计的全过程,附上有关资料和图纸,有心得体会。 4.答辩
在规定时间内,完成叙述并回答问题。
--
--
目录
加粗居中)
(空一行)
(四号仿宋_GB2312
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 总结与体会 ……………………………………………………………………1
1
--
--
ﻬ多功能电子表
摘要: 本EDA课程主要利用QuartusII软件Verilog语言的基本运用设计一个多功能数字钟
,进行试验设计和软件仿真调试,分别实现时分秒计时,闹钟闹铃,时分手动较时,时分秒清零,时间保持和整点报时等多种基本功能
关键词: Verilog语言, 多功能数字钟,数码管显示;
1 引言
QuartusII是Altera公司的综合性PLD/FPGA开发软件,支持原理图、VHDL、VerilogHDL以及AHDL(Altera Hardware Description Language)等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计流程,解决了传统硬件电路连线麻烦,出错率高且不易修改,很难控制成本的缺点。利用软件电路设计连线方便,修改容易;电路结构清楚,功能一目了然
2 总体设计方案
2.1 设计思路
根据系统设计的要求,系统设计采用自顶层向下的设计方法,由时钟分频部分,计时部分,按键调时部分,数码管显示部分,蜂鸣器四部分组成。这些模块在顶层原理图中相互连接作用
2.2 总体设计框图 计时器
秒表 晶振 分频器 状态机 蜂鸣器 数码管 3 设计原理分析
3.1 分频器
分频模块:将20Mhz晶振分频为1hz,100hz,1000hz分别用于计数模块,秒表模块,状态机模块
module oclk(CLK,oclk,rst,clk_10,clk_100); input CLK,rst;
--
--
output oclk,clk_10,clk_100; reg [32:0]cnt,cnt1,cnt2; reg oclk,clk_10,clk_100;
always@(posedge CLK or negedge rst) 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@(posedge CLK 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
or negedge--
st) r --
end
always@(posedge CLK or negedge rst) 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计时器和时间调节
计时模块:检测posedge clk_10 并进行计数,同时能调时调分, 最后是整点报时部分
module cni(clk_10,rst,tiaoshi,tiaofen,ge,shi,bai,qian,wan,shiwan,bee);
input clk_10,rst,tiaoshi,tiaofen;
output reg[3:0]ge,shi,bai,qian,wan,shiwan,bee; always@(posedge clk_10 or negedge rst) begin ﻩif(!rst)
begin ﻩge<=0; ﻩshi<=0;
bai<=0; wan<=0;
--
ﻩqian<=0;
ﻩ
--
ﻩshiwan<=0; end ﻩ else ﻩbegin
ﻩif((!tiaofen)&&(bai<9))
bai<=bai+1; else begin
if((!tiaofen)&&(qian<5))
ﻩbegin bai<=0;qian<=qian+1;end if((!tiaoshi)&&(wan<9)) wan<=wan+1; else begin
if((!tiaoshi)&&(shiwan<2))
begin wan<=0;shiwan<=shiwan+1;end else begin
if((shiwan==2)&&(wan==4))
begin ge<=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;
shiwan<=shiwan+1;
ﻩ if(shiwan<2) ﻩ else ﻩ shiwan<=0; end end endﻩ end end end end
always@(posedge clk_10) begin
if((ge==0)&&(shi==0)&&(bai==0)&&(qian==0)) bee=0; else bee=1; end endmodule
3.3秒表模块
与计时部分类似,总体思想是调整进制和提高信号频率,如下
--
end end
end
--
module miaobiao(clk_100,tm,m6,m5,m4,m3,m2,m1); input tm,clk_100;
output m6,m5,m4,m3,m2,m1; reg [3:0] m6,m5,m4,m3,m2,m1; always@(posedge clk_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; begin ﻩif(m5<9)
ﻩ else
ﻩ m4<=0;
ﻩ ﻩm5<=m5+1; ﻩﻩﻩelse ﻩ
ﻩ begin if(m6<9) else m6<=0; end ﻩﻩ m5<=0;
ﻩﻩ m6<=m6+1; ﻩ ﻩ ﻩ
ﻩ end ﻩ end ﻩ end end end ﻩend ﻩendmodule 3.4状态机模块
一般通过逻辑抽象,得出状态转换图,状态化简,状态分配,用三段式写法入下
module state(clk1k,rst,tm,num,wela,ge,shi,bai,qian,wan,shiwan,m6,m5,m4,m3,m2,m1);
input clk1k,rst,tm,ge,shi,bai,qian,wan,shiwan,m6,m5,m4,m3,m2,m1;
output num,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@(posedge clk1k or negedge rst) 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:begin num=ge;wela=6'b111110;
next_state=D01;
ﻩ if(clk1k) ﻩﻩ else
next_state=D1;
end
ﻩ D01:begin num=15;wela=6'b111101; ﻩ if(clk1k) ﻩ ﻩ
ﻩ next_state=D2;
next_state=D01;
ﻩ ﻩﻩ else ﻩﻩ end
D2:begin num=shi;wela=6'b111101; ﻩ if(clk1k) ﻩﻩﻩﻩ next_state=D02;
ﻩ
else ﻩnext_state=D2;
ﻩﻩ
ﻩ end
ﻩD02:begin num=15;wela=6'b111011;
if(clk1k) ﻩ
ﻩ next_state=D3; ﻩﻩ else
ﻩ next_state=D02;
ﻩ end
ﻩﻩD3:begin num=bai;wela=6'b111011; ﻩ
if(clk1k)
next_state=D03; else
ﻩ
ﻩﻩﻩﻩ next_state=D3; ﻩﻩ end
ﻩ D03:begin num=15;wela=6'b110111;
if(clk1k) ﻩ
next_state=D4;
--
--
ﻩﻩ else ﻩend
ﻩ ﻩﻩ next_state=D03;
ﻩﻩD4:begin num=qian;wela=6'b110111; ﻩﻩ if(clk1k)
ﻩ next_state=D04; ﻩ next_state=D4;
ﻩ ﻩ
else
ﻩ end
ﻩ D04:begin num=15;wela=6'b101111;
ﻩ if(clk1k) ﻩ
else
ﻩ ﻩﻩ next_state=D5; ﻩﻩ ﻩ next_state=D04; ﻩﻩ end
ﻩﻩD5:begin num=wan;wela=6'b101111; if(clk1k) ﻩ ﻩ next_state=D05;
ﻩ else
ﻩﻩ next_state=D5; ﻩ ﻩ end
ﻩ D05:begin num=15;wela=6'b011111; ﻩ if(clk1k) ﻩ ﻩﻩ next_state=D6; ﻩ ﻩ
ﻩ else
ﻩﻩ next_state=D05;
end
ﻩD6:begin num=shiwan;wela=6'b011111; ﻩ if(clk1k)
ﻩﻩ else end
D06:begin num=15;wela=6'b111110;
--
ﻩﻩ ﻩ next_state=D06; ﻩﻩﻩ next_state=D6;
--
ﻩ if(clk1k) ﻩ ﻩ ﻩ
next_state=D1; ﻩﻩ else
next_state=D06; end
default: next_state=D1; end end
endcase
endmodule
3.5数码管显示模块
module SEG7(num,wela,SEG); input [3:0]num; input [5:0]wela;ﻩ output SEG; 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顶层模块
所有模块通过元件例化进顶层模块
module clock(tm,clk,rst,tiaoshi,tiaofen,wela,SEG,bee); input clk,rst,tiaoshi,tiaofen,tm; output [5:0]wela; output [7:0]SEG; output bee; wire net1; wire net9; wire net10; 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;
oclk u1(.CLK(clk),.oclk(net1),.rst(rst),.clk_10(net9),.clk_100(net10));
state u2(.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));
SEG7 u3(.num(net2),.wela(wela),.SEG(SEG));
cni u4(.clk_10(net9),.rst(rst),.tiaoshi(tiaoshi),.tiaofen(tiaofen),.ge(net3),.shi(net4),.bai(net5),.qian(net6),.wan(net7),.shiwan(net8),.bee(bee));
ﻩmiaobiao u5(.tm(tm),.clk_100(net10),.m6(m6),.m5(m5),.m4(m4),.m3(m3),.m2(m2),.m1(m1));
ﻩendmodule 3.7管脚绑定和顶层原理
--
--
4总结与体会
通过学习,我对多功能数字钟已经有过一定的了解,对于程序,不断的调试仿真过程是必不可少的,无论多么仔细的编程,思路上的漏洞总是存在的,并且会完全体现在实验结果上,在不断的调试仿真过程中,许多问题的暴露使得我们不仅对数字电路原理有了更加深刻的了解也使我们对QuartusII平台的使用规则有了更多的了解。在经过了这一切之后,实现创新功能就会变得不再那么困难。
--
因篇幅问题不能全部显示,请点此查看更多更全内容