您好,欢迎来到爱玩科技网。
搜索
您的当前位置:首页基于FPGA的多功能电子万年历设计

基于FPGA的多功能电子万年历设计

来源:爱玩科技网
基于FPGA的多功能电子万年历

一、电子万年历简介............................................................................................................... 1 二、电子万年历的工作原理 ................................................................................................... 1 三、多功能电子万年历各功能模块实现 ............................................................................... 3

3.1时钟问题 ..................................................................................................................... 3 3.2电子万年历的控制系统 ............................................................................................. 5 3.3主控制模块 maincontrol .......................................................................................... 6 3.4时间及其设置模块 time_auto_and_set ................................................................... 7 3.3时间显示动态位选模块 time_disp_select ............................................................. 12 3.4显示模块 disp_data_mux....................................................................................... 13 3.5秒表模块 stopwatch ............................................................................................... 14 3.6日期显示与设置模块 date_main ........................................................................... 15 3.7闹钟模块alarmclock ............................................................................................... 17 3.8分频模块 fdiv .......................................................................................................... 18 四、附录................................................................................................................................. 20

附录一 电子万年历系统的Verilog HDL语言程序 ................................................. 20

一、电子万年历简介

钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能,诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、定时启闭路灯等。所有这些,都是以钟表数字化为基础的。因此,研究电子万年历及扩大其应用,有非常现实的意义。数字钟是一种用数字电路技术实现时、分、秒计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更长的使用寿命,因此得到了广泛的使用。电子万年历从原理上讲是一种典型的数字电路,其中包括了组合逻辑电路和时序电路。本次所设计的电子万年历能显示日期、星期、时间,具有闹钟功能。

二、电子万年历的工作原理

第 1 页 共 28 页

基于FPGA的多功能电子万年历

按键消抖 可 编 功能键 程 调整键1 逻 调整键2 辑 器 件 CPLD/FPGA LED 显示模块

 功能键用来选择不同的工作模式:

时间正常显示功能、时间调整与显示、秒表功能、闹钟设置与查看、日期显示、日期调整与设置。

 调整键1:主要用于闹钟设置、日期显示与调整、秒表、时间调整与设置中的位置选择按钮,与功能键配合使用。

 2号键功能模式,即时间调整与设置时,用作时、分、秒的移位,按一下,将会实现“时-分-秒”的依次移位,便于在特定位置进行调整;

 4号键功能模式,即闹钟设置与查看时,同样用作时、分、秒的移位,按一下,将会实现“时-分-秒”的依次移位,便于在特定位置进行调整;

 6号键功能模式,即日期调整与设置时,用作月、日的移位,按一下,将会实现“月-日”的依次移位,便于在特定位置进行调整。

第 2 页 共 28 页

基于FPGA的多功能电子万年历

 调整键2:主要用于闹钟设置、日期显示与调整、秒表、时间调整与设置中的调整按钮,与功能键配合使用。

 2号键功能模式,即时间调整与设置时,用作时、分、秒的调整,按一下,将会使得当前调整键1选择的位置数字增加1;  4号键功能模式,即闹钟设置与查看时,同样用作时、分、秒的调整,按一下,将会使得当前调整键1选择的位置数字增加1;

 6号键功能模式,即日期调整与设置时,用作月、日的移位,按一下,将会使得当前调整键1选择的位置数字增加1。

三、多功能电子万年历各功能模块实现

3.1时钟问题

无论是用离散逻辑、可编程逻辑,还是用全定制器件实现任何数字电路,设计不良的时钟在极限温度、电压或制造工艺存在偏差的情况下将导致系统错误的行为,所以可靠的时钟设计是非常关键的。在FPGA设计时通常采用四种时钟:全局时钟、门控时钟、多级逻辑时钟和波动式时钟,多时钟系统是这四种时钟类型的任意组合。 3.1.1全局时钟

对于一个设计项目来说,全局时钟(或同步时钟)是最简单和最可预测的时钟。在FPGA设计中最好的时钟方案是:由专用的全局时钟输入引脚驱动单个主时钟去控制设计项目中的每一个触发器。FPGA一般都具有专门的全局时钟引脚,在设计项目时应尽量采用全局时

