1、基于fpga的数字钟的设计大学毕业设计论文1 设计的要求 本次设计主要是研究基于FPGA的数字钟,要求是以24小时为周期,显示时、分、秒。采用1HZ的基准脉冲信号产生1S的基准时间,当计数达到60次时,输出1个分钟(min)脉冲;当1min的时钟计数到达60次时,输出1个小时(h)脉冲;若1h的时钟计数达到23次时,并且1min的计数到59次、1s的计数也达到59次,再来1个1s的脉冲,数字钟就自己复位,重新从零开始计时。为了保证计时的稳定及准确须由晶体振荡器提供时间基准信号。 该系统是基于FPGA的设计,采用VHDL进行系统功能的描述,采用自顶向下的设计方法,用QUARTUS II软件进行仿
2、真。2 设计的基本原理振荡器产生稳定的高频脉冲信号,作为数字钟的时间基准,然后经过分频器输出标准秒脉冲。秒计数器满59后向分计数器进位,分计数器满59后向小时计数器进位,小时计数器按照“24翻0”规律计数。计满后各计数器清零,重新计数。一般说来,一个比较大的完整的项目应该采用层次化的描述方法:分为几个较大的模块,定义好各功能模块之间的接口,然后各个模块再细分去具体实现,这就是TOP DOWN(自顶向下)的设计方法。目前这种高层次的设计方法已被广泛采用。高层次设计只是定义系统的行为特征,可以不涉及实现工艺,因此还可以在厂家综合库的支持下,利用综合优化工具将高层次描述转换成针对某种工艺优化的网络表
3、,使工艺转化变得轻而易举。CPLD/FPGA系统设计的工作流程如图1所示。 图1 FPGA系统设计流程流程说明:1.工程按照“自顶向下”的设计方法进行系统划分。2.输入VHDL代码,这是设计中最为普遍的输入方式。此外,还可以采用图形输入方式(框图、状态图等),这种输入方式具有直观、容易理解的优点。3.将以上的设计输入编译成标准的VHDL文件。4.进行代码级的功能仿真,主要是检验系统功能设计的正确性。这一步骤适用于大型设计,因为对于大型设计来说,在综合前对源代码仿真,就可以大大减少设计重复的次数和时间。一般情况下,这一仿真步骤可略去。5.利用综合器对VHDL源代码进行综合优化处理,生成门级描述的
4、网络表文件,这是将高层次描述转化为硬件电路的关键步骤。综合优化是针对ASIC芯片供应商的某一产品系列进行的,所以综合的过程要在相应的厂家综合库的支持下才能完成。6.利用产生的网络表文件进行适配前的时序仿真,仿真过程不涉及具体器件的硬件特性,是较为粗略的。一般的设计,也可略去这一步骤。7.利用适配器将综合后的网络表文件针对某一具体的目标器件进行逻辑映射操作,包括底层器件配置、逻辑分割、逻辑优化和布局布线。8.在适配完成后,产生多项设计结果:(a)适配报告,包括芯片内部资源利用情况,设计的布尔方程描述情况等;(b)适配后的仿真模型;(c)器件编程文件。根据适配后的仿真模型,可以进行适配后时序仿真,
5、因为已经得到器件的实际硬件特性(如时延特性),所以仿真结果能比较精确的预期未来芯片的实际性能。如果仿真结果达不到设计要求,就修改VHDL源代码或选择不同速度和品质的器件,直至满足设计要求。最后将适配器产生的器件编程文件通过编程器或下载电缆载入到目标芯片CPLD/FPGA中。3 设计方案3.1 设计思路 本次设计采用分模块设计的方法,再用一个顶层文件将各模块联系起来,如下图2所示。图2 数字钟模块图3.2 各模块的模块图与功能分频器模块 晶体振荡器是构成数字式时钟的核心,振荡器的稳定度及频率的精度决定了数字钟计时的准确程度,它保证了时钟的走时准确及稳定。 石英晶体的选频特性非常好,只有某一频率点
6、的信号可以通过它,其它频率段的信号均会被它所衰减,而且,振荡信号的频率与振荡电路中的R、C元件的数值无关。因此,这种振荡电路输出的是准确度极高的信号。然后再利用分频电路,将其输出信号转变为秒信号,其组成框图如下图3所示。图3 秒信号产生框图 本系统使用的晶体振荡器电路给数字钟提供一个频率稳定准确的12MHz的方波信号,其输出至分频电路。分频电路的逻辑框图如下图4所示。 图4 分频电路逻辑框图六进制计数模块 对秒和分的十位进行计数,计数满六便变为0,产生进位。 六进制计数器的逻辑框图如下图5所示。图5六进制计数器逻辑框图十进制计数器模块对秒和分的个位进行计数,计满10便变为0,并产生进位。十进制
7、计数器逻辑框图如下图6所示。 图6 十进制计数器逻辑框图二十四进制计数器模块 对时进行计数,计满24便变为0。 二十四进制计数器逻辑框图如下图7所示。 图7 二十四进制计数器逻辑框图译码器模块将时、分、秒个位的输出译为七段输出。译码器的逻辑框图如下图8所示。 图8 译码器逻辑框图顶层文件模块 将各模块连接起来,实现整个时钟功能。 顶层文件的逻辑框图如下图9所示。 图9 顶层文件逻辑框图LED七段共阴极数码管显示模块 常见的数码管由七个条状和一个点状发光二极管管芯组成,共阴极LED是指笔画显示器各段发光管的阴极是公共的,而阳极是相互隔离的。LED数码管模块如下图10所示。 图10 LED数码管模
8、块图4 各模块的仿真4.1 分频器模块仿真图图11 分频器模块仿真图4.2 六进制计数器模块仿真图图12 六进制计数器模块仿真图4.3 十进制计数器模块仿真图图13 十进制计数器模块仿真图4.4 二十四进制计数器模块仿真图图14 二十四进制计数器模块仿真图4.5 译码器模块仿真图图15 译码器模块仿真图4.6 顶层文件模块仿真图图16 顶层文件模块仿真图4.7 LED七段共阴极数码管显示模块仿真图 图17 数字钟准备状态仿真图 图18 数字钟运行状态仿真图 5 结论与感悟 本次设计实验经过各模块和整体程序的仿真运行,达到了设计的要求。运行数字时钟,首先对1s的时钟进行计数,当计数达到60次时,
9、输出1个分钟(min)脉冲;当1min的时钟计数到达60次时,输出1个小时(h)脉冲;若1h的时钟计数达到23次时,并且1min的计数到59次、1s的计数也达到59次,再来1个1s的脉冲,数字钟就自己复位,重新从零开始计时。 在此次设计中,运用了自顶向下的模块化设计,使程序清晰易懂。虽然程序在设计师具备一定的优点,但是也有着一定的不足,比方说延时问题,这使得数字钟在实际运行时并不十分准确。所以设计并不完美,还需要一定的改善。 此次课程设计查阅了很多与FPGA,VHDL语言等有关的资料,极大的提高了自己的查询与阅读能力,为以后的毕业设计打下一定的基础。在此次的数字钟设计过程中,我更进一步地熟悉有
10、关数字电路的知识和具体应用。学会了利用QuarterII软件进行原理图的绘制,硬件描述语言VHDL的编写,程序的仿真等工作。并能根据仿真结果分析设计的存在的问题和缺陷,从而进行程序的调试和完善,使自己的设计达到要求。在此感谢指导老师对我的问题一一解答,使我的课程设计能够顺利的完成。 本次课程设计圆满完成。参考文献:【1】 刘爱荣,王振成.EDA技术与CPLD/FPGA开发应用简明教程.清华大学出版社.【2】 陈忠平,高金定,高见芳.基于Quuartus的FPGA/CPLD设计与实践.电子工业出版社.【3】 刘君,常明,秦娟.基于硬件描述语言(VHDL)的数字时钟设计.天津理工大学报.【4】 王
11、开军,姜宇柏.面向CPLD/FPGA的VHDL设计.机械工业出版社.【5】 杨军,蔡光卉,黄倩,陈成基于FPGA的数字系统设计与实践.电子工业出版社.附:各模块程序分频器程序: LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY DIV ISPORT(CLK,RESET: IN STD_LOGIC; F: OUT STD_LOGIC);END DIV;ARCHITECTURE ART OF DIV ISSIGNAL Q: INTEGER RANGE 0 TO 10; BEGIN PROC
12、ESS(CLK) BEGIN IF(CLKEVENT AND CLK=1) THEN IF(RESET=0) THEN Q=0; ELSIF Q=4 THEN F=1; Q=Q+1; ELSIF Q=9 THEN F=0; Q=0; ELSE F=0; Q=Q+1; END IF; END IF; END PROCESS; END ART;六进制计数器程序:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY COUNTER6 IS
13、 PORT ( CLK : IN STD_LOGIC; RESET : IN STD_LOGIC; DIN : IN STD_LOGIC_VECTOR(2 DOWNTO 0); DOUT : OUT STD_LOGIC_VECTOR(2 DOWNTO 0); C :OUT STD_LOGIC);END COUNTER6;ARCHITECTURE BEHAVIORAL OF COUNTER6 ISSIGNAL COUNT : STD_LOGIC_VECTOR(2 DOWNTO 0);BEGIN DOUT = COUNT; PROCESS(CLK,RESET,DIN) BEGIN IF RESET
14、= 0 THEN COUNT = DIN; C=0; ELSIF RISING_EDGE(CLK) THEN IF COUNT=101 THEN COUNT=000; C=1; ELSE COUNT=COUNT+1; C=0; END IF; END IF; END PROCESS;END BEHAVIORAL;十进制计数器程序:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY COUNTER10 IS PORT ( CLK :
15、 IN STD_LOGIC; RESET : IN STD_LOGIC; DIN : IN STD_LOGIC_VECTOR(3 DOWNTO 0); DOUT : OUT STD_LOGIC_VECTOR(3 DOWNTO 0); C : OUT STD_LOGIC);END COUNTER10;ARCHITECTURE BEHAVIORAL OF COUNTER10 IS SIGNAL COUNT : STD_LOGIC_VECTOR(3 DOWNTO 0);BEGIN DOUT = COUNT; PROCESS(CLK,RESET,DIN) BEGIN IF RESET=0THEN CO
16、UNT = DIN ; C=0; ELSIF RISING_EDGE(CLK) THEN IF COUNT = 1001 THEN COUNT = 0000; C=1; ELSE COUNT = COUNT+1; C=0; END IF; END IF; END PROCESS;END BEHAVIORAL;二十四进制计数器程序:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY COUNTER24 IS PORT ( CLK :
17、 IN STD_LOGIC; RESET : IN STD_LOGIC; DIN : IN STD_LOGIC_VECTOR(5 DOWNTO 0); DOUTL : OUT STD_LOGIC_VECTOR(3 DOWNTO 0); DOUTH :OUT STD_LOGIC_VECTOR(1 DOWNTO 0);END COUNTER24;ARCHITECTURE BEHAVIORAL OF COUNTER24 ISSIGNAL COUNT1 : STD_LOGIC_VECTOR(3 DOWNTO 0);SIGNAL COUNT2 : STD_LOGIC_VECTOR(1 DOWNTO 0)
18、;BEGIN DOUTL = COUNT1; DOUTH = COUNT2; PROCESS(CLK,RESET,DIN) BEGIN IF RESET= 0 THEN COUNT1 = DIN(3 DOWNTO 0); COUNT2 = DIN(5 DOWNTO 4); ELSIF CLKEVENT AND CLK=1 THEN IF COUNT1=1001 THEN COUNT1=0000; COUNT2=COUNT2 +1; ELSE COUNT1=COUNT1 +1; END IF; IF COUNT2=10 THEN IF COUNT1=0011 THEN COUNT1=0000;
19、COUNT2 DOUT DOUT DOUT DOUT DOUT DOUT DOUT DOUT DOUT DOUT DOUT=1111111;END CASE;END PROCESS;顶层文件程序:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY CLOCK IS PORT ( CLK : IN STD_LOGIC; -1HZ RESET : IN STD_LOGIC; -复位信号 DINS : IN STD_LOGIC_VECT
20、OR(6 DOWNTO 0);-秒钟预置 DINM : IN STD_LOGIC_VECTOR(6 DOWNTO 0);-分钟预置 DINH : IN STD_LOGIC_VECTOR(5 DOWNTO 0);-时钟预置SECONDL: OUT STD_LOGIC_VECTOR(6 DOWNTO 0);-秒钟低位输出SECONDH: OUT STD_LOGIC_VECTOR(6 DOWNTO 0); -秒钟高位输出MINUTEL: OUT STD_LOGIC_VECTOR(6 DOWNTO 0); -分钟低位输出MINUTEH: OUT STD_LOGIC_VECTOR(6 DOWNTO 0)
21、; -分钟高位输出HOURL: OUT STD_LOGIC_VECTOR(6 DOWNTO 0); -小时低位输出HOURH: OUT STD_LOGIC_VECTOR(6 DOWNTO 0); -小时高位输出END CLOCK;ARCHITECTURE BEHAVIORAL OF CLOCK IS COMPONENT DIV IS PORT(CLK,RESET :IN STD_LOGIC; F : OUT STD_LOGIC); END COMPONENT; COMPONENT COUNTER10 IS PORT ( CLK : IN STD_LOGIC; RESET : IN STD_LO
22、GIC; DIN : IN STD_LOGIC_VECTOR(3 DOWNTO 0); DOUT : OUT STD_LOGIC_VECTOR(3 DOWNTO 0); C: OUT STD_LOGIC);END COMPONENT; COMPONENT COUNTER6 IS PORT ( CLK : IN STD_LOGIC; RESET : IN STD_LOGIC; DIN : IN STD_LOGIC_VECTOR(2 DOWNTO 0); DOUT : OUT STD_LOGIC_VECTOR(2 DOWNTO 0); C: OUT STD_LOGIC); END COMPONEN
23、T; COMPONENT COUNTER24 IS PORT ( CLK : IN STD_LOGIC; RESET : IN STD_LOGIC; DIN : IN STD_LOGIC_VECTOR(5 DOWNTO 0); DOUTL : OUT STD_LOGIC_VECTOR(3 DOWNTO 0); DOUTH : OUT STD_LOGIC_VECTOR(1 DOWNTO 0); END COMPONENT; COMPONENT DECODER IS PORT (DIN: IN STD_LOGIC_VECTOR(3 DOWNTO 0 ); DOUT: OUT STD_LOGIC_V
24、ECTOR(6 DOWNTO 0); END COMPONENT; SIGNAL CLK1HZ,C1,C2,C3,C4:STD_LOGIC; SIGNAL DOUTSL,DOUTML:STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL DOUTSH,DOUTMH:STD_LOGIC_VECTOR(2 DOWNTO 0); SIGNAL RDOUTL:STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL RDOUTSH,RDOUTMH:STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL RDOUTH:STD_LOGIC_VECTOR
25、(1 DOWNTO 0); SIGNAL RRDOUTH:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGIN RDOUTSH = 0&DOUTSH; -将秒钟高位数据变为4位,再进行译码 RDOUTMH = 0&DOUTMH; -将分钟高位数据变为4位,再进行译码 RRDOUTH CLK,RESET=RESET,F=CLK1HZ);U1:COUNTER10 PORT MAP(CLK=CLK1HZ,RESET=RESET,DIN=DINS (3 DOWNTO 0),DOUT=DOUTSL,C=C1); U2: COUNTER6 PORT MAP( CLK=C1,RESET=RE
26、SET,DIN=DINS(6 DOWNTO 4),DOUT=DOUTSH,C=C2); U3: COUNTER10 PORT MAP( CLK=C2,RESET=RESET,DIN=DINM(3 DOWNTO 0),DOUT=DOUTML,C=C3); U4: COUNTER6 PORT MAP( CLK=C3,RESET=RESET,DIN=DINM(6 DOWNTO 4),DOUT=DOUTMH, C=C4);U5: COUNTER24 PORT MAP( CLK=C4,RESET=RESET,DIN=DINH,DOUTL=RDOUTL,DOUTH=RDOUTH); U6: DECODER
27、 PORT MAP( DIN = DOUTSL,DOUT = SECONDL); U7: DECODER PORT MAP( DIN = RDOUTSH,DOUT = SECONDH); U8: DECODER PORT MAP( DIN = DOUTML,DOUT = MINUTEL); U9: DECODER PORT MAP( DIN = RDOUTMH,DOUT = MINUTEH); U10: DECODER PORT MAP( DIN = RDOUTL(3 DOWNTO 0),DOUT = HOURL);U11: DECODER PORT MAP( DIN = RRDOUTH(3 DOWNTO 0),DOUT = HOURH);END BEHAVIORAL;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1