时钟设计及数码管驱动论文.docx
《时钟设计及数码管驱动论文.docx》由会员分享,可在线阅读,更多相关《时钟设计及数码管驱动论文.docx(12页珍藏版)》请在冰点文库上搜索。
时钟设计及数码管驱动论文
基于FPGA的时钟设计及数码管驱动
(VHDL语言、实现)
摘要
本设计为一个显示10毫秒、秒钟、分钟、时钟的跑表。
利用开发平台的8个数码管设计一个跑表,包括时钟、分钟、秒钟以及10毫秒的显示。
它们分别占用两个数码管,显示其个位和十位。
本设计采用FPGA技术,以硬件描述语言VHDL为系统逻辑描述手段设计文件,在xilinx
ISE工具软件环境下,由各个基本模块共同构建了一个基于FPGA的数字钟。
本设计小组成员共有三人:
其他两人采用VerilogHDL语言设计时钟代码。
关键词:
FPGA;数字时钟设计;数码管
目录
1FPGA简介
1.1FPGA概述
1.2FPGA的应用领域
2时钟设计方案
2.1时钟设计的原理
3时钟总体设计
3.1时钟代码程序的设计
3.2引脚分配
4实验步骤与结果
4.1实验步骤
4.2仿真波形
5实验心得
1.1FPGA概述
FPGA是现场可编程门阵列(FieldProgrammableGateArray)的简称,与之相应的CPLD是复杂可编程逻辑器件(ComplexProgrammableLogicDevice)的简称,两者的功能基本相同,只是实现原理略有不同,所以有时可以忽略这两者的区别,统称为可编程逻辑器件或CPLD/PGFA。
CPLD/PGFA几乎能完成任何数字器件的功能,上至高性能CPU,下至简单的74电路。
它如同一张白纸或是一堆积木,工程师可以通过传统的原理图输入或硬件描述语言自由的设计一个数字系统。
通过软件仿真可以事先验证设计的正确性,在PCB完成以后,利用CPLD/FPGA的在线修改功能,随时修改设计而不必改动硬件电路。
使用CPLA/FPGA开发数字电路,可以大大缩短设计时间,减少PCB面积,提高系统的可靠性。
这些优点使得CPLA/FPGA技术在20世纪90年代以后得到飞速的发展,同时也大大推动了EDA软件和硬件描述语言HDL的进步。
1.2FPGA的应用领域:
FPGA所具有的无限次可重复编程能力,灵活的体系结构,丰富的触发器及布线资源等一系列的特点使得它可以满足电子产品设计的多种需求。
FPGA的应用领域主要集中在替换通用逻辑和复杂逻辑、重复编程使用、板极设计集成、高速计数器、加减法器、累加器和比较器的实现、总线接口逻辑等方面。
应用和开发FPGA必须对器件的性能有一个全面了解,例如对器件的容量、速度、功耗,接口要求和引脚数目等进行综合考虑,同时还要注意以下几个细节问题:
●时序电路应用“上电”复位电路,保证开机加电后,置时序电路于初始状态;
●器件的电源与地引脚必须并接一只0.1μF的无感电容,起滤波和去耦作用;
●不能采用数目是偶数的反向器串联的方法构成“延时电路”,一则延时的时间不准确,二则自动编译时会作为冗余电路被简化掉;
●主要的全局缓冲器必须由半专用的焊盘驱动,次要的全局缓冲器可以来源于半专用的焊盘或内部网线;
●引脚之间严禁短路,忌用万用表直接测量器件引脚;
●器件的I/O口如被定义为输出端,忌对该端加信号,否则将损坏芯片;
●低功耗的器件如接负载过大时,不仅会使所用器件的工作效率显著降低,甚至会损伤芯片。
2.1实验原理:
数码管引脚为10个,其中上下两排引脚的中间一个为公共极,其余八个为显示控制引脚。
按照公共极有效电平的不同,分为共阳极和共阴极两种类型。
其中,公共极是指公共端(上下两排引脚的中间一个)接高电平,控制显示引脚接低时对应的段发光。
共阴极是指公共端接低电平,控制显示引脚接高时对应的段发光。
数码管的发光颜色常见有红色和绿色。
本开发平台采用的数码管为共阴极数码管。
该部分的原理图如下图所示,八个数码管用一个3-8译码器来选通当前显示的数码管。
首先需要将系统的50M时钟分频,产生10毫秒信号;其次,需要对10毫秒计数,每100次秒钟加1,秒钟满60,分钟加1,依次类推。
10毫秒个位和十位之间为十进制,秒钟、分钟、时钟的十位和个位之间也是10进制,但是秒钟和分钟之间,分钟和时钟之间都是60进制,在显示部分,需要实现10进制数据的显示,要设计译码电路;最后,由于8个数码管3-8译码器控制,需要对数码管扫描显示,因此,还要有扫描电路。
要注意的是,扫描的速度不能太快也不能太慢,否则将会看到闪烁,一般将扫描速度设为us级别。
综上所述,时钟设计框图如图所示:
3.1VHDL源代码:
libraryieee;
useieee.std_logic_1164.all;
useieee_std_logic_unsigned.all;
entityclockis
Port(clk:
inSTD_LOGIC;
SMG_CS:
outSTD_LOGIC;
SMG_D:
outSTD_LOGIC_VECTOR(7downto0);
SMG_SEL:
outSTD_LOGIC_VECTOR(1to3));
endclock;
architectureBehavioralofclockis
signalsel:
std_logic_vector(2downto0);
signalclk1,clk2:
std_logic;
signala0,a1,a2,a3,a4:
std_logic_vector(3downto0);
signala5:
std_logic_vector(3downto0):
"1001";
signala6:
std_logic_vector(3downto0):
"0101";
signala7:
std_logic_vector(3downto0):
"0011";
signala8:
std_logic_vector(3downto0):
"0010";
signaldisp:
std_logic_vector(3downto0);
signalsmg_sl:
std_logic_vector(3downto1);
begin
SMG_CS<='1';
process(clk)
variablecnt:
integerrange0to50000;
begin
ifclk'eventandclk='1'thencnt:
=cnt+1;
ifcnt<25000thenclk1<='0';
elsifcnt<50000thenclk1<='1';
elsecnt:
=0;clk1<='0';
endif;
endif;
endprocess;
process(clk1)
begin
ifclk'eventandclk='1'then
ifa0<9then
a0<=a0+1;
elsifa1<9then
a1<=a1+1;
a0<="0000";
elsifa2<9then
a2<=a2+1;
a0<="0000";
a1<="0000";
elsifa3<9then
a3<=a3+1;
a0<="0000";
a1<="0000";
a2<="0000";
elsifa4<5then
a4<=a4+1;
a0<="0000";
a1<="0000";
a2<="0000";
a3<="0000";
elsifa5<9then
a5<=a5+1;
a0<="0000";
a1<="0000";
a2<="0000";
a3<="0000";
a4<="0000";
elsifa6<5then
a6<=a6+1;
a0<="0000";
a1<="0000";
a2<="0000";
a3<="0000";
a4<="0000";
a5<="0000";
elsifa7<3then
a7<=a7+1;
a0<="0000";
a1<="0000";
a2<="0000";
a3<="0000";
a4<="0000";
a5<="0000";
a6<="0000";
elsifa8<2then
a8<=a8+1;
a0<="0000";
a1<="0000";
a2<="0000";
a3<="0000";
a4<="0000";
a5<="0000";
a6<="0000";
a7<="0000";
elsif
a0<="0000";
a1<="0000";
a2<="0000";
a3<="0000";
a4<="0000";
a5<="0000";
a6<="0000";
a7<="0000";
a8<="0000";
endif;
endif;
endprocess;
process(clk)
variablecnt:
integerrange0to25000;
begin
ifclk'eventandclk='1'thencnt:
=cnt+1;
ifcnt1<12500thenclk2<='0';
elsifcnt1<50000thenclk2<='1';
elsecnt1:
=0;clk2<='0';
endif;
endif;
endprocess;
process(clk2)
variablecnt:
integerrange0to50000;
begin
ifclk2’eventandclk2='1'then
sel<=sel+1;
caseselis
when"000"=>disp<=a1;smg_sl<="011";
when"001"=>disp<=a1;smg_sl<="010";
when"010"=>disp<=a1;smg_sl<="001";
when"011"=>disp<=a1;smg_sl<="000";
when"100"=>disp<=a1;smg_sl<="111";
when"101"=>disp<=a1;smg_sl<="110";
when"110"=>disp<=a1;smg_sl<="101";
when"111"=>disp<=a1;smg_sl<="100";
whenothers=>disp<="0000";
endcase;
endif;
endprocess;
SMG_SEL<=smg_sl;
process(disp)
begin
casedispis
when"0000"=>SMG_D<="00111111";
when"0001"=>SMG_D<="00000110";
when"0010"=>SMG_D<="01011011";
when"0011"=>SMG_D<="01001111";
when"0100"=>SMG_D<="01100110";
when"0101"=>SMG_D<="01101101";
when"0110"=>SMG_D<="01111101";
when"0111"=>SMG_D<="00000111";
when"1000"=>SMG_D<="01111111";
when"1001"=>SMG_D<="01101111";
whenothers=>SMG_D<="00000000";
endcase;
endprocess;
endBehavioral;
3.2引脚分配表如下:
名称
信号名
FPGA引脚
时钟
Clk
AA12
七段数码管片选
SMG_CS
A6
七段数码管位选
SMG_SEL<1>
C8
七段数码管位选
SMG_SEL<2>
B20
七段数码管位选
SMG_SEL<3>
A20
七段数码管输出
SMG_D<0>
C11
七段数码管输出
SMG_D<1>
E11
七段数码管输出
SMG_D<2>
E10
七段数码管输出
SMG_D<3>
C12
七段数码管输出
SMG_D<4>
E12
七段数码管输出
SMG_D<5>
E13
七段数码管输出
SMG_D<6>
F13
七段数码管输出
SMG_D<7>
D13
4.1实验步骤和结果:
实验步骤如下:
Ø新建一个工程;
Ø编辑HDL源代码;
Ø编译并仿真;
Ø仿真无误后,进行管脚分配,再运行,生成.bit文件;
Ø用下载电缆通过JTAG口将对应的.bit文件加载到FPGA中。
观察实验结果是否与自己的编程思想一致。
可以看到,8个共阴数码管开始显示计时时钟,其中8个数码管从低位到高位分别显示毫秒十位、毫秒百位、秒个位、秒十位、分钟个位、分钟十位、时钟个位、时钟十位。
需要注意的是,为了验证程序进位是否正确而又不会让学生等待太久,可以设置初始值为23:
59:
50。
只需等待10秒钟即可。
4.2仿真波形:
5.1实验心得:
我们此次设计与制作时钟是为了了解数码管驱动的原理,从而学会制作时钟。
而且通过时钟的制作进一步的了解各种在制作中用到的数码管的作用及实用方法。
通过本次课程设计,我们可以进一步学习和掌握各种电路的原理与使用方法。
通过课程设计,使我加巩固和加深对电子电路基本知识的理解,学会方案设计,方案实施,进一步提高我综合运用所学知识的能力,提高分析解决实际问题的能力。
锻炼分析、解决电子电路问题的实际本领,通过此综合训练,不仅学会了实验技术,掌握了实验方法即用实验检验理论的方法等。
在FPGA实验中,提高了通过学会理解实验原理,熟练实验操作方法,实验数据处理方法的能力。
我在老师的启发引导下,通过解决问题,获取知识,掌握实验思想和实验方法的实质,从而培养实验能力,在FPGA实验中使我受益非浅。
同时,通过和伙伴的同心协力,使我深刻认识到团队合作的快乐·重要与力量,也使我们提高了实验实践能力,和加深了对FPGA的认识!