第 3 页 共 28 页

基于FPGA的多功能电子万年历

钟,它能够提供器件中最短的时钟到输出的延时。 3.1.2门控时钟

在许多应用中,整个设计项目都采用外部的全局时钟是不可能或不实际的,所以通常用阵列时钟构成门控时钟。门控时钟常常同微处理器接口有关,例如用地址线去控制写脉冲。每当用组合逻辑来控制触发器时,通常都存在着门控时钟。在使用门控时钟时,应仔细分析时钟函数,以避免毛刺的影响。如果设计满足下述两个条件,则可以保证时钟信号不出现危险的毛刺,门控时钟就可以像全局时钟一样可靠工作:

 驱动时钟的逻辑必须只包含一个“与门”或一个“或门”,如果采用任何附加逻辑,就会在某些工作状态下出现由于逻辑竞争而产生的毛刺。

 逻辑门的一个输入作为实际的时钟,而该逻辑门的所有其他输入必须当成地址或控制线,它们遵守相对于时钟的建立和保持时间的约束。

3.1.3多级逻辑时钟

当产生门控时钟的组合逻辑超过一级,即超过单个的“与门”或“或门”时,该设计项目的可靠性将变得很差。在这种情况下,即使样机或仿真结果没有显示出静态险象,但实际上仍然可能存在危险,所以我们不应该用多级组合逻辑区作为触发器的时钟端。不同的系统 需要采用不同的方法消除多级时钟,并没有一个固定的模式。

第 4 页 共 28 页

基于FPGA的多功能电子万年历

3.1.4波动式时钟

许多系统要求在同一设计内采用多时钟,最常见的例子是两个异步微处理器之间的接口,或微处理器和异步通信通道的接口。由于两个时钟信号之间要求一定的建立和保持时间,所以上述应用引进了附加的定时约束条件,它们会要求将某些异步信号同步化。

而在许多应用中只将异步信号同步化还是不够的,当系统中有两个或两个以上非同源时钟时,数据的建立和保持时间很难得到保证,设计人员将面临复杂的时间分析问题。最好的方法是将所有非同源时钟同步化。使用FPGA内部的锁相环(PLL)是一个效果很好的方法,但并不是所有FPGA都带有PLL,而且带有PLL功能的芯片大多价格昂贵。这时就需要使用带使能端的D触发器,并引入一个高频时钟来实现信号的同步化。

稳定可靠的时钟是保证系统可靠工作的重要条件,设计中不能够将任何可能含有毛刺的输出作为时钟信号,并且尽可能只使用一个全局时钟,对多时钟系统要特别注意异步信号和非同源时钟的同步问题。

为了获得高驱动能、低抖动时延、稳定的占空比的时钟信号,一般使用FPGA内部的专用时钟资源产生同步时序电路的主工作时钟。专用时钟资源主要指两部分,一部分是布线资源,包括全局时钟布线资源和长线资源等,另一部分则是FPGA内部的PLL。

3.2电子万年历的控制系统

第 5 页 共 28 页

基于FPGA的多功能电子万年历

此电子万年历系统主要有8个模块分别设计仿真,分别是以下8个模块:

1. 主控制模块 maincontrol

2. 时间及其设置模块 timepiece_main 3. 时间显示动态位选模块 time_disp_select 4. 显示模块 disp_data_mux 5. 秒表模块 stopwatch

6. 日期显示与设置模块 date_main 7. 闹钟模块 alarmclock 8. 分频模块 fdiv

3.3主控制模块 maincontrol

该模块实现对各个功能模块的整体控制,包括对时间显示与调整、日期显示与调整、闹钟显示与调整、秒表操作等的控制,结构功能图如3-1所示,波形仿真图如3-2所示。

图3-1 主控制模块的结构功能图

第 6 页 共 28 页

基于FPGA的多功能电子万年历

图3-2 主控制模块的波形仿真图

