当前位置:文档之家› FPGA秒表

FPGA秒表

FPGA秒表
FPGA秒表

电子秒表设计

学院:

专业:

学号:

学生姓名:

指导教师:

第一章引言 (3)

第二章基于FPGA的VHDL设计流程 (3)

2.1VHDL语言介绍 (3)

2.1.1 VHDL的特点 (3)

2.1.2 基于VHDL的自顶向下设计方法 (5)

2.2FPGA开发介绍 (5)

2.2.1 FPGA简介 (5)

2.2.2 FPGA设计流程 (6)

第三章数字秒表单元电路设计与实现 (8)

3.1项目任务与设计思路 (8)

3.2基于VHDL方法的设计方案 (8)

3.3系统电路设计 (9)

3.4 系统单元模块设计与仿真........................................9

3.4.1 分频器.................................................9

3.4.2 十进制计数器....................................... ....11

3.4.3六进制计数器...........................................12

3.4.4 寄存器模块 (14)

3.4.5 显示模块 (17)

3.4.6 使能模块 (19)

3.4.7 按键消抖模块 (20)

第四章数字秒表系统设计与实现 (22)

4.1 电子跑表顶层设计.......................................22

4.2 管脚适配...............................................24

4.3 下载过程........................................................24

4.4 系统硬件实现与调试......................................25 第五章结束语...................................................27

5.1 结果分析................................................27

5.2 总结.....................................................27

摘要

随着电子信息产业的不断发展,基于FPGA的应用技术发展迅速,在某些领域FPGA正逐步代替dsp、arm、单片机等微处理器。本文设计一个基于FPGA技术的数字秒表。首先,我们把晶振产生的48MHZ时钟信号送入FPGA芯片内,经FPGA内分频模块处理产生1KHZ时钟信号。秒表的功能模块由VHDL语言编写,在Xilinx的ISE环境下调试,并在Modelsim上完成仿真,在最后把产生的信号送入LED显示电路里进行显示。本文从电子秒表的具体设计触发,详细阐述了基于FPGA的数字秒表的设计方案,设计了各模块的代码,并对硬件电路进行了仿真。

关键词:EDA;ISE;Modelsim仿真;数字秒表设计;FPGA可编程逻辑器件

●第一章引言

随着电子信息产业的发展,数字系统的规模越来越大,更多采用自顶而下的模块化设计方法,这就要求技术人员对于基本的模块有着深入的理解。随着FPGA 技术的发展和成熟,用FPGA来做为一个电路系统的控制电路逐渐显示出其无与伦比的优越性。因此本文采用FPGA来做为电路的控制系统,采用模块化的设计方法设计一个能显示从00-00-00到59-59-99,并且具备秒表所有功能的小型数字系统。

●第二章基于FPGA的VHDL设计流程

VHDL(Very-high-speed Integrated Circuit Hardware Description Language)诞生于1982年。1987年底,VHDL被IEEE(The Institute of Electrical and Electronics Engineers)和美国国防部确认为标准硬件描述语言。自IEEE公布了VHDL的标准版本(IEEE-1076)之后,各EDA公司相继推出了自己的VHDL设计环境,并宣布自己的设计工具可以和VHDL接口。此后VHDL在电子设计领域得到了广泛的接受,并逐步取代了原有的非标准硬件描述语言。1993年,IEEE对VHDL进行了修订,从更高的抽象层次和系统描述能力上扩展VHDL的内容,公布了新版本的VHDL,即IEEE标准的1076-1993版本。现在,VHDL和VERILOG作为IEEE的工业标准硬件描述语言,又得到众多EDA公司的支持,在电子工程领域,已成为事实上的通用硬件描述语言。有专家认为,在新的世纪中,VHDL和VERILOG语言将承担起几乎全部的数字系统设计任务。

●2.1VHDL语言介绍

●2.1.1VHDL的特点

VHDL主要用于描述数字系统的结构、行为、功能和接口。除了含有许多具

