fpga电子万年历_至简设计法_fpga万年历设计(一)

一、功能概述

万年历是记录一定时间范围内的年历,其名称只是一种象征,表示时间跨度大。由于其功能非常常用,且极为方便人们查询使用,因此广泛应用于钟表、历书出版物、电子产品、电脑软件和手机应用等等行业中。


与传统计时工具如钟表日历等相比,数字万年历具备精确度高、成本低廉、运行稳定、功能多样等众多优点,因此国内外许多设计人员先后进行了相关设计开发。其中,基于FPGA开发除设计简便、开发成本低、电路简洁等,更具备功能设计灵活方面的优势。只需要在软件上做简单修改即可添加不同功能,如闹钟、阴阳历对照等。
在FPGA设计中,数字万年历属于小规模集成电路。从原理上来讲,是典型的数字电路,包括组合逻辑电路和时序电路。在本案例中具体功能要求如下:
本项目要求设计一个电子万年历,具体功能要求如下:
1. 上板复位后从元年1月1号开始计数,为方便上板调试,将一天的时间压缩为1秒;2. 按键用于设置日历,按下按键0进入设置状态,再次按下按键0退出设置状态;3. 按键1用来选择想要设置的年月日的各个位;4. 按键2在设置状态时进行计数设置,每按一次数码管显示数字加1;5. 平年365天(52周+1天),闰年366天(52周+2天),其中平年2月28天,闰年2月29天。6. 闰年:每400年整一闰,或每4年且不为百年的一闰。即能被400整除,或不能被100整除但能被4整除的年份为闰年。

二、设计思路

首先根据所需要的功能,列出工程顶层的输入输出信号列表。

信号列表如下:

368bcf7da100c88df0ecbaeeff65d6f5.png


我们可以把工程划分成三个模块,分别是万年历计数模块、按键模块和数码管显示模块。

74876d8045db54687121e0de46a0b575.png


1. 计数模块

实现的是万年历计数功能,为方便观看,将一天时间设置为1秒;日计数器dat_cnt、月份计数器mon_cnt_h、mon_cnt_1、mon_2_h、mon_2_1分别为大月小月以及平年闰年的2月计数器、年份计数器yea_one、yea_ten、yea_hun、yea_tho分别为年份的个十百千位,由yea_cnt_tol <= yea_cnt1000 + yea_cnt100 + yea_cnt10 + yea_one得到年份。本模块还自动计算当年是否是平闰年。


信号列表如下:

5c65976640067add4edcd7d8f8add17f.png


2. 按键模块

4x4矩阵键盘,实现了矩阵键盘的扫描并使用按键消抖功能。

信号列表如下:

a316ef37334683078e9606ccc71443e5.png


3. 数码管模块

实现将年月日的信息显示在数码管上。


信号列表如下:

05a2474e9f8df5c6c5a9010a6186eb5c.png

三、程序设计

顶层模块

1 module calendar_top(
2 clk ,
3 rst_n ,
4 key_col,
5 key_row,
6 segment,
7 seg_sel
8 );
9
10 parameter SEG_NUM = 8 ;
11 parameter SEG_W = 8 ;
12 parameter TIME_1S =50_000_000;
13
14 input clk ;
15 input rst_n ;
16 input [3:0] key_col ;
17
18 output [SEG_W-1:0] segment ;
19 output [SEG_NUM-1:0] seg_sel ;
20 output [3:0] key_row ;
21
22 wire [SEG_W-1:0] segment ;
23 wire [SEG_NUM-1:0] seg_sel ;
24
25 wire [3:0] key_num ;
26 wire key_vld ;
27 wire [4*SEG_NUM-1:0] data_out;
28 wire [SEG_NUM-1:0] din_vld ;
29
30 assign din_vld = 8'b11111111 ;
31
32 key_scan u_key_scan(
33 .clk (clk ) ,
34 .rst_n (rst_n ) ,
35 .key_col(key_col) ,
36 .key_row(key_row) ,
37 .key_out(key_num) ,
38 .key_vld(key_vld)
39 );
40
41 seg_display u_seg_display(
42 .clk (clk ) ,
43 .rst_n (rst_n ) ,
44 .din (data_out) ,
45 .din_vld (din_vld ) ,
46 .segment (segment ) ,
47 .seg_sel (seg_sel )
48 );
49
50 counter #(.TIME_1S(TIME_1S)) u_counter(
51 .clk (clk ),
52 .rst_n (rst_n ),
53 .key_vld (key_vld ),
54 .key_num (key_num ),
55 .dout (data_out )
56 );
57 endmodule
58万年历计数模块

1 module counter(
2 clk ,
3 rst_n ,
4 key_vld ,
5 key_num ,
6 dout
7 );
8
9
10 parameter DATA_W = 32;
11 parameter TIME_1S = 50_000_000;
12
13 input clk ;
14 input rst_n ;
15 input key_vld ;
16 input[3:0] key_num ;

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值