SW3是功能键,从波形图中可知,SW3每出现一次上升沿,输出都会发生相应的变化,即按照Timepiece_EN(时钟自动显示使能),TimeSet_EN(时钟设置与调整使能),Stopwatch_EN(秒表功能使能),Alarmclock_EN(闹钟时间设置使能),Date_EN(日期显示使能),DateSet_EN(日期显示与设置使能)的顺序依次输出有效波形“1”,对相应的模块输入有效使能,从而实现相应的功能。

3.4时间及其设置模块 time_auto_and_set

时间及其设置模块主要完成时间的自动正常运行与显示,以及在相应的功能号下,实现时间的调整与设置。 3.2.1时间模块 timepiece_main

该模块主要完成时间的自动增加与显示功能,即为正常的自动模式运行,其结构功能图如3-3所示,波形仿真图如3-4所示。

图3-3 时间及其设置模块的结构功能图 图3-4 时间模块的结构功能图

第 7 页 共 28 页

基于FPGA的多功能电子万年历

 秒自动计时子模块 second_counter,结构功能图如3-5所示,

图3-5 秒自动计时子模块的结构功能图

 分自动计时子模块 minute_counter,结构功能图如3-6示。

图3-6 分自动计时子模块的结构功能图

 小时自动计时子模块 hour_counter,结构功能图如3-7所示。

图3-7小时自动计时子模块的结构功能图

图3-8 时间模块的波形仿真图

当Timepiece_EN为1时,即处于时间自动工作状态,即每出现一次时钟信号clk,计数一次,先计数second0,当计数到1001(即

第 8 页 共 28 页

基于FPGA的多功能电子万年历

十进制的9)时,向second1发出一个计数信号,此时second1进行一次计数,类推,second1计数到0101(即十进制的5),且second0计数到1001(即十进制的9)时,minute0则进行一次计数,按照此规律进行时间的计数。当计满24小时,向day_EN发出一个计数信号,即此使能端输出有效信号1,进行日期的计数。 3.2.2 时间设置模块 timeset

该模块主要完成对时间的设置相关的闪烁显示控制以及时间中的小时、分钟、秒等数据的改变,流程图如3-9所示,结构功能图如3-10所示,波形仿真图如3-11所示。

开 始 初始化,将当前时间赋予设置后的时间 Timeset_EN=1? disp_drive<3’b101? disp_drive<= disp_drive+3’b1 disp_drive<=3’b0 依SW2,按位进行数字调整

结 束 图 3-9 时间设置模块的流程图

第 9 页 共 28 页

基于FPGA的多功能电子万年历

图3-10 时间设置模块的结构功能图

图3-11 时间设置模块的波形仿真图 表3-12 时间设置模块的端口说明

输入端口 TimeSet_EN SW1,SW2 hour1,hour0 minute1,minute0 second0,second1 输出端口 hour_set1,hour_set0 minute_set1,minute_set0 second_set1,second_set0 disp_drive 功能 时间设置使能,当其电平为高时,时间设置有效 调整键1与调整键2输入信号 当前时间的小时数输入 当前时间的分钟数输入 当前时间的秒数输入 功能 设置时间后的小时数 设置时间后的分钟数 设置时间后的秒数 设置中的闪烁显示设置 当Timeset_EN为1时,即实现时间设置功能。SW1实现时间格式中小时高、低位,分钟高、低位,秒钟高、低位的位选,即每出现一个SW1上升沿,disp_drive的相应数值加1(选择具体的需要调整的位置)。SW2实现相应得位的数值得调整,即每出现一个SW2上升沿,相应位的数值增加1。

第 10 页 共 28 页

基于FPGA的多功能电子万年历

3.2.3时间数据与时间设置数据多路选择模块 time_mux

该模块用来分时向显示单元传输显示数据,流程图如3-13所示,结构功能图如3-14所示,波形仿真图如3-15所示。

图3-13 多路选择模块的结构功能图 开 始 依输入条件,判断是自动显示时间,或显示调整后的时间 Timeset_EN=1? 显示设置后的时间 显示自动模式时的时间 结 束 图 3 -14 多路选择模块的流程图

第 11 页 共 28 页

基于FPGA的多功能电子万年历

图3-15 多路选择模块的波形仿真图