有硬件特征的语句外,VHDL的语言形式,描述风格以及句法十分类似于一般的计算机高级语言。VHDL的程序结构特点是将一项工程设计,或称为设计实体(可以是一个元件、一个电路模块或一个系统)分成外部(又称为可视部分,即端口)和内部(又称为不可视部分),即设计实体的内部功能和算法完成部分。在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其它的设计就可以直接调用这个实体。这种将设计实体分成内外部分的概念是VHDL系统设计的基本点。应用VHDL进行工程设计的优点是多方面的,具体如下:

1、与其它的硬件描述语言相比,VHDL具有更强的行为描述能力,从而决定了它成为系统设计领域最佳的硬件描述语言。强大的行为描述能力是避开具体的器件结构,从逻辑行为上描述和设计大规模电子系统的重要保证。就目前流行的EDA工具和VHDL综合器而言,将基于抽象的行为描述风格的VHDL程序综合成为具体的FPGA和CPLD等目标器件的网表文件已不成问题,只是在综合与优化效率上略有差异。

2、VHDL最初是作为一种仿真标准格式出现的,因此VHDL既是一种硬件电路描述和设计语言,也是一种标准的网表格式,还是一种仿真语言。其丰富的仿真语句和库函数,使得在任何大系统的设计早期(即尚未完成),就能用于查验设计系统的功能可行性,随时可对设计进行仿真模拟。即在远离门级的高层次上进行模拟,使设计者对整个工程设计的结构和功能的可行性做出决策。

3、VHDL语句的行为描述能力和程序结构决定了它具有支持大规模设计的分解和已有设计的再利用功能,符合市场所需求的,大规模系统高效、高速的完成必须由多人甚至多个开发组共同并行工作才能实现的特点。VHDL中设计实体的概念、程序包的概念、设计库的概念为设计的分解和并行工作提供了有力的支持。

4、对于用VHDL完成的一个确定的设计,可以利用EDA工具进行逻辑综合和优化,并自动地把VHDL描述设计转变成为门级网表。这种方式突破了门级电路设计的瓶颈,极大地减少了电路设计的时间和可能发生的错误,降低了开发成本。应用EDA工具的逻辑优化功能,可以自动地把一个综合后的设计变成一个更高效、更高速的电路系统。反过来,设计者还可以容易地从综合和优化后的电路获得设计信息,返回去更新修改VHDL设计描述,使之更为完善。

5、VHDL对设计的描述具有相对独立性,设计者可以不懂硬件的结构,也不必管最终设计实现的目标器件是什么,而进行独立的设计。正因为VHDL硬件描述与具体的工艺技术和硬件结构无关,VHDL设计程序的硬件实现目标器件有广阔的选择范围,其中包括各系列的CPLD、FPGA及各种门阵列实现目标。

6、由于VHDL具有类属描述语句和子程序调用等功能,对于已完成的设计,在不改变源程序的条件下,只需要改变端口类属参量或函数,就能轻易地改变设计的规模和结构。

●2.1.2基于VHDL的自顶向下设计方法

1、设计说明:用自然语言表达系统项目的功能特点和技术参数等。

2、建立VHDL行为模型,即将设计说明已转化为VHDL行为模型。建立模型是为了通过VHDL仿真器对整个系统进行系统行为仿真和性能评估。

3、VHDL行为仿真。这一阶段可以利用VHDL仿真器对顶层系统的行为模型进行仿真测试,检查模拟结果,继而进行修改和完善。

4、VHDL-RTL级建模。即将VHDL的行为模型表达为VHDL行为代码。

5、前端功能仿真。即对VHDL-RTL级模型进行仿真,简称功能仿真。

6、逻辑综合。使用逻辑综合工具将VHDL行为代码描述转化为结构化的门级电路。

7、测试向量生成。

8、功能仿真。

9、结构综合。

10、门级时序仿真。

11、硬件测试。

●2.2FPGA开发介绍

● 2.2.1 FPGA简介

