目錄
1.課題概述
2.系統仿真結果
3.核心程序與模型
4.系統原理簡介
5.完整工程文件
1.課題概述
基于FPGA的電子萬年歷系統開發,包含各模塊testbench。主要包含以下核心模塊:
時鐘控制模塊:提供系統基準時鐘和計時功能。
日歷計算模塊:處理年月日的計算和閏年判斷。
秒表模塊:實現精確到 0.01 秒的計時功能。
2.系統仿真結果
FPGA仿真測試
? ? ? ?當輸入的i_run信號為1的時候,秒表開始運行,從上面我們可以看到最高位Num6的計數結果,其余幾位由于速度很快,所以被縮小了,看不清楚,當i_set為1的時候,秒表暫停。
???????這個模塊主要是一個以秒為計數單位的計數器,秒計數滿60,分累加1,分計數滿60的時候,小時累加1,小時計數滿24的時候,產生一個時鐘信號,用來確定日期加1。
????????這個模塊主要是一個計數器,當計數器計數到24小時的時候,年月日模塊計數器會自動加1,表示日期往前累積1日。
???????這里我們分兩個小模塊來設計,一個是日月模塊,一個是年模塊,當計數器計數到12月31日的時候,那么年模塊則進一。即年份增加一。
3.核心程序與模型
版本:vivado2022.2
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 14:45:46 04/09/2014
// Design Name:
// Module Name: tops
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
module tops(i_clk,i_rst,i_Function_Controller,i_sel,i_set,i_run,o_Num1,o_Num2,o_Num3,o_Num4,o_Num5,o_Num6,o_Num7,o_Num8);input i_clk;
input i_rst;
input[1:0] i_Function_Controller;
input i_sel;
input i_set;
input i_run;
output[3:0]o_Num1;
output[3:0]o_Num2;
output[3:0]o_Num3;
output[3:0]o_Num4;
output[3:0]o_Num5;
output[3:0]o_Num6;
output[3:0]o_Num7;
output[3:0]o_Num8; wire Clock_mb;
wire Clock;clock_div clock_div_u(.i_clk (i_clk), .i_rst (i_rst), .i_sel (1'b0), .o_clock1 (Clock_mb), .o_clock2 (Clock));//======================================================================
wire CLK_Year;
wire[3:0]ym_Num1;
wire[3:0]ym_Num2;
wire[3:0]ym_Num3;
wire[3:0]ym_Num4;
wire[3:0]ym_Num5;
wire[3:0]ym_Num6;
wire[3:0]ym_Num7;
wire[3:0]ym_Num8;
year_month year_month_u(.i_clk (CLK_Year), .i_rst (i_rst), .i_sel (i_sel), .i_set (i_set), .o_Num1 (ym_Num1), .o_Num2 (ym_Num2), .o_Num3 (ym_Num3), .o_Num4 (ym_Num4), .o_Num5 (ym_Num5), .o_Num6 (ym_Num6), .o_Num7 (ym_Num7), .o_Num8 (ym_Num8));//======================================================================
wire[3:0]tm_Num1;
wire[3:0]tm_Num2;
wire[3:0]tm_Num3;
wire[3:0]tm_Num4;
wire[3:0]tm_Num5;
wire[3:0]tm_Num6;
wire[3:0]tm_Num7;
wire[3:0]tm_Num8;
times times_u(.i_clk (Clock), .i_rst (i_rst), .i_run (i_run), .i_sel (i_sel), .i_set (i_set), .o_Num1 (tm_Num1), .o_Num2 (tm_Num2), .o_Num3 (tm_Num3), .o_Num4 (tm_Num4), .o_Num5 (tm_Num5), .o_Num6 (tm_Num6), .o_CLK_Year (CLK_Year), .CNT ());assign tm_Num7 = 4'd0;
assign tm_Num8 = 4'd0;//======================================================================
wire[3:0]mb_Num1;
wire[3:0]mb_Num2;
wire[3:0]mb_Num3;
wire[3:0]mb_Num4;
wire[3:0]mb_Num5;
wire[3:0]mb_Num6;
wire[3:0]mb_Num7;
wire[3:0]mb_Num8;
miaobiao miaobiao_u(.i_clk (Clock_mb), .i_rst (i_rst), .i_run (i_run), .i_pause (i_set), .i_clear (i_sel), .o_Num1 (mb_Num1), .o_Num2 (mb_Num2), .o_Num3 (mb_Num3), .o_Num4 (mb_Num4), .o_Num5 (mb_Num5), .o_Num6 (mb_Num6));
assign mb_Num7 = 4'd0;
assign mb_Num8 = 4'd0;//=====================================================================
reg[3:0]o_Num1;
reg[3:0]o_Num2;
reg[3:0]o_Num3;
reg[3:0]o_Num4;
reg[3:0]o_Num5;
reg[3:0]o_Num6;
reg[3:0]o_Num7;
reg[3:0]o_Num8;
always @(posedge i_clk or posedge i_rst)
beginif(i_rst)begino_Num1 <= 4'd0;o_Num2 <= 4'd0;o_Num3 <= 4'd0;o_Num4 <= 4'd0;o_Num5 <= 4'd0;o_Num6 <= 4'd0;o_Num7 <= 4'd0;o_Num8 <= 4'd0;end
else beginif(i_Function_Controller == 2'b00)begino_Num1 <= ym_Num1;o_Num2 <= ym_Num2;o_Num3 <= ym_Num3;o_Num4 <= ym_Num4;o_Num5 <= ym_Num5;o_Num6 <= ym_Num6;o_Num7 <= ym_Num7;o_Num8 <= ym_Num8;endif(i_Function_Controller == 2'b01)begino_Num1 <= tm_Num1;o_Num2 <= tm_Num2;o_Num3 <= tm_Num3;o_Num4 <= tm_Num4;o_Num5 <= tm_Num5;o_Num6 <= tm_Num6;o_Num7 <= tm_Num7;o_Num8 <= tm_Num8; endif(i_Function_Controller == 2'b11)begino_Num1 <= mb_Num1;o_Num2 <= mb_Num2;o_Num3 <= mb_Num3;o_Num4 <= mb_Num4;o_Num5 <= mb_Num5;o_Num6 <= mb_Num6;o_Num7 <= mb_Num7;o_Num8 <= mb_Num8; end end
endendmodule
00X6_004m
4.系統原理簡介
系統頂層框圖如下:
1.該系統的基本功能
時鐘顯示:時、分(24 小時制)
日歷顯示:年、月、日
秒表功能:精確到 0.01 秒,支持開始 / 暫停 / 復位
2.模式切換功能
我們的控制輸入有5個腳,分析功能如下所示:
i_Function_Controller=0;顯示年月日
i_sel:選擇需要調整的某位數字。
i_set:計數器,調整需要調整的位置的數字。
具體調整的時候,首先選擇i_sel,按鍵按一下,需要調整的位置會移動一次,然后移動到需要調整的位置上,然后松開i_sel,然后按下i_set,調整顯示的數字。
i_run:不使用
i_Function_Controller=1;顯示時間,小時,分,秒
i_sel:
i_set:
i_run:
正常工作的時候,上面三個設置分別輸入0,0,1
當需要調整時間的時候,設置i_run=0,然后設置i_sel,選擇對應的需要調整的數字位,然后設置i_set,設置具體的值,其中秒位置,如果設置i_set。那么秒直接清零。
注意,因為時間部分計數到24小時的時候,年月日才被加1,所以在年月日這里i_run不使用,他是靠日期模塊來驅動的。
i_Function_Controller=3;秒表的控制
i_sel:清零
i_set:暫停
i_run:開始秒表計時
5.完整工程文件
v