课程设计报告数字秒表的设计

电子技术综合试验

实验报告

                班级:29021070

                                  学号:2902107005

                姓名:杨  林

                                  指导老师:刘 曦

目录

1 引言                                           1

1.1 课程设计的目的                            1

1.2 课程设计的内容                            1

2  EDA、VHDL简介                                1

2.1 EDA技术                                   1

2.2 硬件描述语言——VHDL                      3

3设计过程                                       4

3.1 设计规划                                 4

3.2 各模块的原理及其程序                      5

3.2.1顶层结构体的设计及VHDL源代码          5

3.3秒表各个模块的分析及其VHDL源代码         12

3.3.1控制模块                              12

3.3.2时钟分频模块                          14

3.3.3计时模块                              15

3.3.4秒表显示模块                          17

4系统仿真                                       20

结束语                                          22

1 引言

在科技高度发展的今天,集成电路和计算机应用得到了高速发展。尤其是计算机应用的发展。它在人们日常生活已逐渐崭露头角。大多数电子产品多是由计算机电路组成,

如:手机、mp3等。而且将来的不久他们的身影将会更频繁的出现在我们身边。各种家用电器多会实现微电脑技术。电脑各部分在工作时多是一时间为基准的。本文就是基于计算机电路的时钟脉冲信号、状态控制等原理设计出的数字秒表。秒表在很多领域充当一个重要的角色。在各种比赛中对秒表的精确度要求很高,尤其是一些科学实验。他们对时间精确度达到了几纳秒级别。

1.1 课程设计的目的

本次设计的目的就是在掌握EDA实验开发系统的初步使用基础上,了解EDA技术,对计算机系统中时钟控制系统进一步了解,掌握状态机工作原理,同时了解计算机时钟脉冲是怎么产生和工作的。在掌握所学的计算机组成与结构课程理论知识时。通过对数字秒表的设计,进行理论与实际的结合,提高与计算机有关设计能力,提高分析、解决计算机技术实际问题的能力。通过课程设计深入理解计算机结构与控制实现的技术,达到课程设计的目标。

1.2 课程设计的内容

以FPGA为核心,利用VHDL语言设计基于计算机电路中时钟脉冲原理的数字秒表。该数字秒表能对0秒~59分59.99秒范围进行计时,显示最长时间是59分59秒。设计了复位开关和启停开关。复位开关只可以在秒表暂停的情况下使用,使用以后计时器清零,并做好下一次计时的准备。

2  EDAVHDL简介

2.1 EDA技术

EDA是指以计算机为工作平台,融合了应用电子技术、计算机技术、智能化技术的最新成果而开发出的电子CAD通用软件包,它根据硬件描述语言HDL完成的设计文件,自动完成逻辑编译、化简、分割、综合、优化、布局布线及仿真,直至完成对于特定目标芯片的适配编译、逻辑映射和编程下载等工作。目前EDA主要辅助进行三个方面的设计工作:IC设计、电子电路设计和PCB设计。没有EDA技术的支持,想要完成超大规模集成电路的设计制造是不可想象的;反过来,生产制造技术的不断进步又必将对EDA技术提出新的要求。

2.2 硬件描述语言——VHDL

VHDL的简介

VHDL语言是一种用于电路设计的高级语言。它在80年代的后期出现。最初是由美国国防部开发出来供美军用来提高设计的可靠性和缩减开发周期的一种使用范围较小的设计语言 。但是,由于它在一定程度上满足了当时的设计需求,于是他在1987年成为A I/IEEE的标准(IEEE STD 1076-1987)。1993年更进一步修订,变得更加完备,成为A I/IEEE的A I/IEEE STD 1076-1993标准。目前,大多数的CAD厂商出品的EDA软件都兼容了这种标准。自IEEE公布了VHDL的标准版本,IEEE-1076(简称87版)之后,各EDA公司相继推出了自己的VHDL设计环境,或宣布自己的设计工具可以和VHDL接口。此后VHDL在电子设计领域得到了广泛的接受,并逐步取代了原有的非标准的硬件描述语言。1993年,IEEE对VHDL进行了修订,从更高的抽象层次和系统描述能力上扩展VHDL的内容,公布了新版本的VHDL,即IEEE标准的1076-1993版本,(简称93版)。现在,VHDL和Verilog作为IEEE的工业标准硬件描述语言,又得到众多EDA公司的支持,在电子工程领域,已成为事实上的通用硬件描述语言。有专家认为,在新的世纪中,VHDL于Verilog语言将承担起大部分的数字系统设计任务。