现场可编程门阵列(FPGA)器件是八十年代中期出现的新产品,它的应用大大地方便了IC的设计,因而随着数字技术日益广泛的应用,以FPGA为代表的ASIC器件得到了迅速的普及和发展,器件集成度和速度都在高速增长。

传统的电路设计过程是:先画原理图、把原理图绘制成印制电路板图、再制版、安装、调试。有了FPGA,我们只需要在计算机上绘出原理图,再运行相应的软件,就可把所设计的逻辑电路在FPGA中实现。所有步骤均可自动完成。电子设计工程师自己设计专用集成电路成为了一件很容易的事情。

FPGA作为专用集成电路(ASIC)概念上的一个新型范畴和门类,以其高度灵活的用户现场编程方式,现场定义高容量数字单片系统的能力,能够重复定义、

反复改写的新颖功能,为复杂数字系统设计、研制以及产品开发提供了有效的技术手段。电子应用设计工程师应用FPGA技术不仅可避免通常ASIC单片系统设计周期长,前期投资风险大的弱点,而且克服了过去板级通用数字电路应用设计的落后,繁琐和不可靠性。

目前FPGA的两个重要发展与突破是,大多数厂商在其高端器件上都提供了片上的处理器(如CPU、DSP)等硬核(Hard Core)或固化核(Fixed Core)。比如Xilinx的Virtex II Pro芯片可以提供Power PC,而Altera的Stratix、Excalibur等系列芯片可以提供Nios、DSP和Arm等模块。在FPGA上集成微处理器,使SOPC设计更加便利与强大。另一个发展是在不同器件商推出的高端芯片上大都集成了高速串行收发器,一般能够达到3Gb/s以上的数据处理能力,在Xilinx、Altera、Lattice都有相应的器件型号提供该功能。这些新功能使FPGA 的数据吞吐能力大幅度增强。

2.2.2 FPGA设计流程

对于目标器件为FPGA和CPLD的HDL设计,其工程设计的基本流程如图 2-1所示。现具体说明如下。

图2-1 EDA设计流程

1、文本编辑

用任何文本编辑器都可以进行,通常VHDL文件保存为vhd文件,Verilog 文件保存为v文件。

2、使用编译工具编译源文件

HDL的编译器有很多,ACTIVE公司,MODELSIM公司,SYNPLICITY公司,SYNOPSYS公司,VERIBEST公司等都有自己的编译器。

3、逻辑综合

将源文件调入逻辑综合软件进行综合。综合的目的是在于将设计的源文件由语言转换为实际的电路。但是此时还没有在芯片中形成真正的电路。这一步的最终目的是生成门电路级的网表(Netlist)。

4、布局、布线

将第3步生成的网表文件调入PLD厂家提供的软件中进行布线,即把设计好的逻辑安放到CPLD/FPGA内。这一步的目的是生成用于下载(编程Programming)的编程文件。在这一步,将用到第3步生成的网表,并根据CPLD/FPGA厂商的器件容量,结构等进行布局、布线。这就好像在设计PCB时的布局布线一样。先将各个设计中的门根据网表的内容和器件的结构放在器件的特定部位。然后,在根据网表中提供的各门的连接,把各个门的输入输出连接起来。最后,生成一个供编程的文件。这一步同时还会加一些时序信息(Timing)到你的设计项目中去,以便于你做后仿真。

5、后仿真

利用在布局布线中获得的精确参数,用仿真软件验证电路的时序。(也叫布局布线仿真或时序仿真)。这一步主要是为了确定你的设计在经过布局布线之后,是不是还满足你的设计要求。

6、编程,下载

如果前几步都没有发生错误,并且符合设计要求,这一步就可以将由适配器等产生的配置或下载文件通过编程器或下载电缆下载到目标芯片中。

7、硬件测试

硬件测试的目的是为了在更真实的环境中检验HDL设计的运行情况,特别是对于HDL程序设计上不是十分规范,语义上含有一定歧义的程序。

●第三章数字秒表单元电路设计与实现

