基于FPGA的电子万年历设计

这篇具有很好参考价值的文章主要介绍了基于FPGA的电子万年历设计。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.软件版本

quartusii12.1

2.系统描述

系统的整个结构框图:

基于FPGA的电子万年历设计

 然后,设置控制输入有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=2;闹钟设置模块

i_sel:

i_set:

i_run:不使用,

通过设置i_sel,选择需要被设置的数字位,然后通过i_set进行闹钟的设置。

i_Function_Controller=3;秒表的控制

i_sel:清零

i_set:暂停

i_run:开始秒表计时

整体的结构如下所示:

基于FPGA的电子万年历设计

3.部分源码

`timescale 1ns / 1ps

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,
				o_digit,
				o_en
	        );

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;	
output[7:0]o_digit;
output[7:0]o_en;


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]be_Num1;
wire[3:0]be_Num2;
wire[3:0]be_Num3;
wire[3:0]be_Num4;	
wire[3:0]be_Num5;
wire[3:0]be_Num6;
wire[3:0]be_Num7;
wire[3:0]be_Num8;

beer beer_u(
    .i_clk  (Clock), 
    .i_rst  (i_rst), 
    .i_sel  (i_sel), 
    .i_set  (i_set), 
    .i_N1   (tm_Num3), 
    .i_N2   (tm_Num4), 
    .i_N3   (tm_Num5), 
    .i_N4   (tm_Num6), 
    .o_N1   (be_Num3), 
    .o_N2   (be_Num4), 
    .o_N3   (be_Num5), 
    .o_N4   (be_Num6), 
    .o_bear (o_bear)
    );
assign be_Num1 = 4'd0;
assign be_Num2 = 4'd0;
assign be_Num7 = 4'd0;
assign be_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)
begin
     if(i_rst)
	  begin
	  o_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 begin
          if(i_Function_Controller == 2'b00)
			 begin
	       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;
			 end
          if(i_Function_Controller == 2'b01)
			 begin
	       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_Num7 <= tm_Num7;
	       o_Num8 <= tm_Num8;			 
			 end
          if(i_Function_Controller == 2'b10)
			 begin
	       o_Num1 <= be_Num1;
	       o_Num2 <= be_Num2;
	       o_Num3 <= be_Num3;
	       o_Num4 <= be_Num4;
	       o_Num5 <= be_Num5;
	       o_Num6 <= be_Num6;
	       o_Num7 <= be_Num7;
	       o_Num8 <= be_Num8;				 
			 end		
          if(i_Function_Controller == 2'b11)
			 begin
	       o_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
end



======================================================================
//digit8 digit8_u(
//    .i_clk  (i_clk), 
//    .i_rst  (i_rst), 
//    .i_num1s (o_num1), 
//    .i_num2s (o_num2), 
//    .i_num3s (o_num3), 
//    .i_num4s (o_num4), 
//    .i_num5s (o_num5), 
//    .i_num6s (o_num6), 
//    .i_num7s (o_num7), 
//    .i_num8s (o_num8), 
//    .o_digit(o_digit), 
//    .o_en   (o_en)
//    );

	 
endmodule

4.仿真结论

第一个模块:秒表模块:

        这个模块是一个秒表计数器,技术最大到60分钟,最小为0.01秒。这个模块可以暂停,计时以及清零三个功能。

        这个模块的仿真结果如下所示:

基于FPGA的电子万年历设计

当输入的i_run信号为1的时候,秒表开始运行,从上面我们可以看到最高位Num6的计数结果,其余几位由于速度很快,所以被缩小了,看不清楚,当pause为1的时候,秒表停留在14:22:63,即14分22秒63.然后最后clear为高的时候,直接清零。

第二个模块:时间模块:

         这个模块主要是一个以秒为计数单位的计数器,秒计数满60,分累加1,分计数满60的时候,小时累加1,小时计数满24的时候,产生一个时钟信号,用来确定日期加1。这个模块的仿真结果如下所示:

基于FPGA的电子万年历设计

第三个模块:年月日模块:

         这个模块主要是一个计数器,当计数器计数到24小时的时候,年月日模块计数器会自动加1,表示日期往前累积1日。并系统能够区分大小月和特殊的2月,以及年份的闰年或者非闰年。

        这里我们分两个小模块来设计,一个是日月模块,一个是年模块,当计数器计数到12月31日的时候,那么年模块则进一。即年份增加一。

       然后日月模块需要进行进行一个大的循环,技术满4年,则2月需要变为29天,否则为28天。

       这里,月份的仿真效果如下所示:

基于FPGA的电子万年历设计

从上面的仿真结果可知,当月份技术到12:31日的时候,会产生一个技术的时钟高电平,这个电平用来确定年份的计数器。

         关于年份的计数。就是当月份慢12-31的时候,年份计数器加1.这个模块比较简单,具体仿真效果如下所示:

基于FPGA的电子万年历设计

闹钟模块:

         这个模块,通过键盘输入,设置需要闹钟的时间,然后当系统的时钟模块的分和小时和闹钟模块的预设值匹配的时候,该模块会驱动蜂鸣器发出闹钟声音。

        闹钟模块,即通过设置闹钟的具体时间,然后后输入的时间进行对比,如果一直,那么输出一个高电平信号给蜂鸣器。发出声音。

数码管输出模块:

         根据各个模块的数值,分别驱动8个数码管,进行数据的显示。这个模块只能在实际测试的时候使用,所以这里不给出仿真模块。

全局模块:

       这个模块是对各个子模块的调用。

分频模块:

        这个模块主要将系统的时钟进行分频,得到和实际时间相关的时钟频率,具体流程为通过设置一个是计数器,当计数器计数到一个预设值得时候,新的时钟频率输出1,其余时间输出0。通过这个过程,实现时钟的分频。

A02-46文章来源地址https://www.toymoban.com/news/detail-434871.html

到了这里,关于基于FPGA的电子万年历设计的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FPGA开发(基于Quartus II)万年历,简单代码

       设计一个基于FPGA的电子万年历。设计的主要任务是在Quartus II开发环境中完成电子万年历系统FPGA内部各电路模块的设计,包括各个模块的设计输入、编译、仿真、验证和硬件测试任务。具体要求如下: 能实现2 4 小时、6 0 分、6 0 秒的基本计时功能,格式为0 8 - 56 - 36 :时

    2024年02月04日
    浏览(40)
  • 基于AT89S52单片机的多功能电子万年历

    基于AT89S52单片机的多功能电子万年历的硬件结构和软硬件设计方法。本设计由数据显示模块、温度采集模块、时间处理模块和调整设置模块四个模块组成。系统以AT89S52单片机为控制器,以串行时钟日历芯片DS1302记录日历和时间,它可以对年、月、日、时、分、秒进行计时,

    2024年02月03日
    浏览(74)
  • 基于51单片机的万年历设计

    目  录 前言....................................................................... 1 1 绪论..................................................................... 3 1.1 课题研究的背景..................................................... 3 1.2课题的研究目的与意义................................................ 3 1.3课题解决的主要内

    2024年02月02日
    浏览(46)
  • 基于AT89C52单片机的多功能万年历设计

    点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/87853675 源码获取 目 录 摘 要 1 1 方案论证 2 1.1 单片机芯片的选择方案和论证 2 1.2 显示模块选择方案和论证 2 1.3 时钟芯片的选择方案和论证 3 1.4 电路设计最终方案决定 3 2 系统的硬件设计与实现

    2024年02月07日
    浏览(44)
  • 基于ego1开发板的万年历自动数字日历设计verilog代码

    名称:基于ego1开发板的万年历自动数字日历设计verilog代码 软件:VIVADO 语言:Verilog 代码功能: 自动数字日历设计  设计自动数字日历,用七段数字显示器显示年(后2位)、月、日和星期数,在计日脉冲的作用下,自动完成1-12月的月、日及星期的计数和显示。 FPGA代码Verilog/VHDL代码

    2024年02月03日
    浏览(42)
  • 47、基于51单片机万年历温度闹钟农历阳历LCD 12864显示系统设计

    本文介绍了基于STC89C52单片机的多功能电子万年历的硬件结构和软硬件设计方法。本设计由数据显示模块、温度采集模块、时间处理模块和调整设置模块四个模块组成。系统以STC89C52单片机为控制器,以串行时钟日历芯片DS1302记录日历和时间,它可以对年、月、日、时、分、秒

    2024年02月09日
    浏览(88)
  • 基于Java的万年历(课设)

    资源链接:基于Java的万年历(课设) 摘 要 Java编程语言自诞生十几年来,已经成功地运用在网络计算及移动等各个领域。对于开发者来说,它具有简单、面向对象、健壮、安全、结构中立、可移植和高效能等众多优点。此次我们用JAVA来设计一个万年历程序,该程序以网页形

    2024年02月11日
    浏览(45)
  • STM32制作万年历

        STM32万年历制作指南 一、概述 STM32是一种常用的微控制器,具有强大的处理能力和低功耗特性,非常适合用于制作各种电子设备。本文将介绍如何使用STM32制作一款简易的万年历,帮助您轻松查看日期、时间和农历等信息。 二、所需材料 1. STM32微控制器(建议使用STM32F

    2024年02月03日
    浏览(39)
  • 6-6 万年历显示函数

    题主为武理的学生 网上没有对应答案 仅以学习用途上传 设计一个万年历,当用户输入年份和月份时,显示这个月的日历表。程序重点是这个月的第一天是星期几和这个月有几天,有了这两个值,只需通过排列,就可以显示这个日历。程序要求用户输入的年份是从1900年开始,

    2024年01月18日
    浏览(40)
  • C语言课设万年历

    1.该程序可以输出某年的全部月份,也可以输出某月的全天日历。 2.输入年月日输出距今天还有多少天,星期几,是否是公历节日。 注:分代码应以.h的形式分开才保证正常运行。         总天数的算法:首先用if语句判断定义年到输入年之间每一年是否为闰年,若是,该年的

    2024年02月11日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包