输入端口 TimeSet_EN hour1,hour0 minute1,minute0 second0,second1 hour_set1,hour_set0 minute_set1,minute_set0 second_set1,second_set0 输入端口 hour_1,hour_0 minute_1,minute_0 second_0,second_1 功能 时间设置使能信号 自动模式中当前时间的小时数输入 自动模式中当前时间的分钟数输入 自动模式中当前时间的秒数输入 时间设置后的小时数输入 时间设置后的分钟数输入 时间设置后的秒数输入 功能 当前需要显示的小时输出 当前需要显示的分钟输出 当前需要显示的秒输出 表3-16 多路选择模块的端口说明 3.3时间显示动态位选模块 time_disp_select

该模块用来分时显示时间数据,但是在选择合适的时间间隔下,人眼并不能分辨出是分时显示的,这样显示的方式可以降低功耗,结构功能图如3-17所示,波形仿真图如3-18所示。

图3-17 时间显示动态位选模块的结构功能图

图3-18(a) 时间显示动态位选模块的波形仿真图

第 12 页 共 28 页

基于FPGA的多功能电子万年历

图3-18(b) 时间显示动态位选模块的波形仿真图

TimeSet_EN表示时间设置使能,Time_EN表示时间自动显示使能,clk_1kHz用于动态显示时间,clk_200Hz用于闪烁显示时间,timeset_disp_drive表示时间设置数据显示的同步信号,time_disp_select表示显示动态位选输出信号。当TimeSet_EN为0,Time_EN为1时,以clk_1kHz为是时钟信号,输出自动显示的时间,按位依次显示;当TimeSet_EN为1,Time_EN为0时,则以clk_200Hz为时钟信号,输出以timeset_disp_drive对应的位置。

3.4显示模块 disp_data_mux

模块是时间、日期等数据用数码管显示的控制与数据传输模块,包括数据的传输以及BCD码的译码等,结构功能图如3-19所示,波形仿真图如3-20所示。

图3-19 显示模块的结构功能图

第 13 页 共 28 页

基于FPGA的多功能电子万年历

图3-20 显示模块的波形仿真图

显示原理采用的是七段数码管的现实原理,如3-21所示:

图3-21 七段数码管的显示原理

3.5秒表模块 stopwatch

该模块实现秒表的功能,在实际中,可以通过改变自动工作模式下的时间的计数时钟的频率来实现秒表的功能,流程图如3-22所示,结构功能图如3-23所示,波形仿真图如3-24所示。

第 14 页 共 28 页

基于FPGA的多功能电子万年历

开 始 EN=1? 秒表工作状态 时间自动工作状态 结 束

图3-22 秒表模块的流程图

图3-23 秒表模块的结构功能图

图3-24 秒表功能的波形仿真图

EN表示秒表使能控制信号,clk1表示自动工作模式的时钟信号,clk2表示秒表工作模式的时钟信号,故当EN为有效信号1时,输出F_out与clk2同,即处于秒表工作状态,同理EN为0时,输出F_out与clk1同,即处于自动工作状态。

3.6日期显示与设置模块 date_main

该模块实现日期的显示和日期的调整与设置,结构功能图如3-25所示。

第 15 页 共 28 页

基于FPGA的多功能电子万年历

图3-25 时间显示与设置模块的结构功能图

3.6.1日期自动工作模块 autodate

该模块实现的是日期的自动工作功能,结构功能图如3-26所示,波形仿真图如3-27所示。

图3-26 日期自动工作模块的结构功能图

图3-27(a) 日期自动工作模块的波形仿真图

图3-27(b) 日期自动工作模块的波形仿真图

3.6.2日期设置模块 setdate

该模块用于日期,结构功能图如3-28所示。

第 16 页 共 28 页

基于FPGA的多功能电子万年历

图3-28 日期设置模块的结构功能图

3.7闹钟模块alarmclock

该模块实现的功能包括闹钟的设置以及闹钟时间到后的提示,流程图如3-29所示,结构功能图如3-30所示,波形仿真图如3-31所示。