VHDL语言的特点

VHDL的程序结构特点是将一项工程设计,关于用VHDL和原理图输入进行CPLD/FPGA设计的粗略比较:在设计中,如果采用原理图输入的设计方式是比较直观的。你要设计的是什么,你就直接从库中调出来用就行了。这样比较符合人们的习惯。在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可以直接调用这个实体。这种将设计实体分成内外部分的概念是VHDL系统设计的基本点。应用VHDL进行工程设计的优点是多方面的。

(1)与其他的硬件描述语言相比,VHDL具有更强的行为描述能力,从而决定了他成为系统设计领域最佳的硬件描述语言。强大的行为描述能力是避开具体的器件结构,从逻辑行为上描述和设计大规模电子系统的重要保证。

(2)VHDL丰富的仿真语句和库函数,使得在任何大系统的设计早期就能查验设计系统的功能可行性,随时可对设计进行仿真模拟。

(3)VHDL语句的行为描述能力和程序结构决定了他具有支持大规模设计的分解和已有设计的再利用功能。符合市场需求的大规模系统高效,高速的完成必须有多人甚至多个代发组共同并行工作才能实现。

(4)对于用VHDL完成的一个确定的设计,可以利用EDA工具进行逻辑综合和优化,并自动的把VHDL描述设计转变成门级网表。

(5)VHDL对设计的描述具有相对独立性,设计者可以不懂硬件的结构,也不必管理最终设计实现的目标器件是什么,而进行独立的设计。

VHDL的设计流程

它主要包括以下几个步骤:

1.文本编辑:

用任何文本编辑器都可以进行,也可以用专用的HDL编辑环境。通常VHDL文件保存为.vhd文件,Verilog文件保存为.v文件

2.功能仿真:

将文件调入HDL仿真软件进行功能仿真,检查逻辑功能是否正确(也叫前仿真,对简单的设计可以跳过这一步,只在布线完成以后,进行时序仿真)

3.时序仿真:

需要利用在布局布线中获得的精确参数,用仿真软件验证电路的时序。(也叫后仿真) 通常以上过程可以都在PLD/FPGA厂家提供的开发工具。

4.器件编程

3设计过程

3.1 设计规划

     本系统设计采用自顶向下的设计方案,系统的整体组装设计原理图如图3-1所示,它主要由控制模块、时基分频模块,计时模块和显示模块四部分组成。各模块分别完成计时过程的控制功能、计时功能与显示功能。

 


3.2各模块的原理及其程序

 


本系统设计由控制模块、时基分频模块,计时模块和显示模块四部分组成。各模块实现秒表不同的功能 。图3-2就是整个系统原理图。

3.2.1顶层结构体的设计及VHDL源代码

在任何自顶向下的VHDL设计描述中,设计人员常常将整个设计的系统划分为几个模块,然后采用结构描述方式对整个系统进行描述。现在我们就来根据前面描述的结构功能,确定使用哪些模块以及这些模块之间的关系。

   由于秒表的复位开关和启/停开关采用按键的输入方式,其产生时刻和持续时间的长短是随机不定的,且存在因开关簧片反弹引起的电平抖动现象,因此必须在每个开关后面安排一个消抖和同步化电路模块,以保证系统能捕捉到输入脉冲,并保证每按一键,只形成一个宽度为系统时钟周期的脉冲。

由于外部时钟信号clk的频率为48MHz,而实际需要的内部计时时钟频率为100Hz和提供给消抖同步电路的频率为1000Hz,因此需要一个时钟分频电路。通过分频电路,由外部时钟信号clk产生频率分别为100Hz和1000Hz的时钟信号。

秒表的计时操作是在复位开关信号无效并且两次启/停开关信号有效之间才能够进行,因此需要一个电路来产生一个使能信号。只有当使能信号有效时,才能够进行秒表的定时计数操作。

当秒表开始正常计时的时候,需要进行定时计数操作,由于时间显示器是由8个LED七段显示数码管组成的,因此需要产生8位的计时信息:小时十位信号、小时个位信号、分十位信号、分个位信号、秒十位信号、秒个位信号、0.1秒位信号和0.01秒位信号。这个定时计数操作可以有一个定时计数器来完成,定时计数器的功能就是用来产生8位计时信息。