●3.1项目任务与设计思路

1.实验项目

数字秒表的设计

2.实验指标

晶振输入信号:48MHZ时钟信号

计时范围范围为:00’00’00到59’59’99

按钮开关:开始/暂停复位回放

在秒表已经被复位的情况下,按下开始/暂停键,秒表开始计时。在秒表正常运行的情况下,如果按下开始/暂停键,则秒表暂

停计时;再次按下该键,秒表继续计时。在秒表正常运行情况下,如

果按下复位键,秒表复位归零。在秒表暂停计时情况下,按下复

位键,秒表复位归零。在秒表正常运行情况下,按下四次回放键,

采集到四组时间数据,此时秒表正常运行,再按下四次回放键,

秒表依次显示第一到四次采集到的时间,按下第九次回放键时,

秒表继续计时。

显示工作方式:用六位BCD七段数码管显示读数。

3.实验思路

根据实验指标,将电路设计分成6个模块:分频器,十进制计数器,六进制计数器,锁存器模块,显示模块,使能模块,按键消陡模块。

●3.2基于VHDL方法的设计方案

设计框图

分频器:由于我们要以1ms为最小单位进行计时。分频器的功能是对晶体振荡器产生的48MHz时钟信号进行分频,产生1KHz的基准信号,

对晶体振荡器产生的时钟信号进行分频,产生时间基准信号。

寄存器:由于我们要实现按不同的键让秒表产生不同的反应。所以需要这个模块对时间基准脉冲进行计数,完成计时功能。并完成对数据

的锁存使显示保持暂停。

使能模块(控制电路):由于我们要实现按不同的键让秒表产生不同的反应。

所以需要这个模块控制计数器的运行、停止以及复位,产生锁存

器的使能信号。

按键消抖模块:由于普通按键会产生抖动现象,有事只想按一下,结果出现多次抖动的现象,使按键不灵敏。所以需要消除按键输入信号

抖动的影响,输出单脉冲。

显示模块:包括扫描计数器、数据选择器和7段译码器,控制8个数码管以扫描方式显示计时结果。

●3.3系统电路设计

●3.4系统单元模块设计与仿真

●3.4.1分频器

分频器的设计采用基于计数器的方法实现。在本设计中,在程序的第一个进程中,设计了一个24000进制的计数器,每当计数24000个时钟,分频输出信号clkout1k取反,这样可实现对输入时钟信号的4800次分频,从而得到1khz的信号;对于频率为100hz的信号,原理相同,分频系数为480000。

电路符号:

仿真程序:

LIBRARY ieee;

USE ieee.std_logic_1164.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

ENTITY tset_fenp IS

END tset_fenp;

ARCHITECTURE behavior OF tset_fenp IS COMPONENT fenp

PORT(

clkin : IN std_logic;

clkout1k : OUT std_logic;

clkout100 : OUT std_logic

);

END COMPONENT;

signal clkin : std_logic := '0';

signal clkout1k : std_logic;

signal clkout100 : std_logic;

constant clkin_period : time := 10 ns;

constant clkout1k_period : time := 10 ns;

constant clkout100_period : time := 10 ns; BEGIN

uut: fenp PORT MAP (

clkin => clkin,

clkout1k => clkout1k,

clkout100 => clkout100

);

clkin_process :process

begin

clkin <= '0';

wait for clkin_period/2;

clkin <= '1';

wait for clkin_period/2;

end process;

stim_proc: process

begin

wait for 100 ns;

wait for clkin_period*10;

wait;

end process;

END;

仿真结果:

3.4.2十进制计数器

要求秒表显示为六位,每一位可以视为一个一位计数器,则跑表的计时过程可由6个一位计数器级联完成。十进制计数器模块如下图所示。

其中reset是清零端,clk100是计数信号输入端,carryin是计数使能端,

即为高电平计数,低电平时停止计数且保持不变。carryout是进位信号,

countout是计数结果输出。当reset为1时,计数值清零;当reset为0且

