硬件设计—电子钟设计.pdf
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
实验四 电子钟设计 实验目的:掌握计数器、按键消抖、利用按键控制输出脉冲或电平、数据选择 器实现数码管动态显示、利用输入频率计算时分秒等功能模块。 实验内容:设计实现电子钟,要求:1、在数码管上显示时分;2、能够启停电 子钟;3、设置电子钟的时与分;4、对电子钟清零及计时。 顶层电路原理图:如图 4-1 所示 图 4-1 按键消抖模块说明及代码: 该模块实现的主要功能是按键消抖,其主要目的是防止在按动按键的时候由 于按键本身的一些原因而导致该按键所控制的数码管上数值的变化跟我们所按 动的次数不符合。 例如,我们所希望的是数码管上的数字在我们每按动一次按键 时加 1, 可是由于按键的抖动可能会导致我们按动一下按键时数值会加 2 或者 3, 不一定会只加一,因此需要按键消抖使结果更精确。 library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity KeyIn is port( clk,din : IN STD_LOGIC; dout : OUT STD_LOGIC); end KeyIn; ARCHITECTURE arc OF KeyIn IS BEGIN process(clk,din) variable temp:integer; begin if clk'event and clk='1' then if(din='1') then temp:=0;end if; if temp >10 then dout<='1'; else dout<='0'; end if; temp:=temp+1; end if; end process; end arc; 动态数码管显示模块说明及代码: 该模块的主要功能是实现数码管的动态显示, 实验中通过 SG1—SG4 即通过 Y 的四个输出控制四个数码管动态地轮流显示,y0—y3 分别对应显示第一个数码 管到第四个数码管(q 控制的是数码管上显示的数值) ,当输入脉冲较小时即可 清楚看到其动态显示过程, 当脉冲较大时由于速度很快,我们就可以看到四个数 码管同时都亮着的状态。 library ieee; use ieee.std_logic_1164.all; entity mul4to1 is port( clk,clr:in bit; a,b,c,d: in std_logic_vector (3 downto 0); y,q: out std_logic_vector (3 downto 0)); end mul4to1; architecture archmul4to1 of mul4to1 is begin process(clk,clr,a,b,c,d) variable count:integer; begin if clr='1' then count:=0; else if clk'event and clk = '1' then if(count<3) then count:=count+1; else count:=0; end if; CASE count IS WHEN 0 => y<="1000";q<=a; WHEN 1 => y<="0100";q<=b; WHEN 2 => y<="0010";q<=c; WHEN 3 => y<="0001";q<=d; when others =>NULL; END CASE; end if; end if; end process; end archmul4to1; 管脚锁定说明:如图 4-2 所示 图 4-2 硬件测试情况说明及结果分析: 在实验箱上连接好电路,脉冲给定 1.25MHz;数码管下方左边的接口即输出 的 y0—y3 分别连接的对应引脚为 144、2、4、10,而右边接口对应输出 q0—q6 连接的对应引脚分别为 142、141、138、137、136、135、133;set 控制暂停或 开始计时的按键接按键 Key6 对应引脚 42;reset 清 0 接按键 Key5 对应引脚为 43;incH 控制增加小时的按键为 Key7 对应引脚 39;incM 控制增加分钟的按键 为 Key3,对应引脚 46。设好引脚将程序载入试验箱,四个数码管会显示,按下 reset 键将数码管清 0 后自动开始计时,按下 set 键计时暂停,这时分别按动控 制小时和分钟增加的按键, 就可以改变时和分,这时再按一下 set 键就会从刚设 置好的时间开始自动计时, 此时再按增加时和分的按键是不能改变时间的,只有 在暂停时可以改变时和分。 通过实验自己动手去测试之后,我们最后所得结果符 合预期,实验成功。 实验总结: 通 通过本次“硬件设计—电子钟设计”的实验,我们深入了解了电子钟的工作原理和设计方法,主要涉及以下几个关键知识点: 1. **按键消抖**:在电子设备中,按键的机械抖动可能导致信号不稳定,造成误操作。为了消除这种抖动,通常会采用消抖电路或者软件算法。在这个实验中,通过编写 VHDL 代码实现了一个简单的按键消抖模块。当按键按下时,内部计数器累加,当达到一定阈值(例如10次)后才认为按键被稳定按下,从而输出一个稳定的信号,避免因按键抖动导致的数值异常变化。 ```vhdl entity KeyIn is port( clk, din : IN STD_LOGIC; dout : OUT STD_LOGIC ); end KeyIn; ARCHITECTURE arc OF KeyIn IS variable temp: integer; BEGIN process(clk, din) begin if clk'event and clk='1' then if din='1' then temp := 0; end if; if temp > 10 then dout <= '1'; else dout <= '0'; end if; temp := temp + 1; end if; end process; end arc; ``` 2. **数码管动态显示**:数码管动态显示是一种节省硬件资源的方法,通过快速切换显示不同位数码管,给人以所有数码管同时显示的错觉。实验中,使用了4位数据选择器(如SG1-SG4)控制4个数码管轮流显示,通过Y的输出控制数码管的段选,Q输出控制位选。通过改变控制信号的频率,可以调整动态显示的效果。 ```vhdl entity mul4to1 is port( clk, clr: in bit; a, b, c, d: in std_logic_vector (3 downto 0); y, q: out std_logic_vector (3 downto 0) ); end mul4to1; architecture archmul4to1 of mul4to1 is variable count: integer; BEGIN process(clk, clr, a, b, c, d) begin if clr='1' then count := 0; elsif clk'event and clk = '1' then if (count < 3) then count := count + 1; else count := 0; end if; CASE count IS WHEN 0 => y <= "1000"; q <= a; WHEN 1 => y <= "0100"; q <= b; WHEN 2 => y <= "0010"; q <= c; WHEN 3 => y <= "0001"; q <= d; WHEN others => NULL; END CASE; end if; end process; end archmul4to1; ``` 3. **硬件连接与测试**:实验中,硬件电路包括了脉冲发生器(1.25MHz)、数码管、控制按键等。数码管的接口与控制器的引脚进行了具体分配,如y0-y3对应不同的数码管段选,q0-q6对应位选。按键如set、reset、incH、incM分别用于控制计时、清零、增加小时和分钟。在实际操作中,通过这些按键和数码管的交互,实现了电子钟的功能测试。 4. **计时与控制**:电子钟的核心是计时器,它能够准确地计算时、分、秒。实验中,可能使用了计数器模块来实现时间的递增,并通过set和reset键来启动、暂停或重置计时。此外,incH和incM按键用于在暂停状态下修改小时和分钟。 5. **数据选择器**:数据选择器在实验中起到了选择数码管显示内容的作用。通过控制输入信号,数据选择器可以切换不同数码管的显示数据,实现数码管的动态更新。 实验的成功不仅验证了理论知识的应用,也锻炼了动手实践能力,使我们更加熟练地掌握了数字逻辑设计的基本技巧,包括硬件描述语言(VHDL)编程、数字电路设计以及硬件测试与调试。通过这样的实验,我们可以更好地理解和应用计数器、消抖技术、数码管显示以及硬件控制逻辑,为未来更复杂电子系统的设计打下坚实的基础。
- 粉丝: 192
- 资源: 3万+
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助