秒表还要将定时计数的结果显示出来,为了节省资源,我们采用循环点亮LED七段显示数码管的方法来显示秒表的计时输出。我们通过信号sel(2 downtown 0)来进行8个LED七段显示数码管的选择,从而将输出信号display(7 downtown 0)送到相应的LED七段显示数码管上以完成跑表计时的显示。跑表显示的功能可以通过一个单独的电路来实现。

 通过上面的说明,不难看出我们可以将秒表系统划分为4个模块时钟分频模块、控制模块(含消抖功能)、秒表计时模块(计数器级联)、和显示模块。

 下面我们就根据各个模块的连接关系来确定各个模块的输入信号和输出信号。

    (1) 控制模块

输入信号

l  启/停开关信号ena;

l  时钟信号clk。

输出信号:

l  去除抖动后的启/停信号:pulse;

l  消除抖动后的使能信号:temp.

(2) 时钟分频模块

输入信号

外部时钟信号clk。

输出信号

l  时钟信号clk1k;

l  时钟信号clk100。

(3) 跑表计时模块

输入信号

l  复位信号clr;

l  内部计时时钟信号clk100;

l  定时计数的使能信号temp。

输出信号

l  小时十位信号hr10;

l  小时个位信号hr;

l  分十位信号min10;

l  分个位信号min;

l  秒十位信号sec10;

l  秒个位信号sec;

l  0.1秒位信号sec01;

l  0.01秒位信号sec001。

这部分模块设计中没有直接生成,直接依靠计数器的级联而成

(5) 显示模块

输入信号

l  外部时钟信号clk;

l  小时十位信号hr10;

l  小时个位信号hr;

l  分十位信号min10;

l  分个位信号min;

l  秒十位信号sec10;

l  秒个位信号sec;

l  0.1秒位信号sec01;

l  0.01秒位信号sec001。

输出信号

l  LED七段显示数码管的选通信号sel;

l  LED七段显示数码管的输出信号display。

下面根据各个模块的连接关系,给出顶层结构体的VHDL源代码。首先在结构体的说明部分进行元件说明,然后在结构体中进行例化调用。同时在结构体的说明部分还定义了许多中间信号,主要用来在模块之间传递信息。

architecture Behavioral of top is

    signal XLXN_1                : std_logic;

    signal XLXN_2                : std_logic;

    signal XLXN_3                : std_logic;

    signal XLXN_4                : std_logic;

    signal XLXN_5                : std_logic;

    signal XLXN_6                : std_logic;

    signal XLXN_7                : std_logic;

    signal XLXN_9                : std_logic;

       signal XLXN_10               : std_logic;

    signal m                     : std_logic_vector (23 downto 0);

  COMPONENT clkgne

        PORT(

                        clkin : IN std_logic;         

                        clkout100 : OUT std_logic;

                        clkout1k : OUT std_logic

                        );

        END COMPONENT;

      COMPONENT count10

      PORT(

                        clk : IN std_logic;

                        clr : IN std_logic;

                        ena : IN std_logic;         

                        cq : OUT std_logic_vector(3 downto 0);

                        dout : OUT std_logic

                        );

      END COMPONENT;

       COMPONENT count6

      PORT(

                        clk : IN std_logic;

                        clr : IN std_logic;

                        ena : IN std_logic;         

                        cq : OUT std_logic_vector(3 downto 0);

                        dout : OUT std_logic

                        );

      END COMPONENT;

      COMPONENT display

      PORT(

                        clkin : IN std_logic;

                        s8 : IN std_logic_vector(3 downto 0);

                        s7 : IN std_logic_vector(3 downto 0);

                        s5 : IN std_logic_vector(3 downto 0);

                        s4 : IN std_logic_vector(3 downto 0);

                        s2 : IN std_logic_vector(3 downto 0);

                        s1 : IN std_logic_vector(3 downto 0);

                        g : OUT std_logic;         

                        display : OUT std_logic_vector(7 downto 0);

                        sel : OUT std_logic_vector(2 downto 0)

                        );

      END COMPONENT;

     

  COMPONENT control

      PORT(

                        ena : IN std_logic;         

                        temp : OUT std_logic;

                        clk: in std_logic;

                        pulse: out std_logic

                        );

      END COMPONENT;