carryin进位为1时,每出现一个时钟上升沿,计数值加1;当计数到9后,

carryout输出为1,countout为四位二进制的计数值输出。

电路符号:

仿真程序:

LIBRARY ieee;

USE ieee.std_logic_1164.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

ENTITY test_10 IS

END test_10;

ARCHITECTURE behavior OF test_10 IS

COMPONENT COUNTER10

PORT(

rst : IN std_logic;

clk : IN std_logic;

carryin : IN std_logic;

carryout : OUT std_logic;

countout : OUT std_logic_vector(3 downto 0)

);

END COMPONENT;

signal rst : std_logic := '0';

signal clk : std_logic := '0';

signal carryin : std_logic := '1';

signal carryout : std_logic;

signal countout : std_logic_vector(3 downto 0);

constant clk_period : time := 10 ns;

BEGIN

uut: COUNTER10 PORT MAP (

rst => rst,

clk => clk,

carryin => carryin,

carryout => carryout,

countout => countout

);

clk_process :process

begin

clk <= '0';

wait for clk_period/2;

clk <= '1';

wait for clk_period/2;

end process;

stim_proc: process

begin

-- hold reset state for 100 ns.

rst<='0';

wait for 100 ns;

wait for clk_period*10;

wait;

end process;

END;

仿真波形:

3.4.3六进制计数器

六进制计数器模块下图所示。其中reset是清零端,clk是计数信号输入端,carryin是计数使能端,即为高电平时计数,低电平时停止计数且保持计数不变。countout是计数结果输出,carryout是进位信号。

当reset为1时,计数值清零;当reset为0且carryin进位为1时,每出现一个clk上升沿,计数值加1;当计数到5后,carryout输出为1,countout为四位二进制的计数值输出。

电路符号:

仿真程序:

LIBRARY ieee;

USE ieee.std_logic_1164.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

ENTITY test_6 IS

END test_6;

ARCHITECTURE behavior OF test_6 IS

COMPONENT COUNTER6

PORT(

rst : IN std_logic;

clk : IN std_logic;

carryin : IN std_logic;

carryout : OUT std_logic;

countout : OUT std_logic_vector(3 downto 0)

);

END COMPONENT;

signal rst : std_logic := '0';

signal clk : std_logic := '0';

signal carryin : std_logic := '1';

signal carryout : std_logic;

signal countout : std_logic_vector(3 downto 0);

constant clk_period : time := 10 ns;

BEGIN

uut: COUNTER6 PORT MAP (

rst => rst,

clk => clk,

carryin => carryin,

carryout => carryout,

countout => countout

);

clk_process :process

begin

clk <= '0';

wait for clk_period/2;

clk <= '1';

wait for clk_period/2;

end process;

stim_proc: process

begin

rst<='0';wait for 100 ns;

wait for clk_period*10;

wait;

end process;

END;

仿真波形:

3.4.4寄存器模块

用于存放采集的四组数据。

电路符号:

仿真程序:

LIBRARY ieee;

USE ieee.std_logic_1164.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

ENTITY testjcq IS

END testjcq;

ARCHITECTURE behavior OF testjcq IS

COMPONENT jicq

PORT(

anjian : IN std_logic;

reset : IN std_logic;

mhin : IN std_logic_vector(3 downto 0);

mlin : IN std_logic_vector(3 downto 0);

shin : IN std_logic_vector(3 downto 0);

slin : IN std_logic_vector(3 downto 0);

dsin : IN std_logic_vector(3 downto 0);

csin : IN std_logic_vector(3 downto 0);

mhout : OUT std_logic_vector(3 downto 0);

mlout : OUT std_logic_vector(3 downto 0);

shout : OUT std_logic_vector(3 downto 0);

slout : OUT std_logic_vector(3 downto 0);

dsout : OUT std_logic_vector(3 downto 0);

csout : OUT std_logic_vector(3 downto 0)

);

END COMPONENT;

signal anjian : std_logic := '0';

