找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4505|回复: 1
收起左侧

VHDL语言设计基于计算机电路中时钟脉冲原理的数字秒表

[复制链接]
ID:464703 发表于 2019-1-8 16:25 | 显示全部楼层 |阅读模式

目录

内容摘要

一、概述

二、实验目的

三、实验原理

四、设计方案

五、设计方法论证

(1)将每个模块生成电路元件,利用电路连接图的方式

(2)利用元件例化的方法

六、设计过程

(1)计时、控制模块

1)分频器的设计

2)计数器的设计

(2)显示模块

1)扫描电路

2)七段译码

(3)报警器电路

(4)元件例化

七、波形仿真

八、设备验证

(1)引脚分配

(2)程序下载

(3)设备验证

九、设计心得及体会


内容摘要
在科技高度发展的今天,集成电路和计算机应用得到了高速发展。尤其是计算机应用的发展。它在人们日常生活已逐渐崭露头角。大多数电子产品多是由计算机电路组成,
如:手机、mp3等。而且将来的不久他们的身影将会更频繁的出现在我们身边。各种家用电器多会实现微电脑技术。电脑各部分在工作时多是一时间为基准的。 本报告就是基于计算机电路的时钟脉冲信号、状态控制等原理,运用EDA技术及VHDL语言设计出的数字秒表。秒表在很多领域充当一个重要的角色。在各种比赛中对秒表的精确度要求很高,尤其是一些科学实验,他们对时间精确度达到了几纳秒级别。
利用VHDL语言设计基于计算机电路中时钟脉冲原理的数字秒表。该数字秒表能对0秒~59分59.99秒范围进行计时,显示最长时间是59分59秒,超过该时间能够进行报警。计时精度达到10ms。设计了复位开关和启停开关。复位开关可以在任何情况下使用,使用以后计时器清零,并做好下一次计时的准备。

一、概述
EDA是指以计算机为工作平台,融合了应用电子技术、计算机技术、智能化技术的最新成果而开发出的电子通用软件包,它根据硬件描述语言VHDL完成的设计文件,自动完成逻辑编译、化简、分割、综合、优化、布局布线及仿真,直至完成对于特定目标芯片的适配编译、逻辑映射和编程下载等工作。随着科技发展,在现代生活中,计数器应用越来越广泛。EDA技术的应用引起电子产品即系统开发的革命性变革,在Quartus II环境下采用VHDL语言实现,论述了基于VHDL语言在FPGA芯片的数字设计思想与实现过程。本设计是以VHDL语言为基础的数字秒表。在数字秒表的程序中应用了四个10进制计数器和两个6进制计数器,以及报警器、选择器和显示译码器等。
电子设计自动化技术EDA的发展给电子系统的设计带来了革命性变化,EDA软件设计工具,硬件描述语言,可编程逻辑器件(PLD)使得EDA技术的应用走向普及。VHDL语言是EDA的关键技术之一,它采用自顶向下的设计方法,完成系统的整体设计。
二、实验目的
通过本次课设,加深对EDA技术设计的理解,学会用QuartusⅡ工具软件设计基本电路,熟练掌握VHDL语言,为以后工作使用打下坚实的基础。
三、实验原理
秒表工作原理和多少数字电子钟大致一样,不同的是秒表为0.01秒,整个秒表的时钟信号输入为50MHZ。所以,需要对时钟信号进行分频 假设该秒表应用场合小于1小时,秒表的显示格式为mm-ss-xx(mm表示分钟:0~59;ss表示秒:0~59;xx表示百分之一秒:0~99)。
利用试验箱产生的CLK冲激作为时钟信号的基准信号,通过显示和计时模块在试验箱的LED显示。
四、设计方案
    本系统设计采用自顶向下的设计方案,系统的整体组装设计原理图如图1所示,它主要由控制模块、分频模块,计时模块、显示模块和报警模块五部分组成。各模块分别完成计时过程的控制功能、计时功能与显示功能。


  • 控制模块
计时控制模块主要是对计时过程进行控制。计时控制模块可以由两个按钮开关来完成秒表的启动,停止和复位。
  • 计时模块
计时模块实现的是计时功能,及时的方法是对标准时钟脉冲计数。由于秒表的计时范围是0秒~59分59.99秒,所以计数器可以由四个十进制计数器和两个六进制计数器构成,其中毫秒位,秒位和分位采用十进制计数器来实现,十秒位和十分位采用六进制计数器。
  • 显示模块