begin

 U1: count10 PORT MAP(

                        clk=>XLXN_1,

                clr=>clr,

                ena=>XLXN_9,

                cq(3 downto 0)=>m(3 downto 0),

                dout=>XLXN_3   );

 U2: count10 PORT MAP(

                        clk=>XLXN_3,

                clr=>clr,

                ena=>XLXN_9,

                cq(3 downto 0)=>m(7 downto 4),

                dout=>XLXN_4);

     

 U3: count10 PORT MAP(

                        clk=>XLXN_4,

                clr=>clr,

                ena=>XLXN_9,

                cq(3 downto 0)=>m(11 downto 8),

                dout=>XLXN_5);

     

 U4: count6 PORT MAP(

                        clk=>XLXN_5,

                clr=>clr,

                ena=>XLXN_9,

                cq(3 downto 0)=>m(15 downto 12),

                dout=>XLXN_6);

                               

 U5: count10 PORT MAP(

                        clk=>XLXN_6,

                clr=>clr,

                ena=>XLXN_9,

                cq(3 downto 0)=>m(19 downto 16),

                dout=>XLXN_7);

     

 U6: count6 PORT MAP(

                        clk=>XLXN_7,

                                          clr=>clr,

                ena=>XLXN_9,

                cq(3 downto 0)=>m(23 downto 20),

                dout=>open);

     

 U7: display PORT MAP(

                        clkin=>XLXN_2,

                s1(3 downto 0)=>m(3 downto 0),

                s2(3 downto 0)=>m(7 downto 4),

                s4(3 downto 0)=>m(11 downto 8),

                                          s5(3 downto 0)=>m(15 downto 12),

                                          s7(3 downto 0)=>m(19 downto 16),

                s8(3 downto 0)=>m(23 downto 20),

                display(7 downto 0)=>DIS(7 downto 0),

                g=>G,

                sel(2 downto 0)=>sel(2 downto 0));

     

 U8: control PORT MAP(

                        ena=>ena,

                                  clk=>clkin,

                                          pulse=>XLXN_10,

                temp=>XLXN_9);

     

 U9: clkgne PORT MAP(

                        clkin=>CLKIN,

                clkout1k=>XLXN_2,

                clkout100=>XLXN_1);

end Behavioral;

3.3秒表各个模块的分析及其VHDL源代码

前面已经详细地讨论了秒表系统顶层的设计及其VHDL源代码,这里将重点介绍各个模块的实现及其VHDL源代码。跑表系统被划分为4个模块,而在顶层设计中是将各个模块作为元件来引用的,因此需要将各个模块设计成为独立实体的形式,这样它们就能作为元件被引用了。

3.3.1控制模块

前面已经提到过,由于秒表的复位开关和启/停开关采用按键的输入方式,其产生时刻和持续时间的长短是随机不定的,且存在因开关簧片反弹引起的电平抖动现象,因此必须在每个开关后面加一个消抖控制。消抖控制的作用是保证系统能捕捉到输入脉冲,并保证每按一键,只形成一个宽度为模块时钟周期的脉冲。

在数字系统中同步消抖电路的形式很多,应用的也十分广泛。前面已经介绍了一种既有消抖功能又有同步功能的电路,但是这个电路只适用于得到一个宽度较大的键输入脉冲。在秒表系统中,要求得到宽度为一个外部时钟信号clk的周期的键入脉冲,因此采用另一种同步消抖电路的形式。该同步消抖电路的功能是:;每按一下启/停开关ena,键输入模块将输出一个宽度为1ms的启/停脉冲pulse。

   该模块功能是产生消抖信号并产生新的使能信号,对计时器进行计时。根据定时关系对该键输入模块进行VHDL描述,功能描述如下面源代码所示。

     ibrary IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

---- Uncomment the following library declaration if instantiating

---- any Xilinx primitives in this code.

--library UNISIM;

--use UNISIM.VComponents.all;

entity control is

    Port ( ena : in  STD_LOGIC;

               clk:in std_logic;

                       pulse:out std_logic;

           temp : out  STD_LOGIC);

end control;

architecture Behavioral of control is

signal temp1: integer range 0 to 1:=0;

signal reg1:std_logic;

signal reg2:std_logic;

signal reg3:std_logic;

signal reg4:std_logic;

signal q1:std_logic;

signal q2:std_logic;

signal reg_pulse:std_logic;

begin

q1<= reg1 and reg2 and reg3 and reg4;

reg_pulse<=q1 and not(q2);

pulse<=reg_pulse;

process(clk)

begin

 if  clk'event and clk='1' then

  reg1<=ena;

  reg2<=reg1;

  reg3<=reg2;

  reg4<=reg3;

  q2<=q1;

 if reg_pulse='1' then

                     temp1<=(temp1+1)mod 2;

                     if temp1=1 then

                     temp<='0';

                     else temp<='1';

         end if;

 end if;

 end if;