signal reset : std_logic := '0';

signal mhin : std_logic_vector(3 downto 0) := (others => '0');

signal mlin : std_logic_vector(3 downto 0) := (others => '0');

signal shin : std_logic_vector(3 downto 0) := (others => '0');

signal slin : std_logic_vector(3 downto 0) := (others => '0');

signal dsin : std_logic_vector(3 downto 0) := (others => '0');

signal csin : std_logic_vector(3 downto 0) := (others => '0');

signal mhout : std_logic_vector(3 downto 0);

signal mlout : std_logic_vector(3 downto 0);

signal shout : std_logic_vector(3 downto 0);

signal slout : std_logic_vector(3 downto 0);

signal dsout : std_logic_vector(3 downto 0);

signal csout : std_logic_vector(3 downto 0);

BEGIN

uut: jicq PORT MAP (

anjian => anjian,

reset => reset,

mhin => mhin,

mlin => mlin,

shin => shin,

slin => slin,

dsin => dsin,

csin => csin,

mhout => mhout,

mlout => mlout,

shout => shout,

slout => slout,

dsout => dsout,

csout => csout

);

stim_proc: process

begin

anjian<='0';mhin<="0001";mlin<="0010";shin<="0001";slin<="0010";dsin<="000 1";csin<="0010";

wait for 100 ns;

anjian<='1';

wait for 100 ns;

anjian<='0';mhin<="0011";mlin<="0100";shin<="0011";slin<="0100";dsin<="001 1";csin<="0100";

wait for 100 ns;

anjian<='1';

wait for 100 ns;

anjian<='0';mhin<="0101";mlin<="0110";shin<="0101";slin<="0110";dsin<="010

1";csin<="0110";

wait for 100 ns;

anjian<='1';

wait for 100 ns;

anjian<='0';mhin<="0111";mlin<="1000";shin<="0111";slin<="1000";dsin<="011 1";csin<="1000";

wait for 100 ns;

anjian<='1';

wait for 100 ns;

anjian<='0';

wait for 100 ns;

anjian<='1';

wait for 100 ns;

anjian<='0';

wait for 100 ns;

anjian<='1';

wait for 100 ns;

anjian<='0';

wait for 100 ns;

anjian<='1';

wait for 100 ns;

anjian<='0';

wait for 100 ns;

anjian<='1';

wait for 100 ns;

anjian<='0';

wait for 100 ns;

anjian<='1';

wait for 100 ns;

wait;

end process;

END;

仿真波形:

3.4.5显示模块

本设计中6只数码管采用动态扫描方式连接。硬件电路上每个数码管mh,ml,sh,sl,ds,cs分别连在一起,作为段选信号。

8个数码管分别由8个通选信号控制,被选通的数码管显示数据,其余关

闭。根据硬件电路连接方式,如果希望6个数码管同时显示不同数据,

就需要采用动态扫描的方式,当选中某一个数码管时同时送入期望该数

码管显示的数据,这样由于人眼视觉暂留效应,只要扫描信号足够快,

数码管看起来就像是同时显示不同数据。因此数码管的位选和段选信号

必须同步,同时需要一个多功器,其输入端分别送入期望显示的数字,

选择信号为与数码管位选同步信号,输出端即为数码管的段选信号。

根据动态扫描原理和设计要求,显示控制模块应包含一个六进制计数器、六选一数据选择器、六位输出位选器和七段译码器。六进制计数

器的时钟信号频率为1Khz,计数输出作为位选器控制信号cnt和数据选

择器的地址控制信号,位选器的输出即为位选控制信号sel(7:0),数

据选择器的数据端为要显示的6位数据mh,ml,sh,sl,ds,

cs,根据地址信号控制选择其中一组输出至译码器,译码器将数据翻

译为段选控制信号led(6:0)。

电路符号:

仿真程序:

LIBRARY ieee;

USE ieee.std_logic_1164.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

ENTITY test_mul IS

END test_mul;

