vhdl秒表 实验报告

更新时间:2024-01-19 07:36:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

EDA大作业实验报告

——数字秒表的设计实验

一 、实验目的:

1.通过实验了解数字秒表的工作原理,并实现。

2.进一步熟悉VHDL语言的编写驱动七段数码管显示的代码,熟悉quartes2软件的操作。 3.掌握VHDL编写的一些技巧。 二、实验要求:

1. 数字秒表的计数范围是0秒~59分59.99秒,即有分、秒、1%秒显示,显示的最长

时间为59分59秒。

2. 数字秒表的计时精度是10ms。

3. 复位开关可以在任何情况下使用,即便在计时过程,只要按下复位开关,计时器就

清零,并做好下次计时的准备。

4. 具有启/停开关,即按一下此开关,则可以启动计时器开始计时,再按一下此开关便

可以停止计时。 。

三、系统设计方案:

根据系统的设计要求,可以的到如图1的系统组成框图。系统设计采用自顶向下的设计方法,系统的整体组装设计原理图如图2所示,它主要由控制模块,分频模块,计时模块和显示模块四部分组成。

秒表工作原理和多少数字电子钟大致一样,不同的是秒表为0.01秒,整个秒表的时钟信号输入为40MHZ。所以,需要对时钟信号进行分频 假设该秒表应用场合小于1小时,秒表的显示格式为mm-ss-xx(mm表示分钟:0~59;ss表示秒:0~59;xx表示百分之一秒:0~99)。

(1) 控制模块

计时控制模块主要是对计时过程进行控制。计时控制模块可以由两个按钮开关来完成秒表的启动,停止和复位。 (2) 计时模块

计时模块实现的是计时功能,及时的方法是对标准时钟脉冲计数。由于秒表的计时范围是0秒~59分59.99秒,所以计数器可以由四个十进制计数器和两个六进制计数器构成,其中毫秒位,秒位和分位采用十进制计数器来实现,十秒位和十分位采用六进制计数器。 (3) 显示模块

计时显示模块是将计时值在LED七段数码管显示出来。 数字秒表 计时电路 计时控制电 控制状态机 分频电路 计数器 显示电路 七段译码器

一百进制计数器 十进制计数器

图一,系统组成框图

该时钟以六进制加法器和十进制加法器连接而成。 故原理图方案:整个秒表由两个六进制和四个十进制搭接而成(原理图如下)。 其中mh表示分钟的高位,ml表示分钟的地位,sh表示秒的高位,sl表示秒的地位,s100h表示十分之一秒,s100l表示百分之一秒。实验使用了异步使能,异步清零。时钟信号为100HZ。

图二,系统的整体组装设计原理图

四.源程序

1. 40MHZ分频器的设计程序: library IEEE;

use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity FP400K is

Port ( RESET : in std_logic; CLK : in std_logic;

CLKOUT : out std_logic); end FP400K;

architecture Behavioral of FP400K is

signal div_val : integer range 0 to 200000; --分频值=256*2 signal div_clk : std_logic;--因为CLKOUT是out类型, --故不能在 <=的右边,

--用div_clk来暂存

begin

process(CLK,RESET) begin

if(RESET='0') then--RESET的优先级最高 div_clk <= '0';