end process;

end Behavioral;

3.3.2时钟分频模块

 时钟分频模块的功能是将输入的外部时钟信号clk进行分频,从而产生用来消除抖动的1000Hz的时钟信号clk1k和用于跑表内部定时计数的100Hz的时钟信号clk100。。但是需要注意的是,设计中要求时钟信号clk1和时钟信号clk0的有效脉冲宽度为1ms。

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

---- Uncomment the following library declaration if instantiating

---- any Xilinx primitives in this code.

--library UNISIM;

--use UNISIM.VComponents.all;

entity clkgne is

    Port ( clkin : in  STD_LOGIC;

           clkout100 : out  STD_LOGIC;

           clkout1k : out  STD_LOGIC);

end clkgne;

architecture Behavioral of clkgne is

signal cnt100:integer range 1 to 240000;

       signal cnt1k: integer range 1 to 24000;

       signal clk100:std_logic:='0';

       signal clk1k: std_logic:='0';

begin

process(clkin)

       begin

              if rising_edge(clkin) then

                     if cnt100=240000 then

                            cnt100<=1;

                            clk100<=not clk100;

                     else

                            cnt100<=cnt100+1;

                     end if;

              end if;

             

              if rising_edge(clkin) then

                     if cnt1k=24000 then

                            cnt1k<=1;

                            clk1k<=not clk1k;

                     else

                            cnt1k<=cnt1k+1;

                     end if;

              end if;

       end process;

       clkout100<= clk100;

       clkout1k<=clk1k;

end Behavioral;

3.3.3计时模块

  该模块在实际设计中通过计时器级联而成,分别进行0.01s,1s,1min为单位的计时,通过6位计数器与10位计数器的级联组成,而本次设计中并未将其统一到一个顶层文件,故只写出6位计数器与10位计数器的源程序。

6位计数器

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

---- Uncomment the following library declaration if instantiating

---- any Xilinx primitives in this code.

--library UNISIM;

--use UNISIM.VComponents.all;

entity count6 is

    Port ( clk : in  STD_LOGIC;

           clr : in  STD_LOGIC;

           ena : in  STD_LOGIC;

                       cq : out  STD_LOGIC_VECTOR (3 downto 0);

           dout : out  STD_LOGIC);

end count6;

architecture Behavioral of count6 is

signal cqi:std_logic_vector (3 downto 0):="0000";

begin

cq<=cqi;

       process(clk,clr)

       begin

              if clr='0'  and ena='1' then

                     cqi<="0000";

              elsif rising_edge(clk) then

                     if ena='0' then

                            if cqi="0101" then

                                   cqi<="0000";

                            else

                                   cqi<=cqi+1;

                            end if;

                     end if;

              end if;

       end process;

      

       process(cqi)

       begin

              if cqi="0000" then

                     dout<='1';

              else

                     dout<='0';

              end if;

       end process;

end Behavioral;

     10位计数器

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

---- Uncomment the following library declaration if instantiating

---- any Xilinx primitives in this code.

--library UNISIM;

--use UNISIM.VComponents.all;

entity count10 is

    Port ( clk : in  STD_LOGIC;

           clr : in  STD_LOGIC;

           ena : in  STD_LOGIC;

              cq:   out  STD_LOGIC_VECTOR (3 downto 0);

              dout : out  STD_LOGIC);

end count10;

architecture Behavioral of count10 is

signal cqi:std_logic_vector (3 downto 0):="0000";

begin

cq<=cqi;

    process(clk,clr)

    begin

        if clr='0' and ena='1' then

            cqi<="0000";

        elsif rising_edge(clk) then

            if ena='0' then

                if cqi="1001" then

                    cqi<="0000";

                else

                    cqi<=cqi+1;

                end if;

            end if;

        end if;

    end process;

   

    process(cqi)

    begin

        if cqi="0000" then

            dout<='1';

        else

            dout<='0';

end if;

    end process;

end Behavioral;

3.3.4秒表显示模块

秒表还要将定时计数的结果显示出来,因此需要设计一个秒表显示模块来完成该显示功能秒表显示模块的输入信号主要来自于秒表计时模块输出的计时信息;它的输出信号是sel和display,以用来驱动用于计时显示的8个LED七段显示数码管。在输出信号中,为了节省资源,采用循环点亮LED七段显示数码管的方法来显示跑表的计时输出。通过信号sel(3 downto 0)来进行8个LED七段显示数码管的选择,从而将输出信号display(7 downtown 0)送到相应的LED七段显示数码管上以完成跑表计时的显示。