ARCHITECTURE behavior OF test_mul IS

COMPONENT MLUTIXXX

PORT(

clk : IN std_logic;

mh : IN std_logic_vector(3 downto 0);

ml : IN std_logic_vector(3 downto 0);

sh : IN std_logic_vector(3 downto 0);

sl : IN std_logic_vector(3 downto 0);

ds : IN std_logic_vector(3 downto 0);

cs : IN std_logic_vector(3 downto 0);

sel : OUT std_logic_vector(7 downto 0);

led : OUT std_logic_vector(6 downto 0)

);

END COMPONENT;

signal clk : std_logic := '0';

signal mh : std_logic_vector(3 downto 0) := (others => '0');

signal ml : std_logic_vector(3 downto 0) := (others => '0');

signal sh : std_logic_vector(3 downto 0) := (others => '0');

signal sl : std_logic_vector(3 downto 0) := (others => '0');

signal ds : std_logic_vector(3 downto 0) := (others => '0');

signal cs : std_logic_vector(3 downto 0) := (others => '0');

signal sel : std_logic_vector(7 downto 0);

signal led : std_logic_vector(6 downto 0);

constant clk_period : time := 10 ns;

BEGIN

uut: MLUTIXXX PORT MAP (

clk => clk,

mh => mh,

ml => ml,

sh => sh,

sl => sl,

ds => ds,

cs => cs,

sel => sel,

led => led

);

clk_process :process

begin

clk <= '0';

wait for clk_period/2;

clk <= '1';

wait for clk_period/2;

end process;

stim_proc: process

begin

mh<="0000"; wait for 100ns;

ml<="0001"; wait for 100 ns;

sh<="0010"; wait for 100 ns;

sl<="0011"; wait for 100 ns;

ds<="0100"; wait for 100 ns;

cs<="0101"; wait for 100 ns;

wait for clk_period*10;

wait;

end process;

END;

仿真波形:

3.4.6使能模块

使能模块的功能是产生计数器的使能控制信号。根据系统设计要求,设置开始计时/停止计时按键,该按键每按一次,跑表开始或停止

计时,再按一次,停止/开始计时。因此使能模块的功能应为在输入时

钟信号的作用下,输出状态发生翻转。

电路符号:

仿真程序:

LIBRARY ieee;

USE ieee.std_logic_1164.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

ENTITY tsetqqqqqqqqq IS

END tsetqqqqqqqqq;

ARCHITECTURE behavior OF tsetqqqqqqqqq IS

COMPONENT shineng

PORT(

s : IN std_logic;

e : OUT std_logic

);

END COMPONENT;

signal s : std_logic := '0';

signal e : std_logic;

BEGIN

uut: shineng PORT MAP (

s => s,

e => e

);

stim_proc: process

begin

s<='0';wait for 100 ns;

s<='1';wait for 100 ns;

s<='0';wait for 100 ns;

s<='1';wait for 100 ns;

s<='0';wait for 100 ns;

s<='1';wait for 100 ns;

s<='0';wait for 100 ns;

s<='1';wait for 100 ns;

s<='0';wait for 100 ns;

s<='1';wait for 100 ns;

s<='0';wait for 100 ns;

s<='1';wait for 100 ns;

s<='0';wait for 100 ns;

s<='1';wait for 100 ns;

s<='0';wait for 100 ns;

s<='1';wait for 100 ns;

wait;

end process;

END;

仿真波形:

3.4.7按键消抖模块

由于实验板上的按键,在按下和松开的短暂时间里,会出现抖动现象,这样会严重影响按键的效果,故此需要设计一个消抖电路,来

消除这种不利的影响,按键消抖电路不仅可以消除按键抖动的影响,

而且每按一次键,只输出一个脉冲,其宽度为一个时钟周期,达到整

形的作用,按键消抖电路是利用时间基准信号对按键按下时产生的

抖动进行整形,使其输出为正常的脉冲信号的。

电路符号:

相关主题
文本预览
相关文档 最新文档