开 始 设置的闹钟与当前时间比较 alarm<=1’b1 闹钟工作 alarm<=1’b0 闹钟不工作 根据不同的disp_drive选择在不同的位置上的数值加1 EN=1 disp_drive<3’b101? disp_drive<=3’b0 disp_drive<=disp_drive+3,b1 结 束

图 3-29 闹钟模块的流程图

第 17 页 共 28 页

基于FPGA的多功能电子万年历

图3-30 闹钟模块的结构功能图

图3-31 闹钟模块的波形仿真图

EN为闹钟设置使能,clk_200Hz用于设置中的闪烁显示的时钟,其中还定义了hour_set1,hour_set0,minute_set1,minute_set0,second_set1,second_set0,用来表示已经设置好的闹钟时间。闹钟一直处于工作状态,当前时间(hour1,hour0,minute1,minute0,second1,second0)与设置的闹钟时间相比较,当小时、分钟、秒钟的时间完全相同时,则闹铃响,输出信号alarm为有效信号1。SW1和SW2是调整键,分别控制位选和数值的调整。

3.8分频模块 fdiv

该模块完成全局时钟信号分频输出200Hz、60Hz、1Hz的三种时钟信号,流程图如3-32所示,结构功能图如3-33所示,波形仿真图如3-34所示。

第 18 页 共 28 页

基于FPGA的多功能电子万年历

开始,输入1kHz时钟信号 posedge clk CNT<4? 输出200Hz时钟信号f200Hz CNT=CNT+1 posedge f200Hz CNT2<2? posedge f200Hz CNT3<199? CNT2=CNT2+1 输出60Hz时钟信号 CNT3=CNT3+1 输出1Hz时钟信号 结 束

图3-32 分频模块的流程图

图3-33 分频模块的结构功能图

图3-34分频模块的波形仿真图

第 19 页 共 28 页

基于FPGA的多功能电子万年历

四、附录

附录一 电子万年历系统的Verilog HDL语言程序

4.1主控制模块

module

maincontrol(clk,SW3,Timepiece_EN,TimeSet_EN,Stopwatch_EN,Alarmclock_EN,Date_EN,DateSet_EN); output Timepiece_EN; //时间自动显示使能 output TimeSet_EN; output Stopwatch_EN; output Alarmclock_EN; output Date_EN; output DateSet_EN; input SW3; input clk;

reg Timepiece_EN; reg TimeSet_EN; reg Stopwatch_EN; reg Alarmclock_EN; reg Date_EN; reg DateSet_EN; reg [2:0] Function; reg [31:0] cnt; reg q1,q2,q3; reg CLK;

always@(posedge clk) begin

if(cnt<49999) begin cnt=cnt+1; CLK<=0; end else begin cnt=0; CLK<=1'b1; end end

always@(posedge CLK) begin begin q2<=q1; q1<=SW3;

//时间调整与设置使能 //秒钟功能使能 //闹钟时间设置使能 //时期显示使能 //日期调整与设置使能 //功能号选择 第 20 页 共 28 页

基于FPGA的多功能电子万年历

end begin

q3<=q1&(~q2); end end

always@(posedge q3 ) /*实现对时间显示与调整,日期显示与 调整,闹钟显示与调整,秒表操作等的控制*/ begin //功能号的产生以及其自动循环 if(Function<3'b101 && SW3==1'b1) Function<=Function+3'b1; else

Function<=3'b0;

case(Function) //各个分功能的控制和实现 //时钟自动显示 3'b000:begin

Timepiece_EN<=1'b1; TimeSet_EN<=1'b0; Stopwatch_EN<=1'b0; Alarmclock_EN<=1'b0; Date_EN<=1'b0; DateSet_EN<=1'b0; end //时钟调整与设置 3'b001:begin end //秒表

3'b010:begin end //闹钟时间设置 3'b011:begin end //日期显示 3'b100:begin end //日期调整与设置 3'b101:begin end

default:begin end endcase end endmodule

第 21 页 共 28 页

基于FPGA的多功能电子万年历

4.2秒自动计时子模块

module second_counter(EN,clk,second_data1,second_data0,E0); output [3:0] second_data1,second_data0; output E0; input clk,EN;

reg [3:0] second_data1,second_data0; reg E0;