跑表显示模块的结构框图如图3.7所示。

  秒表显示模块的结构框图

从图中可以看出,跑表显示模块可由四个部分构成:八进制计数器count8、计时位选择电路、七段显示译码电路和显示位选择译码电路。

     源代码如下:

    

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

---- Uncomment the following library declaration if instantiating

---- any Xilinx primitives in this code.

--library UNISIM;

--use UNISIM.VComponents.all;

entity display is

    Port ( clkin : in  STD_LOGIC;

            s8 : in  STD_LOGIC_VECTOR (3 downto 0);

           s7 : in  STD_LOGIC_VECTOR (3 downto 0);

              s5 : in  STD_LOGIC_VECTOR (3 downto 0);

           s4 : in  STD_LOGIC_VECTOR (3 downto 0);

              s2 : in  STD_LOGIC_VECTOR (3 downto 0);

           s1 : in  STD_LOGIC_VECTOR (3 downto 0);

           g : out  STD_LOGIC;

           display : out  STD_LOGIC_VECTOR (7 downto 0);

           sel : out  STD_LOGIC_VECTOR (2 downto 0));

end display;

architecture Behavioral of display is

signal cnt:integer range 0 to 7:=0;

    signal s3: STD_LOGIC_VECTOR(3 DOWNTO 0);

   signal s6: STD_LOGIC_VECTOR(3 DOWNTO 0);

    signal a: STD_LOGIC;

begin

process(clkin)

    variable num: std_logic_vector(3 downto 0);

       

begin

   a<='0';

    g<=a;

    s3(3 downto 0)<="1111";

    s6(3 downto 0)<="1111";

    if rising_edge(clkin)  then

        if cnt=7 then

            cnt<=0;

        else

        cnt<=cnt+1;

        end if;

    case cnt is

        when 0=>sel<="000";num:=s1;

        when 1=>sel<="001";num:=s2;

        when 2=>sel<="010";num:=s3;

        when 3=>sel<="011";num:=s4;

        when 4=>sel<="100";num:=s5;

        when 5=>sel<="101";num:=s6;

      when 6=>sel<="110";num:=s7;

      when 7=>sel<="111";num:=s8;

    end case;

   

    case num is

        when "0000"=>display<="00000011";

        when "0001"=>display<="10011111";

        when "0010"=>display<="00100101";

        when "0011"=>display<="00001101";

        when "0100"=>display<="10011001";

        when "0101"=>display<="01001001";

        when "0110"=>display<="01000001";

        when "0111"=>display<="00011111";

        when "1000"=>display<="00000001";

        when "1001"=>display<="00001001";

        when others=>display<="11111101";

    end case;

    end if;

    end process;

end Behavioral;

4       系统仿真

(1)           时基分频模块的仿真

 

分析:CLK为时钟信号的输入 ,CO为分频输出信号。

(2)           控制模块的仿真

 

分析:CLK、CLR和SP为输入信号,EN为输出信号。

(3)           计时电路模块的仿真

 

 

①  显示电路模块的仿真

 

分析:bcd为时钟脉冲输入信号,led是输出信号,如图所示:当输出为“1111110”时候,输入为“0000”;当输出为“0110000”时输入“0001”,当输入为“0010”时输出为“1101101”,当输入为“0011”时输出为“1111001”等等来实现七段译码功能。

 

结束语

开始做设计时总是会犯一些错误,只有经过不停的改错不停的编译得到正确的程序说明了作为软件编程人员是不能粗心大意的,一个程序的质量的高低与你细心与否有着一定的联系。在编程时,我充分使用了结构化的思想,这样程序检查起来也比较方便,调试时也给了我很大方便,只要一个模块一个模块的进行调就可以了,充分体现了结构化编程的优势。在设计中要求我要有耐心和毅力,还要细心,稍有不慎,一个小小的错误就会导致结果的不正确,而对错误的检查要求我要有足够的耐心,通过这次设计和设计中遇到的问题,也积累了一定的经验,对以后从事集成电路设计工作会有一定的帮助。

在应用VHDL的过程中让我真正领会到了其并行运行与其他软件顺序执行的差别及其在电路设计上的优越性。用VHDL硬件描述语言的形式来进行数字系统的设计方便灵活,利用EDA软件进行编译优化仿真极大地减少了电路设计时间和可能发生的错误,降低了开发成本,这种设计方法在数字系统设计中发挥越来越重要的作用。

相关推荐