电子时钟.docx
《电子时钟.docx》由会员分享,可在线阅读,更多相关《电子时钟.docx(17页珍藏版)》请在冰豆网上搜索。
电子时钟
基于FPGA的电子时钟VHDL程序与仿真
一·设计要求
1·【摘要】
随着电子技术的飞速发展,现代电子产品渗透到了社会的各个领域,并有力地推动着社会生产力的发展和社会信息化程度的提高。
在现代电子技术中,可编程器无疑是扮演着重要角色。
现场可编程门阵列(FPGA)是近年来迅速发展起来的新型可编程器,其灵活的可编程逻辑可以方便的实现高速数字信号处理。
它突破了并行处理、流水级数的限制,具有反复的可编程能力,从而有效的地利用了片上资源,加上高效的硬件描述语言VHDL,从而为数字系统设计提供了极大的方便。
本文较系统地介绍了FPGA的基本结构、基本原理、功能特点及其应用;阐述了数字系统设计的基本思想及设计流程,同时,也概述了FPGA在数字系统设计中的作用,基于FPGA的数字系统设计方法和流程;简要介绍了VHDL语言的发展历程,VHDL语言的功能特点等。
本文的主要工作是根据上述原理和方法设计一个电子钟系统,目的在于通过该系统的功能,体现出FPGA在数据处理中的应用。
该电子钟系统功能齐全,设计思路清晰。
系统程序基于VHDL语言,采用模块化设计方法。
系统设计包含9个子程序模块,每个子程序均经过EDA工具仿真,并附有仿真图,最后将各模块组装为一个整体——电子钟。
2·FPGA的基本工作原理:
FPGA(现场可编程门阵列)是专用集成电路(ASIC)中集成度最高的一种,用户可对FPGA内部的逻辑模块和I/O模块重新配置,以实现用户的逻辑,因而也被用于对CPU的模拟。
用户对FPGA的编程数据放在Flash芯片中,通过上电加载到FPGA中,对其进行初始化。
也可在线对其编程,实现系统在线重构,这一特性可以构建一个根据计算任务不同而实时定制的CPU,这是当今研究的热门领域。
3·基本要求
(1)有时、分、秒计数显示功能,小时为24进制,分钟和秒为60进制。
(2)以根据需要设置复位、清零、置位等功能。
(3)系统设计方案概述及工作原理
根据系统设计要求,系统设计采用自顶向下设计方法,由时钟分频模块、计时模块、按键模块和显示模块四个部分组成。
a.首先按下复位开关rest进行复位清零操作,电子钟从新计时开始。
sethr10、sethr可以调整时种,setmin10、setmin可以调整分钟,步进为1。
b.由于电子钟的最小计时单位是1s,因此提供给系统的内部的时钟频率应该大于1Hz,这里取100Hz。
CLK端连接外部10Hz的时钟输入信号clk。
对clk进行计数,当clk=10时,秒加1,当秒加到60时,分加1;当分加到60时,时加1;当时加到24时,全部清0,从新计时。
c.用6位数码管分别显示“时”、“分”、“秒”,通过输出线segment(6DOWNTO0)上的信号来点亮指定的LED七段显示数码管;为了节省资源,采用动态显示,choose(5Downto0)以100Hz的频率使6个LED七段显示数码管按次序依次点亮,由于频率很高,因此可以得到一个无闪烁的,稳定的时间显示输出。
二·设计思路
1.10进制计数器设计与仿真
(1)10进制计数器VHDL程序
--文件名:
counter10.vhd。
--功能:
10进制计数器,有进位C
--最后修改日期:
2004.3.20
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
entitycounter10is
Port(clk:
instd_logic;
reset:
instd_logic;
din:
instd_logic_vector(3downto0);
dout:
outstd_logic_vector(3downto0);
c:
outstd_logic);
endcounter10;
architectureBehavioralofcounter10is
signalcount:
std_logic_vector(3downto0);
begin
dout<=count;
process(clk,reset,din)
begin
ifreset='0'then
count<=din;
c<='0';
elsifrising_edge(clk)then
ifcount="1001"then
count<="0000";
c<='1';
else
count<=count+1;
c<='0';
endif;
endif;
endprocess;
endBehavioral;
counter10产生RTL图:
(2)10进制计数器仿真
2.6进制计数器设计与仿真
(1)6进制计数器VHDL程序
--文件名:
counter6.vhd。
--功能:
6进制计数器,有进位C
--最后修改日期:
2004.3.20
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
entitycounter6is
Port(clk:
instd_logic;
reset:
instd_logic;
din:
instd_logic_vector(2downto0);
dout:
outstd_logic_vector(2downto0);
c:
outstd_logic);
endcounter6;
architectureBehavioralofcounter6is
signalcount:
std_logic_vector(2downto0);
begin
dout<=count;
process(clk,reset,din)
begin
ifreset='0'then
count<=din;
c<='0';
elsifrising_edge(clk)then
ifcount="101"then
count<="000";
c<='1';
else
count<=count+1;
c<='0';
endif;
endif;
endprocess;
endBehavioral;
counter6的RTL图:
(2)6进制计数器仿真
3.6进制计数器设计与仿真
(1)24进制计数器VHDL程序
--文件名:
counter24.vhd。
--功能:
24进制计数器。
--最后修改日期:
2004.3.20
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
entitycounter24is
Port(clk:
instd_logic;
reset:
instd_logic;
din:
instd_logic_vector(5downto0);
dout:
outstd_logic_vector(5downto0));
endcounter24;
architectureBehavioralofcounter24is
signalcount:
std_logic_vector(5downto0);
begin
dout<=count;
process(clk,reset,din)
begin
ifreset='0'then
count<=din;
elsifrising_edge(clk)then
ifcount(3downto0)="1001"then
count(3downto0)<="0000";
count(5downto4)<=count(5downto4)+1;
else
count(3downto0)<=count(3downto0)+1;
endif;
ifcount="100011"then
count<="000000";
endif;
endif;
endprocess;
endBehavioral;
(2)24进制计数器仿真
4.译码器设计
(1)译码器VHDL程序
--文件名:
decoder.vhd。
--功能:
将4bit二进制数译码,在LED上显示相应数字。
--最后修改日期:
2004.3.20
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
entitydecoderis
Port(din:
instd_logic_vector(3downto0);--四位二进制码输入
dout:
outstd_logic_vector(6downto0));--输出LED七段码
enddecoder;
architectureBehavioralofdecoderis
begin
process(din)
begin
casedinis
when"0000"=>dout<="0000001";--0
when"0001"=>dout<="1001111";--1
when"0010"=>dout<="0010010";--2
when"0011"=>dout<="0000110";--3
when"0100"=>dout<="1001100";--4
when"0101"=>dout<="0100100";--5
when"0110"=>dout<="0100000";--6
when"0111"=>dout<="0001111";--7
when"1000"=>dout<="0000000";--8
when"1001"=>dout<="0000100";--9
whenothers=>dout<="1111111";
endcase;
endprocess;
endBehavioral;
decoder的RTL图:
三·系统整体方案设计
1·顶层设计与仿真
(1)顶层设计VHDL程序
--文件名:
clock.vhd。
--功能:
时钟的顶层设计。
--最后修改日期:
2004.3.20
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
entityclockis
Port(clk:
instd_logic;--1Hz
reset:
instd_logic;--复位信号
dins:
instd_logic_vector(6downto0);--秒钟预置
dinm:
instd_logic_vector(6downto0);--分钟预置
dinh:
instd_logic_vector(5downto0);--时钟预置
secondl:
outstd_logic_vector(6downto0);--秒钟低位输出
secondh:
outstd_logic_vector(6downto0);--秒钟高位输出
minutel:
outstd_logic_vector(6downto0);--分钟低位输出
minuteh:
outstd_logic_vector(6downto0);--分钟高位输出
hourl:
outstd_logic_vector(6downto0);--小时低位输出
hourh:
outstd_logic_vector(6downto0));--小时高位输出
endclock;
architectureBehavioralofclockis
componentcounter10is
Port(clk:
instd_logic;
reset:
instd_logic;
din:
instd_logic_vector(3downto0);
dout:
outstd_logic_vector(3downto0);
c:
outstd_logic);
endcomponent;
componentcounter6is
Port(clk:
instd_logic;
reset:
instd_logic;
din:
instd_logic_vector(2downto0);
dout:
outstd_logic_vector(2downto0);
c:
outstd_logic);
endcomponent;
componentcounter24is
Port(clk:
instd_logic;
reset:
instd_logic;
din:
instd_logic_vector(5downto0);
dout:
outstd_logic_vector(5downto0));
endcomponent;
componentdecoderis
Port(din:
instd_logic_vector(3downto0);
dout:
outstd_logic_vector(6downto0));
endcomponent;
signalc1,c2,c3,c4:
std_logic;
signaldoutsl,doutml:
std_logic_vector(3downto0);
signaldoutsh,doutmh:
std_logic_vector(2downto0);
signaldouth:
std_logic_vector(5downto0);
signalrdoutsh,rdoutmh:
std_logic_vector(3downto0);
signalrdouth:
std_logic_vector(7downto0);
begin
rdoutsh<='0'&doutsh;--将秒钟高位数据变为4位,再进行译码
rdoutmh<='0'&doutmh;--将分钟高位数据变为4位,再进行译码
rdouth<="00"&douth;--将时钟高位数据变为4位,再进行译码
u1:
counter10portmap(clk=>clk,reset=>reset,
din=>dins(3downto0),
dout=>doutsl,
c=>c1);
u2:
counter6portmap(clk=>c1,reset=>reset,
din=>dins(6downto4),
dout=>doutsh,
c=>c2);
u3:
counter10portmap(clk=>c2,reset=>reset,
din=>dinm(3downto0),
dout=>doutml,
c=>c3);
u4:
counter6portmap(clk=>c3,reset=>reset,
din=>dinm(6downto4),
dout=>doutmh,
c=>c4);
u5:
counter24portmap(clk=>c4,reset=>reset,
din=>dinh,
dout=>douth);
u6:
decoderportmap(din=>doutsl,dout=>secondl);--秒的低位
u7:
decoderportmap(din=>rdoutsh,dout=>secondh);--秒的高位
u8:
decoderportmap(din=>doutml,dout=>minutel);--分的低位
u9:
decoderportmap(din=>rdoutmh,dout=>minuteh);--分的高位
u10:
decoderportmap(din=>rdouth(3downto0),dout=>hourh);--时的低位
u11:
decoderportmap(din=>rdouth(7downto4),dout=>hourl);--时的高位
endBehavioral;
顶层RTL图:
(2)顶层设计仿真
四·总结及分析
1·模块分析:
对于电子钟的设计,这里将采用自顶向下的设计方法进行设计,因此首先需要进行电子钟的顶层设计。
本节将首先介绍电子钟的系统结构和模块划分,然后设计出顶层VHDL设计程序。
根据电子钟的设计要求、工作原理和设计方案,这里不难给出设计系统机构框图如下所示。
给出系统的结构框图后,接下来的工作就是进行电子钟系统的模块划分以及确定这些模块之间的连接关系。
2·参考文献:
[1] 罗朝霞 高书莉编著 CPLD/FPGA及应用 编著人民邮电出版社2007,
[2] (美)普林斯顿大学WayneWolf著闫敬文等译FPGA-BasedSystemDesign(基于FPGA的系统设计) 机械工业出版社2006年5月版
[3] 辛春艳编著 VHDL硬件描述语言 国防工业出版社2005
[4] 林明权等编著,马维旻改编VHDL数字控制系统设计范例 电子工业出版社2003
[5] 黄任 编著VHDL入门、解惑、经典实例、经验总结 北京航空航天大学出版社2005
3·对FPGA课程的认识及总结
传统的开发方式:
一半固定,硬件CPU是不可编程的,另一半灵活是可编程的软件
FPGA新开发形式:
两个部分都是可编程了,FPGA,它代表的就是硬件的编程。
这两部分都可编程的一个结合点就是FPGA上的软核。
另外可以根据需要通过外部单片机把合适的应用bit流写入到FPGA内,从而完成根据功能需要变更硬件。
硬件可重构!
使计算机的能力越来越强,方法一:
通过提高工艺来提高工作频率;方法二:
通过优化系统体系,并行!
新学习思想:
FPGA设计有点象围棋:
易学难精
带着问题学习是最有效率的
时序性能的调整提高是FPGA开发能力的标志
多看书,但要注意,书当做字典,不是所有地方都去看。
目前,在FPGA上有三种类型开发方法和应用方向:
a、逻辑类应用b、软核类应用c、DSP类应用。
逻辑类应用我们接触的最早,也是FPGA最初的应用领域,大的应用上,一些数字IC设计可以在FPGA做前期的功能验证,在通信领域,FPGA做信号的编解码等等,小的应用上我们做的最多的实际是CPLD,完成信号的变换控制等等。
软核应用是前几年才兴起,现在热门的开发应用方法,在原本需要FPGA结合CPU的地方有成本和灵活性优势。
FPGA的DSP应用是非常有潜力的,性能优势非常明显。
开发方法是用Matlab的simulink中嵌入厂商的开发工具包,算法验证在Matlabsimulink工具下完成,在开发工具包的支持下生成HDL模块或者直接生成FPGA下载配置文件,这个方向是FPGA应用最有挑战能力领域。
Mathworks公司不久前也推出了独立于FPGA厂商的SimulinkHDLCoder工具,使的Matlab在数字系统设计领域迈出了坚实的一步,把Simulink模型和Stateflow框图生成位真(Bit-Ture)、周期精确(Cycle-Accurate)、可综合的Verilog和VHDL代码,为Matlabsimulink用户提供了通往FPGA设计实现的直接通道。
基于FPGA的电子时钟的设计
姓名:
张胜男
班级:
07级电信
(1)班
学号:
078319120
院系:
科文学院机电系