always@(posedge clk) begin

if(EN==1'b1) begin

if(second_data0<4'b1001)

second_data0<=second_data0+4'b1; else begin

E0<=1'b0;

second_data0<=4'b0; if(second_data1<4'b0101)

second_data1<= second_data1+4'b1; else begin

second_data1<=4'b0; E0<=1'b1; end end end end endmodule

4.3时间自动工作控制

module timepiece_main(CLK,Timepiece_EN,day_EN,hour0,hour1,minute0,minute1,second0,second1); input CLK;

input Timepiece_EN; output day_EN;

output [3:0] hour1,hour0; output [3:0] minute1,minute0; output [3:0] second1,second0; wire SYNTHESIZED_WIRE_0; wire SYNTHESIZED_WIRE_1; hour_counter /*小时计时*/

b2v_inst(.clk(SYNTHESIZED_WIRE_0),.EN(Timepiece_EN),.E0(day_EN),.hour_data0(hour0),.hour_data1(hour1));

minute_counter /*分钟计时*/

第 22 页 共 28 页

基于FPGA的多功能电子万年历

b2v_inst1(.clk(SYNTHESIZED_WIRE_1),.EN(Timepiece_EN),.E0(SYNTHESIZED_WIRE_0),.minute_data0(minute0),.minute_data1(minute1)); second_counter /*秒计时*/

b2v_inst2(.clk(CLK),.EN(Timepiece_EN),.E0(SYNTHESIZED_WIRE_1),.second_data0(second0),.second_data1(second1)); endmodule

4.4时间数据与时间设置数据多路选择模块

module

time_mux(TimeSet_EN,hour1,hour0,minute1,minute0,second1,second0,hour_set1,hour_set0,minute_set1,minute_set0,second_set1,second_set0,hour_1,hour_0,minute_1,minute_0,second_1,second_0); output [3:0] hour_1,hour_0; //当前需要显示的小时输出 output [3:0] minute_1,minute_0; //当前需要显示的分钟输出 output [3:0] second_1,second_0; //当前需要显示的秒输出 input TimeSet_EN; //时间设置使能信号

input [3:0] hour1,hour0; //自动模式中当前时间的小时输入 input [3:0] minute1,minute0; //自动模式中当前时间的分钟输入 input [3:0] second1,second0; //自动模式中当前时间的秒输入 input [3:0] hour_set1,hour_set0; //时间设置后的小时输入 input [3:0] minute_set1,minute_set0; //时间设置后的分钟输入 input [3:0] second_set1,second_set0; //时间设置后的秒输入 reg [3:0] hour_1,hour_0; reg [3:0] minute_1,minute_0; reg [3:0] second_1,second_0;

/*时间自动显示与时间调整与设置中显示数据的多路选择*/

always@(TimeSet_EN,hour1,hour0,minute1,minute0,second1,second0,hour_set1,hour_set0,minute_set1,minute_set0,second_set1,second_set0) begin

if(TimeSet_EN==1'b1) begin

hour_1<=hour_set1; hour_0<=hour_set0; minute_1<=minute_set1; minute_0<=minute_set0; second_1<=second_set1; second_0<=second_set0; end else begin

hour_1<=hour1; hour_0<=hour0; minute_1<=minute1; minute_0<=minute0; second_1<=second1;

第 23 页 共 28 页

基于FPGA的多功能电子万年历

second_0<=second0; end end endmodule

4.5时间及其设置模块

module

time_auto_and_set(CLK,Timepiece_EN,TimeSet_EN,SW1,SW2,Day_EN,hour_0,hour_1,minute_0,minute_1,second_0,second_1,TimeSet_disp_drive); input CLK;

input Timepiece_EN; input TimeSet_EN; input SW1; input SW2; output Day_EN;

output [3:0] hour_1,hour_0; output [3:0] minute_1,minute_0; output [3:0] second_1,second_0; output [2:0] TimeSet_disp_drive; reg [3:0] hour_1,hour_0; reg [3:0] minute_1,minute_0; reg [3:0] second_1,second_0; reg [2:0] TimeSet_disp_drive; wire [3:0] SYNTHESIZED_WIRE_18; wire [3:0] SYNTHESIZED_WIRE_19; wire [3:0] SYNTHESIZED_WIRE_2; wire [3:0] SYNTHESIZED_WIRE_3; wire [3:0] SYNTHESIZED_WIRE_20; wire [3:0] SYNTHESIZED_WIRE_21; wire [3:0] SYNTHESIZED_WIRE_6; wire [3:0] SYNTHESIZED_WIRE_7; wire [3:0] SYNTHESIZED_WIRE_22; wire [3:0] SYNTHESIZED_WIRE_23; wire [3:0] SYNTHESIZED_WIRE_10; wire [3:0] SYNTHESIZED_WIRE_11; /*时间自动运行与显示*/ timepiece_main

b2v_inst1(.CLK(CLK),.Timepiece_EN(Timepiece_EN),.day_EN(Day_EN),.hour0(SYNTHESIZED_WIRE_18),.hour1(SYNTHESIZED_WIRE_19),.minute0(SYNTHESIZED_WIRE_20),.minute1(SYNTHESIZED_WIRE_21),.second0(SYNTHESIZED_WIRE_22),.second1(SYNTHESIZED_WIRE_23)); /*时间与时间调整数据的多路选择*/ time_mux

b2v_inst2(.TimeSet_EN(TimeSet_EN),.hour0(SYNTHESIZED_WIRE_18),.hour1(SYNTHESIZED_WIRE_19),.

第 24 页 共 28 页

基于FPGA的多功能电子万年历

hour_set0(SYNTHESIZED_WIRE_2),.hour_set1(SYNTHESIZED_WIRE_3),.minute0(SYNTHESIZED_WIRE_20),.minute1(SYNTHESIZED_WIRE_21),.minute_set0(SYNTHESIZED_WIRE_6),.minute_set1(SYNTHESIZED_WIRE_7),.second0(SYNTHESIZED_WIRE_22),.second1(SYNTHESIZED_WIRE_23),.second_set0(SYNTHESIZED_WIRE_10),.second_set1(SYNTHESIZED_WIRE_11),.hour_0(hour_0),.hour_1(hour_1),.minute_0(minute_0),.minute_1(minute_1),.second_0(second_0),.second_1(second_1)); /*时间调整与设置*/ timeset

b2v_inst3(.TimeSet_EN(TimeSet_EN),.SW1(SW1),.SW2(SW2),.hour0(SYNTHESIZED_WIRE_18),.hour1(SYNTHESIZED_WIRE_19),.minute0(SYNTHESIZED_WIRE_20),.minute1(SYNTHESIZED_WIRE_21),.second0(SYNTHESIZED_WIRE_22),.second1(SYNTHESIZED_WIRE_23),.disp_drive(TimeSet_disp_drive),.hour_set0(SYNTHESIZED_WIRE_2),.hour_set1(SYNTHESIZED_WIRE_3),.minute_set0(SYNTHESIZED_WIRE_6),.minute_set1(SYNTHESIZED_WIRE_7),.second_set0(SYNTHESIZED_WIRE_10),.second_set1(SYNTHESIZED_WIRE_11)); endmodule

4.6时间显示动态位选模块

module time_disp_select(clk_1kHz,clk_200Hz,Time_EN,TimeSet_EN,timeset_disp_drive,time_disp_select); output [5:0] time_disp_select; input clk_1kHz; input clk_200Hz; input Time_EN; input TimeSet_EN;

input [2:0] timeset_disp_drive; reg [5:0] time_disp_select; reg [2:0] auto_disp_drive; reg clk;

reg [2:0] disp_drive;

always@(posedge clk_1kHz) /*实现自动运行模式中的动态显示“位选的驱动”*/ begin

if(auto_disp_drive<3'b101)

auto_disp_drive<=auto_disp_drive+3'b1; else

auto_disp_drive<=3'b0; end

always /*实现自动运行模式中时间动态显示位选驱动与时间设置中的时间动态显示位选驱动的二选一*/ begin

if(Time_EN==1'b1) begin

clk<=clk_1kHz;

disp_drive<=auto_disp_drive; end

else if(TimeSet_EN==1'b1)

第 25 页 共 28 页

基于FPGA的多功能电子万年历

begin

clk<=clk_200Hz;

disp_drive<=timeset_disp_drive; end end

always@(posedge clk) /*实现时间的动态位选*/ begin

case(disp_drive)

3'b000:time_disp_select<=6'b100000; 3'b001:time_disp_select<=6'b010000; 3'b010:time_disp_select<=6'b001000; 3'b011:time_disp_select<=6'b000100; 3'b100:time_disp_select<=6'b000010; 3'b101:time_disp_select<=6'b000001; default:time_disp_select<=6'b000000; endcase end endmodule

4.7秒表模块

module stopwatch(clk1,clk2,EN,F_out); output F_out; input EN; input clk1,clk2; reg F_out;

always@(EN,clk1,clk2) begin

case(EN)

1'b0:F_out<=clk1; 1'b1:F_out<=clk2; default:F_out<=1'b0; endcase end endmodule

4.8分频模块

module fdiv(clk,f200Hz,f60Hz,f1Hz); output f200Hz,f60Hz,f1Hz; input clk;

reg f200Hz,f60Hz,f1Hz;

integer CNT1=0,CNT2=0,CNT3=0;

/*实现将全局时钟分频得到200Hz时钟信号*/ always@(posedge clk) begin

第 26 页 共 28 页

基于FPGA的多功能电子万年历

if(CNT1<4) begin

CNT1=CNT1+1; f200Hz<=1'b0; end else begin

CNT1=0; f200Hz<=1'b1; end end

/*实现将200Hz时钟分频得到60Hz时钟信号*/ always@(posedge f200Hz) begin

if(CNT2<2) begin

CNT2=CNT2+1; f60Hz<=1'b0; end else begin

CNT2=0; f60Hz<=1'b1; end end

/*实现将200Hz时钟分频得到1Hz时钟信号*/ always@(posedge f200Hz) begin

if(CNT3<199) begin

CNT3=CNT3+1; f1Hz<=1'b0; end else

begin

CNT3=0; f1Hz<=1'b1; end end endmodule

第 27 页 共 28 页

基于FPGA的多功能电子万年历

附录二 电路图

alarmclockENalarmalarmclock_disp_select[5..0]OUTPUTalarmstopwatchENF_outclk1fdivClockNPUTGNDtime_auto_and_setCLKTimepiece_ENTimeSet_ENSW1SW2Day_ENhour_1[3..0]hour_0[3..0]minute_1[3..0]minute_0[3..0]second_1[3..0]second_0[3..0]TimeSet_disp_drive[2..0]SW1SW2clk_200Hzhour1[3..0]hour0[3..0]minute1[3..0]minute0[3..0]second1[3..0]second0[3..0]clk2nst2clkf200Hzf60Hzf1Hznst5nst11nst1maincontrolSW3NPUTGNDSW3Timepiece_ENTimeSet_ENStopwatch_ENAlarmclock_ENDate_ENDateSet_ENdate_mainDate_ENdate_disp_clkday_ENDate_Set_ENmonth1[3..0]month0[3..0]day1[3..0]day0[3..0]Disp_select_date[5..0]time_disp_selectclk_1kHzclk_200HzTime_ENTimeSet_ENtimeset_disp_drive[2..0]nst6time_disp_select[5..0]nst3SW1SW2NPUTGNDNPUTGNDSW1SW2nst4disp_data_muxTimepiece_ENTimeSet_ENStopwatch_ENtime_disp_select[5..0]Alarmclock_ENalarmclock_disp_select[5..0]hour1[3..0]hour0[3..0]minute1[3..0]minute0[3..0]second1[3..0]second0[3..0]Date_ENDateSet_ENdate_disp_select[5..0]month1[3..0]month0[3..0]day1[3..0]day0[3..0]nst8disp_select[5..0]disp_data[6..0]OUTPUTOUTPUTdisp_select[5..0]disp_data[6..0] 第 28 页 共 28 页

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- aiwanbo.com 版权所有 赣ICP备2024042808号-3

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务