计时显示模块是将计时值在LED七段数码管显示出来。
  • 报警电路
当计时达60分钟后,蜂鸣器鸣响10声
   最终底层文件生成设计实体可采用两种方式
五、设计方法论证
(1)将每个模块生成电路元件,利用电路连接图的方式
如图2所示
图2 电路原理图
(2)利用元件例化的方法

六、设计过程

(1)计时、控制模块
1)分频器的设计:
     由于本设计中需要用到精确的100Hz计时脉冲,因此分频器的设计显得尤为重要。考虑到实验箱上输出频率的限制及所产生及时脉冲的精度要求,采用由50MHz的时钟脉冲经过分频器产生100Hz的计时脉冲。计时控制模块的作用是将按键信号转变为计时器的控制信号。计时控制模块可用两个按钮来完成秒表的启动、停止和复位,即启动/暂停键和清零键,由它们产生计数允许/保持和清零信号。K为启动/暂停键输入信号,K=0时表示按下,K=1时表示松开。
分频器的设计程序源代码如下:
ibrary ieee;
use ieee.std_logic_1164.all;
entity div is
port(clr,clk: in std_logic;
     q: buffer std_logic);
end div;
architecture a of div is
signal count:integer range 0 to 499999;    --设置定时范围
begin
process(clr,clk)
begin
if (clk'event and clk='1') then --当计时脉冲上升沿出发
if clr='1' then              --清零开关使能端
count<=0;
elsif count=499999 then
count<=0;
q<= not q;
else
count<=count+1;
end if;
end if;
end process;
end a;
生成的电路元件图如图3所示
图3
2)计数器的设计:
本实验需要六进制计数器和十进制计数器配合使用。计时方法和计算机一样是对标准时钟脉冲计数。计时模块是由四个十进制计数器和两个六进制计数器构成的。其中毫秒位、十毫秒位、秒位和分位采用十进制计数器,十秒位和十分位采用六进制计数器。
library ieee;                  --六进制计数器
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity count6 is
port (clk,start,clr : in std_logic;
cout : out std_logic;
daout : out std_logic_vector(3 downto 0));--定义输出数据范围
end count6;
architecture two of count6 is
signal q0 : std_logic_vector(3 downto 0);
signal q1 : std_logic;
begin
process(clk,clr)
begin
if clr='1' then q0<="0000";
              elsif ( clk'event and clk='1') then              --当上升沿来时动作
                            if start='1' then
         if q0="0101" then q0<="0000";q1<='1';--限制计数范围
         else q0<=q0+1;q1<='0';             --进行计数
        end if;
              end if;
end if;
end process;
daout<= q0;
cout<=q1;
end two;

生成的电路元件图如图4所示
图4

library ieee;                            --十进制计数器
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity count10 is
port (clk,start,clr : in std_logic;
                                                        cout : out std_logic;
                                                        daout : out std_logic_vector(3 downto 0));
end count10;
architecture one of count10 is
signal q0 : std_logic_vector(3 downto 0);
signal q1 : std_logic;
begin
process(clk,clr)
begin
if clr='1' then q0<="0000";
              elsif ( clk'event and clk='1') then              --判断上升沿动作
                            if start='1' then
         if q0="1001" then q0<="0000";q1<='1'; --计数范围限制在10
         else q0<=q0+1;q1<='0';             --计数
        end if;
              end if;
end if;
end process;
daout<= q0;
cout<=q1;
end one;

生成的电路元件图如图5所示
图5
(2)显示模块
计时显示电路的作用是将计时值在LED数码管上显示出来。计时电路产生的值经过BCD七段译码后,驱动LED数码管。计时显示电路的实现方案采用扫描显示。其中包括选择器和七段译码器。选择器中包含了对数码管的片选信号、位选信号及小数点的设置。
1扫描电路
数码管动态扫描就是以一定的频率依次点亮多个数码管的段位,只要频率足够大,人眼无法识别出,就会形成多个数码管同时亮的现象。段选信号负责选择哪个数码管亮,位选信号负责控制该数码管上亮的位置。

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity seltime is
              port(clr,clk: in bit;
dain0,dain1,dain2,dain3,dain4,dain5,dain6: in std_logic_vector(3 downto 0);       --定义数据
      sel: out std_logic_vector(3 downto 0);--段选信号
      daout: out std_logic_vector(3 downto 0));--位选信号
end seltime;
architecture a of seltime is
signal temp:integer range 0 to 6;
begin
  process(clk)                                                                      --根据时钟脉冲进行动作
     begin
       if (clr='1') then                                                         --清零使能端
             daout<="0000";
             sel<="0000";
             temp<=0;    --当清零信号产生后将LED归零
       elsif (clk='1'and clk'event) then  --当时钟上升沿时执行
            if temp=6 then temp<=0;
            else temp<=temp + 1;
            end if;         
              case temp is                                                        --控制LED
                when 0=>sel<="0000";daout<=dain0;
                when 1=>sel<="0001";daout<=dain1;
                when 2=>sel<="0010";daout<=dain2;
                when 3=>sel<="0011";daout<=dain3;
                when 4=>sel<="0100";daout<=dain4;
                when 5=>sel<="0101";daout<=dain5;
                when 6=>sel<="0110";daout<=dain6;
              end case;
       end if;
  end process;
end a;
生成的电路元件图如图6所示
图6
2七段译码
数码管是共阴极触发亮度,七段数码管由八位数据控制,数码管首先从上到右,到下到左,到中间,最后到小数点分别标记为a、b、c、d、e、f、g、dp八段其中小数点位DP为最高位,a段为最低位,要想显示什么字符只需要使对应的段发光即可。
library ieee;
use ieee.std_logic_1164.all;
entity deled is
     port(num:in std_logic_vector(3 downto 0);
         led:out std_logic_vector(6 downto 0));
end deled ;
architecture a of deled is
begin
  process(num)
    begin
      case num is                                                        
         when"0000"=>led<="0111111";--显示0
         when"0001"=>led<="0000110";--显示1
         when"0010"=>led<="1011011";--显示2
         when"0011"=>led<="1001111";--显示3
         when"0100"=>led<="1100110";--显示4
         when"0101"=>led<="1101101";--显示5
         when"0110"=>led<="1111101";--显示6
         when"0111"=>led<="0100111";--显示7
         when"1000"=>led<="1111111";--显示8
         when"1001"=>led<="1101111";--显示9
         when others=>led<="0000000";--其他情况下为0
    end case;
   end process;
end a;
生成的电路元件图如图7所示
图7

3)报警器电路
报警模块的设计是利用蜂鸣器的发声原理。当计数器计满59分钟后会产生进位信号,在蜂鸣器的一端输入高电平时蜂鸣器发生,产生报警声。
源代码:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity alarm is
port(clk,I:in std_logic;
     q:out std_logic        --报警输出
     );
end alarm;
architecture ar of alarm is
signal n:integer range 0 to 9;
signal q0:std_logic;
begin
process(clk)
begin
if clk'event and clk='1'
then
if i='0' then q0<='0';
n<=0;
elsif n<=9 and i='1' then  --计数满60分后报警输出,重新计数
q0<=not q0;
n<=n+1;
else q0<='0';
end if;
end if;
end process;
q<=q0;
end ar;
生成的电路元件图如图8所示
图8
4)元件例化
元件例化是用含有完整程序结构的VHDL表述来构成自顶而下层次化设计的一种重要手段。将已经设计完成的底层文件调用构建成一个完整的电路文件。将要引用的文件放入例化文件目录下。
library ieee;
use ieee.std_logic_1164.all;
entity mb_top is
port (
       stop,start,clk:in std_logic;
       a,b,c,d,e,f,g,speaker:out std_logic;
       sel:out std_logic_vector(3 downto 0);
       vga:out std_logic_vector(3 downto 0));--选择电路上的数码管
end mb_top;
architecture a of mb_top is
component div                                          --分频器
port(clr,clk: in std_logic;
           q: buffer std_logic);
end component;
component count10                            --10进制计数器
port(
     clr,start,clk:in std_logic;
     cout:out std_logic;
     daout:buffer std_logic_vector(3 downto 0));
end component;
component count6                             --6进制计数器
port(
     clr,start,clk:in std_logic;
     cout:out std_logic;
     daout:buffer std_logic_vector(3 downto 0));
end component;
component seltime                            --数据选择器
port(
     clr,clk:in std_logic;
     dain0:in std_logic_vector(3 downto 0);
     dain1:in std_logic_vector(3 downto 0);
     dain2:in std_logic_vector(3 downto 0);
     dain3:in std_logic_vector(3 downto 0);
     dain4:in std_logic_vector(3 downto 0);
     dain5:in std_logic_vector(3 downto 0);
     sel:out std_logic_vector(3 downto 0);
     daout:out std_logic_vector(3 downto 0));
end component;
component deled
port(
     num:in std_logic_vector(3 downto 0);
    led:out std_logic_vector(6 downto 0));
end component;
component alarm                            --报警电路
port(
     clk,i,clr:in std_logic;
     q:out std_logic);
end component;
signal div_q,b_cout,s_cout,m_cout,sm_cout,f_cout,sf_cout:std_logic;
signal b_daout,s_daout,m_daout,sm_daout,f_daout,sf_daout,seltime_daout:std_logic_vector(3 downto 0);
signal ledout:std_logic_vector(6 downto 0);
begin
vga<="1011";                                          --写入vga调用电路板上的数码管
a<=ledout(0);b<=ledout(1);c<=ledout(2);d<=ledout(3);
e<=ledout(4);f<=ledout(5);g<=ledout(6);
u1:div port map(stop,clk,div_q);                            --元件位置
u2:count10 port map(stop,start,div_q,b_cout,b_daout);
u3:count10 port map(stop,start,b_cout,s_cout,s_daout);
u4:count10 port map(stop,start,s_cout,m_cout,m_daout);
u5:count6  port map(stop,start,m_cout,sm_cout,sm_daout);
u6:count10 port map(stop,start,sm_cout,f_cout,f_daout);
u7:count6  port map(stop,start,f_cout,sf_cout,sf_daout);
u8:seltime port map(stop,div_q,b_daout,s_daout,m_daout,sm_daout,f_daout,sf_daout,sel,seltime_daout);
u9:deled port map(seltime_daout,ledout);
u10:alarm port map(div_q,sf_cout,speaker);
end a;
七、波形仿真
  • 十进制计数器

  • 六进制计数器


  • 蜂鸣器


  • 译码器


  • 控制选择器

八、设备验证1)引脚分配
图9引脚分配图
2)程序下载
图10下载图