elsif(CLK'event and CLK='1') then --'event是指

--信号的属性,意为此信号不稳定, --再加上CLK='1',故此句判断CLK的上升沿 if(div_val=200000) then div_val <= 0;

div_clk <= not div_clk; else

div_val <= div_val + 1;--在CLK的上升

--沿div_val自加1,加到256时清零并将div_clk取反 end if; end if; end process;

CLKOUT <= div_clk;

end Behavioral;

2.:十进制计数器源程序:

--cnt10

LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY cnt10 IS PORT(clr:IN STD_LOGIC; en,clk:IN STD_LOGIC; co : out std_logic; cnt:BUFFER INTEGER RANGE 9 DOWNTO 0); END cnt10; ARCHITECTURE example OF cnt10 IS BEGIN

PROCESS(clr,clk) BEGIN IF clr='1' THEN cnt<=0; ELSIF en<='1' then if clk'EVENT AND clk='1' THEN IF (cnt=9) THEN cnt<=0;co<='1'; elsif en<='0' then cnt<=cnt; ELSE cnt<=cnt+1;co<='0'; END IF; END IF; end if; END PROCESS; END example; 3:六进计数器设计 程序如下: --Cnt6 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY cnt6 IS PORT(clr:IN STD_LOGIC; en,clk:IN STD_LOGIC; co : out std_logic; cnt:BUFFER INTEGER RANGE 9 DOWNTO 0); END cnt6; ARCHITECTURE example OF cnt6 IS BEGIN PROCESS(clr,clk) BEGIN IF clr='1' THEN cnt<=0; ELSIF en<='1' then if clk'EVENT AND clk='1' THEN IF (cnt=5) THEN cnt<=0;co<='1'; elsif en<='0' then cnt<=cnt; ELSE cnt<=cnt+1;co<='0'; END IF; END IF; end if; END PROCESS;

END example; 4.七段译码器: 程序如下:

--DecL7S

LIBRARY IEEE ;

USE IEEE.STD_LOGIC_1164.ALL ; ENTITY DecL7S IS

PORT ( A : IN STD_LOGIC_VECTOR(3 DOWNTO 0) ; LED7S : OUT STD_LOGIC_VECTOR(6 DOWNTO 0) ) ; END ;

ARCHITECTURE one OF DecL7S IS BEGIN

PROCESS( A ) BEGIN

CASE A(3 DOWNTO 0) IS

WHEN \ LED7S <= \°80?±0 WHEN \ LED7S <= \°79?±1 WHEN \ LED7S <= \°24?±2 WHEN \ LED7S <= \°30?±3 WHEN \ LED7S <= \°19?±4 WHEN \ LED7S <= \°12?±5 WHEN \ LED7S <= \°02?±6 WHEN \ LED7S <= \°78?±7 WHEN \ LED7S <= \°00?±8 WHEN \ LED7S <= \°10?±9 WHEN \ LED7S <= \°08?±10 WHEN \ LED7S <= \°03?±11 WHEN \ LED7S <= \°46?±12 WHEN \ LED7S <= \°21?±13 WHEN \ LED7S <= \°06?±14 WHEN \ LED7S <= \°0E?±15 WHEN OTHERS => NULL ; END CASE ; END PROCESS ; END ;

5.顶层设计的VHDL 源程序:

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

ENTITY TIMES IS

PORT(CLR:IN STD_LOGIC; CLK:IN STD_LOGIC; ENA:IN STD_LOGIC;

DOUT:OUT STD_LOGIC_VECTOR(23 DOWNTO 0)); END TIMES;

ARCHITECTURE ART OF TIMES IS COMPONENT CLKGEN

PORT(CLK:IN STD_LOGIC;

NEWCLK:OUT STD_LOGIC); END COMPONENT; COMPONENT CNT10

PORT(CLK,CLR,ENA:IN STD_LOGIC;

CQ:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); CARRY_OUT:OUT STD_LOGIC); END COMPONENT; COMPONENT CNT6

PORT(CLK,CLR,ENA:IN STD_LOGIC;

CQ:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); CARRY_OUT:OUT STD_LOGIC); END COMPONENT;

SIGNAL NEWCLK:STD_LOGIC; SIGNAL CARRY1:STD_LOGIC; SIGNAL CARRY2:STD_LOGIC; SIGNAL CARRY3:STD_LOGIC; SIGNAL CARRY4:STD_LOGIC; SIGNAL CARRY5:STD_LOGIC; BEGIN

U0:CLKGEN PORT MAP(CLK=>CLK,NEWCLK=>NEWCLK); U1:CNT10 PORT MAP(CLK=>NEWCLK,CLR=>CLR,ENA=>ENA, CQ=>DOUT(3 DOWNTO 0),CARRY_OUT=>CARRY1); U2:CNT10 PORT MAP(CLK=>CARRY1,CLR=>CLR,ENA=>ENA, CQ=>DOUT(7 DOWNTO 4),CARRY_OUT=>CARRY2); U3:CNT10 PORT MAP(CLK=>CARRY2,CLR=>CLR,ENA=>ENA, CQ=>DOUT(11 DOWNTO 8),CARRY_OUT=>CARRY3); U4:CNT6 PORT MAP(CLK=>CARRY3,CLR=>CLR,ENA=>ENA, CQ=>DOUT(15 DOWNTO 12),CARRY_OUT=>CARRY4); U5:CNT10 PORT MAP(CLK=>CARRY4,CLR=>CLR,ENA=>ENA, CQ=>DOUT(19 DOWNTO 16),CARRY_OUT=>CARRY5); U6:CNT6 PORT MAP(CLK=>CARRY5,CLR=>CLR,ENA=>ENA,

CQ=>DOUT(23 DOWNTO 20)); END ART;

五.实验结果

(Cnt6波形图)

(cnt10波形图)

(秒表波形图)

六.遇到的问题及解决方案

1.在对程序进行编译时出现了很多错误,因此需要耐心进行排错,要充分利用上课时所学的理论知识,找出其中的语法错误

2.在用软件进行时序仿真时,刚开始没考虑信号的延迟也没考虑仿真的延迟,因此波形和理论不一致,因此需要设置合理的初值。 七.建议及意见

1.对于此种课程,我觉得应该在老师引导的前提下多给学生操作,实践的机会,让学生能够及时的进行理论与实践的相结合。 2.对于一些新的软件 ,我希望老师能够首先大体的把操作过程跟我们讲一下,让我们能有一个大体的思路,因此不至于只是跟着老师的步骤知道点那些项而不了解 自己在干什么,要实现的是什么?

3.老师能够及时的了解学生的情况并引导学生解决问题。

学号:02091370

班级:020914 姓名:吴再婕

本文来源:https://www.bwwdw.com/article/ruxo.html

Top