草庐IT

基于FPGA的数字钟设计实验报告

saw furure 2023-04-04 原文

一.引言

E D A技术在当今社会为现代电子设计领域提供了可能性,这也是E D A 技术飞速发展的理由。现如今,E D A技术不再是某一门课程的分支,也不是某种新的技术,而是一门综合性学科。让计算机软件与计算机硬件相结合,他代表了电子设计技术的不断发展方向。

在当今社会EDA技术为现代电子设计领域提供了可能性,这也是E D A 技术飞速发展的理由。现如今,E D A技术不再是某一门课程的分支,也不是某种新的技术,而是一门综合性学科。通过计算机软件与计算机硬件相结合,代表了电子设计技术的不断发展方向。

数字钟的应用十分的广泛,每一个家庭,车站,教室等公共场所都应该会有数字钟的身影,给人们带来极大的方便和快捷。

随着科技的进步和人们生活水平的提高,我们对于时钟的要求也在不断的提高。现在时钟已经不再是一个简单的报时工具,在很多特殊的时刻我们还需要用到时钟的其他功能。在这种新形势下,制作数字电子钟成为时代的主流设计和发展方向。数字钟是利用数字电路实现时、分、秒的计时装备,较以往的机械钟具有更强的直观性和准确性,并且延长了时钟的使用寿命。

二.设计目的

12进制数字钟的计时装置的周期是12小时,显示满刻度为11小时59分59秒。

制作数字钟是为了了解数字钟的工作原理和工作过程,能够自主独立的编写和修改各种进制数字钟的语言。熟练使用EDA课程中使用的软件和将所学到的知识理论应用于实践中。并能因为此次实验对EDA程序设计产生浓厚兴趣,因为只有真正喜欢上这门课程,才能在未来的学习中不断进步。

三.实验内容

利用M A X+p l u s II 10.2软件设计12进制数字钟。

四.实验原理和思路

由于我设计的是12进制数字钟,所以在设计过程中我让数字钟在“时”上从0-11循环,在“分”和“秒”上依旧实现0-59的循环。

在《EDA技术与应用》这篇课本p205页中我们可以见到60进制的计数器,我设计的12进制数字钟原理其实和60进制计数器是一样的,不同之处只是12进制是十位在0时,个位实现0-9的循环,十位等于1时,个位实现0-1的循环。

五.数字钟模块设计

5.1“时”程序段设计

过程如下:

1.打开M A X+p l u sⅡ10.2,新建 Text Editor file

2.编写程序如图:

3.点击 ctrl + shift + j 将设计项目设置成工程文件,注意类型为.vhd。

4.点击M A X + p l u s Ⅱ下的compiler进行编译

 

 

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity shi is
port(clk,rst,ena,load:in std_logic;
     d:in std_logic_vector(7 downto 0);
     ah:buffer std_logic_vector(3 downto 0);
     a1:buffer std_logic_vector(3 downto 0));