3)设备验证
图11 实验结果图
九、设计心得及体会
通过此次课程设计,让我对EDA这门技术有了更深的体会,并更好的学会了使用QuartusⅡ软件进行硬件设计。
在编写程序的过程中,遇到了很多问题,使我发现自己以前学习上存在的不足。通过与同学探讨和请教老师,终于把问题都解决了,并加深了对数字时钟原理和设计思路的了解。同时我也掌握了做课程设计的一般流程,为以后的电子设计这块积累了一定的经验,为以后从事相关工作有一些帮助。最终解决了问题,攥写成报告。
通过对设计对实现和对报告对撰写,深深体会到了VHDL语言和EDA技术的一些技巧和设计思想,在完成设计的过程中,应该具有很清晰地思路,才可以使电路更完美和简便,要敢想敢做但是不应该有投机取巧的心理。在完成每一步的时候都有意想不到的收获也有可能导致错误,所以在设计对过程中要集中精神。在写报告的过程中,更加凸显了细心二字。不可自认为完美,必须按照格式要求来撰写自己的报告,所以必须做到足够的精确。
利用EDA工具,电子设计师可以从概念、算法、协议等开始设计电子系统,大量工作可以通过计算机完成,并可以将电子产品从电路设计、性能分析到设计版图的整个过程的计算机上自动处理完成。在进行设计时并不束缚设计者的想象力,这使得自学、扩展也可以很容易实现。在设计中充分的认识到EDA课程对硬件设计的重要性,若把本门课程学好、学精,对硬件设计将有很大对帮助。以后若有机会我将会利用更多时间来学习EDA技术、更加深入的学习EDA技术。EDA技术以其独有的优点和应用范围有着非常好的发展前景,是近几年电子工业的发展趋向,中国的EDA行业发展十分迅速,有着很大的潜力。所以我们学好这门课程是十分必要的,我们不应该仅仅拘泥于一门课程的学习,要结合各学科的连接点,把我们的知识串联起来。为我们的未来做好知识储备。
以上就我关于这次课程设计的想法,在以后,我会用更多的时间去了解EDA。并且提高自己的知识水平。

以上图文的Word格式文档下载(内容和本网页上的一模一样,方便大家保存):
秒表实验报告.docx (1.94 MB, 下载次数: 27)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:464703 发表于 2019-1-10 02:18 | 显示全部楼层
本实验报告应用为EL-socp3000电路板
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表