end shi;
architecture behave of shi is
begin
process(clk,rst)
begin
if(rst='1')then
ah<="0000";
a1<="0000";
elsif(clk'event and clk ='1')then
 if(load ='1')then
  ah<= d(7 downto 4);
  a1<= d(3 downto 0);
 elsif(ena='1')then
   if(ah<2) then             
    if(a1=9) then                  
      a1<="0000";               
      ah<=ah+1;        
    else
     a1<=a1+1;           
    end if;
   else
    if(a1=3)then 
     a1<="0000";            
    else 
     ah<="0000";           
     a1<=a1+1;              
     end if; 
    end if; 
 end if;
end if;
end process;
end behave;

接下来是“分”设计和“秒”设计原理和“时”是一样的。

5.2“分”程序段设计

“分”的设计过程同上,我们要知道上一个“时”时0-33之间循环。“分”不同在于0-59之间循环。我们仅仅要修改一小部分程序。

 

 

 

用和“时”一样的编写方法编写“分”程序。

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity fen is
port(clk,rst2,ena2,load2:in std_logic;
     rco2:out std_logic;
     d2:in std_logic_vector(7 downto 0);
     ah2:buffer std_logic_vector(3 downto 0);
     a12:buffer std_logic_vector(3 downto 0));
end fen;
architecture behave2 of fen is
begin
rco2<='1' when (ah2= "0101" and a12="1001" and ena2 ='1')else'0';
process(clk,rst2)
begin
if(rst2='1')then
ah2<="0000";
a12<="0000";
elsif(clk'event and clk ='1')then
 if(load2 ='1')then
  ah2<= d2(7 downto 4);
  a12<= d2(3 downto 0);
 elsif(ena2='1')then             
    if(a12=9) then                  
      a12<="0000";                       
      if(ah2=5)then
       ah2<="0000";
      else
       ah2<=ah2+1;
      end if;
     else
      a12<=a12+1;
     end if;
   end if;
end if;
end process;
end behave2;

5.3“秒”程序段设计

 

 

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity miao is
port(clk,rst1,ena1,load1:in std_logic;
     rco1:out std_logic;
     d1:in std_logic_vector(7 downto 0);
     ah1:buffer std_logic_vector(3 downto 0);
     a11:buffer std_logic_vector(3 downto 0));
end miao;
architecture behave1 of miao is
begin
rco1<='1' when (ah1= "0101" and a11="1001" and ena1 ='1')else'0';
process(clk,rst1)
begin
if(rst1='1')then
ah1<="0000";
a11<="0000";
elsif(clk'event and clk ='1')then
 if(load1 ='1')then
  ah1<= d1(7 downto 4);
  a11<= d1(3 downto 0);
 elsif(ena1='1')then             
    if(a11=9) then                  
      a11<="0000";                       
      if(ah1=5)then
       ah1<="0000";
      else
       ah1<=ah1+1;
      end if;
     else
      a11<=a11+1;
     end if;
   end if;
end if;
end process;
end behave1;

秒”程序和“分”程序设计是一样的,都可以当成60进制计数来编译,在课本中有详细的介绍,我可以参考课本,不断改进我所编写的程序。

5.4七段显示译码器程序段设计

 

library ieee;
use ieee.std_logic_1164.all;
entity shuma is
port(shu:in std_logic_vector(3 downto 0);
led:out std_logic_vector(6 downto 0));
end shuma;
architecture yima of shuma is
begin
 process(shu)
 begin
  case shu(3 downto 0) is
  when"0000" =>led<="0111111";
  when"0001" =>led<="0000110";
  when"0010" =>led<="1011011";
  when"0011" =>led<="1001111";
  when"0100" =>led<="1100110";
  when"0101" =>led<="1101101";
  when"0110" =>led<="1111101";
  when"0111" =>led<="0000111";
  when"1000" =>led<="1111111";
  when"1001" =>led<="1101111";
  when others => null;
  end case;
 end process;
end yima;

六.数字钟的系统设计

建立完数字钟的“时”“分”“秒”三部分的程序描述,接下来就是设计顶层。我们可以通过点击file下的create default symbol 将我们所编写的三个程序进行封装。将“时”“分”“秒”三个程序组成电路。

1.打开原理图编译器,完成数字钟的设计。

设计图如下:

 

2.点击ctrl+shift+j将设计项目设置成工程文件。

3.完成数字钟编译.

  • 数字钟仿真调试过程

7.1“时”计数器

继续上面编译继续仿真,过程如下:

5.新建一个 Waveform Editor file ,准备仿真

6.点击NODE下的Enter Nodes form SNF,在弹出的窗口中点击list,这时将左窗口列出的设计所有信息节点利用中间的=>转移到右边

7.设置结束时间和时钟脉冲,点击ctrl+shift+j将设计项目设置成工程文件。

8.开始仿真

在时计数器的clk端口加入一个 1000ns的时钟信号;reset为高电平;进行仿真

 

“时”计数器在0-33之间循环,符合之前设计的程序,由此可见,我前面设计的程序是没有问题的。

                                                                7.2“分”计时器

 

7.3“秒”计时器

 

7.4七段显示译码器

 

7.5系统总调试

 

由最终的仿真结果可以看出我做的数字钟是正确的,当“时”到11时跳转为00,重新开始执行程序,构成循环。“分”和“秒”都是为59时跳转。ena,load,reset是使能端,这三个端口为1时,程序执行。为0时,清零。

  • 心得体会

8.1数字钟存在的问题

1 .数字钟采用的是静态译码显示方式,一个数码管需要8根I/O线,八个数码管,会占用很多的I/O线,导致I/O口资源不够用,同时会是成本加大,LED数码管的功耗较大,热量高,浪费资源。

2.随着累加计数的增加,延时的误差会一点点的累加,累加次数越多,技术误差就会越明显。

8.2数字钟改进意见

  1. 建议把LED静态显示改成动态显示,动态显示方式是通过一位一位地轮流点亮每位LED数码管,即每个数码管的位选被轮流选中,多个数码管公用一组段选,片选数据仅对位选选中的数码管有效。对于每一位数码管来说,每隔一段时间点亮一次。显示器的亮度通过导通电流,点亮时间和间隔时间的控制。通过调整电流和时间参数,可以既保证亮度,又保证显示。
  2. 增加自动校时模块,每隔一段时间对累加计数器进行校时,减少累加计数器误差的积累。

8.3数字钟开发过程中遇到的问题及解决的办法

刚开始做数字钟这个实验时,我认为这个实验做起来会很轻松,脑子中一下子出现了许多设计念头,刚开始的时候我认为的数字钟无非就是三个计数器分层累加实现计数,当听完安老师讲解之后,我发现数字钟需要设计复位,预置,使能的功能,在顶层如何将三级计数器连接嵌套问题 ,数码管如何显示问题都没有细细考虑到。

对于数字钟的复位,预置,使能的功能,通过对EDA这门课程的学习,根据参考书上的计数器例题,学习掌握了计数器的复位,预置,使能各种功能的嵌套,并通过if语句将各功能分层嵌套起来,最终实现了计数器各功能的实现和运用。

对于三级计数器如何在顶层连接问题,通过请教老师,一共有两种方式可以实现顶层的连接,第一种就是每一级的进位给到下一级的CLK上,通过每一级的进位,就会使下一级的CLK产生一个矩形脉冲,下一级通过产生的矩形脉冲进行计数,当每产生一个进位,下一级就会计数一次,以此循环,完成三级累加计数器。第二种是通过每一级的进位给到下一级的使能,通过将三级的CLK端口并联,构造分频器原理,就会使下一级的使能为1,计数一次,当每产生一个进位,下一级的使能为1,计数一次,以此循环,完成三级累加计数器。

对于数码管如何显示问题,通过译码器可以有两种实现方式,分别为静态显示和动态显示。静态显示主要的优点是显示稳定,在发光二极管导通电流一定的情况下显示器的亮度大,系统运行过程中,在需要更新显示内容时,CPU才去执行显示更新子程序,这样既节约了CPU的时间,又提高了CPU的工作效率。动态显示优点就是一位一位地轮流点亮各位显示器,对于每一位显示器来说,每隔一段时间点亮一次。显示器的亮度既与导通电流有关,也与点亮时间和间隔时间的比例有关。调整电流和时间参数,可以实现亮度较高、较稳定地显示、如果显示器的位数不大于8位,则控制显示器公共极点位只需一个8位口,控制各位显示器所显示的字形也需一个8位口。通过比较,我选择的是静态显示译码方式。

通过本次实验,我不仅学到了关于EDA的许多专业知识,同时也让我感觉到了思考的重要性。

不管是现在还是未来,我们不要遇到一点困难就退缩,就去向老师同学寻求帮助,自己是自己最好的老师,只有我们靠自己的不断修改出正确结果,才会对这个只是掌握的更加透彻,我们不要惧怕犯错,只有不断的犯错,从错误中发现问题,改正错误,才能取得进步通过思考、发问、自己解惑并动手、改进的过程,才能真正的完成课题。

  • 参考文献

EDA技术与应用(第2版) 清华大学出版社

V H D L实用教程    电子科技大学出版社

有关基于FPGA的数字钟设计实验报告的更多相关文章

  1. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  2. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  3. ruby - 查找字符串中的内容类型(数字、日期、时间、字符串等) - 2

    我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s

  4. 报告回顾丨模型进化狂飙,DetectGPT能否识别最新模型生成结果? - 2

    导读语言模型给我们的生产生活带来了极大便利,但同时不少人也利用他们从事作弊工作。如何规避这些难辨真伪的文字所产生的负面影响也成为一大难题。在3月9日智源Live第33期活动「DetectGPT:判断文本是否为机器生成的工具」中,主讲人Eric为我们讲解了DetectGPT工作背后的思路——一种基于概率曲率检测的用于检测模型生成文本的工具,它可以帮助我们更好地分辨文章的来源和可信度,对保护信息真实、防止欺诈等方面具有重要意义。本次报告主要围绕其功能,实现和效果等展开。(文末点击“阅读原文”,查看活动回放。)Ericmitchell斯坦福大学计算机系四年级博士生,由ChelseaFinn和Chri

  5. 叮咚买菜基于 Apache Doris 统一 OLAP 引擎的应用实践 - 2

    导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵

  6. 区块链之加解密算法&数字证书 - 2

    目录一.加解密算法数字签名对称加密DES(DataEncryptionStandard)3DES(TripleDES)AES(AdvancedEncryptionStandard)RSA加密法DSA(DigitalSignatureAlgorithm)ECC(EllipticCurvesCryptography)非对称加密签名与加密过程非对称加密的应用对称加密与非对称加密的结合二.数字证书图解一.加解密算法加密简单而言就是通过一种算法将明文信息转换成密文信息,信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程。根据加解密的密钥是否相同,算法可以分为对称加密、非对称加密、对称加密和非

  7. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  8. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  9. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

  10. kvm虚拟机安装centos7基于ubuntu20.04系统 - 2

    需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc

随机推荐