【数字钟】课程设计VHDL语言
- 格式:doc
- 大小:665.50 KB
- 文档页数:15
一、设计要求1.具有时,分,秒,计数显示功能,以24小时循环计时。
2.具有清零,调节小时、分钟功能。
3.具有整点报时功能。
二、实验目的1.掌握多位计数器相连的设计方法。
2.掌握十进制,六进制,二十四进制计数器的设计方法。
3.继续巩固多位共阴级扫描显示数码管的驱动,及编码。
4.掌握扬声器的驱动。
5.掌握EPLD技术的层次化设计方法。
三、实验原理1.时钟计数:秒——60进制BCD码计数;分——60进制BCDD码计数;时——24进制BCDD码计数;整个计数器有清零,调分,调时功能,在接近整数时间能提供报时信号。
2.具有驱动8位八段共阴扫描数码管的片选驱动信号输出和八段字形译码输出,编码和扫描部分可参照前面实验。
3.扬声器在整点时有报时驱动信号产生。
四、实验内容及步骤1.根据电路持点,可在教师指导下用层次设计概念,将此设计任务分成若干模块,规定每一模块的功能和各模块之间的接口,让几个学生分做和调试其中之一,然后再将各模块合起来联试,以培养学生之间的合作精神,同时加深层次化设计概念。
2.了解软件的元件管理深层含义,以及模块元件之间的连接概念。
了解如何融合不同目录下的统一设计。
模块说明:各种进制的计数及时钟控制模块(10进制、6进制、24进制);扫描分时显示,译码模块;扬声器编码模块;各模块都是由VHDL语言编写。
图26-1 数字钟各模块连接示意图五、实验程序和电路图(component是对要用的已经生成好的原件模块申明,port map是原件的输入输出端口映射,相当于各个元件之间的端口连线。
)【主程序】LIBRARY ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;LIBRARY work;ENTITY clock_tp ISPORT(clkdsp : IN STD_LOGIC;--系统时钟reset : IN STD_LOGIC;--系统复位clk : IN STD_LOGIC;--时钟频率f : OUT STD_LOGIC;--数码管fg : OUT STD_LOGIC;--数码管gc : OUT STD_LOGIC;--数码管cd : OUT STD_LOGIC;--数码管de : OUT STD_LOGIC;--数码管eb : OUT STD_LOGIC;--数码管ba : OUT STD_LOGIC;--数码管aspeaker : OUT STD_LOGIC;--蜂鸣器dp : OUT STD_LOGIC;----数码管dpM : OUT STD_LOGIC_VECTOR(3 DOWNTO 0); --模式选择位selout : OUT STD_LOGIC_VECTOR(7 DOWNTO 0) --数码管选择);END clock_tp;ARCHITECTURE bdf_type OF clock_tp IS--分计数模块COMPONENT minutePORT(clk : IN STD_LOGIC;reset : IN STD_LOGIC;enhour : OUT STD_LOGIC;daout : OUT STD_LOGIC_VECTOR(6 DOWNTO 0));END COMPONENT;--数码管译码显示功能模块COMPONENT deledPORT(num : IN STD_LOGIC_VECTOR(3 DOWNTO 0);led : OUT STD_LOGIC_VECTOR(6 DOWNTO 0));END COMPONENT;--秒计数模块COMPONENT secondPORT(clk : IN STD_LOGIC;reset : IN STD_LOGIC;--setmin : IN STD_LOGIC;enmin : OUT STD_LOGIC;daout : OUT STD_LOGIC_VECTOR(6 DOWNTO 0));END COMPONENT;--时计数模块COMPONENT hourPORT(clk : IN STD_LOGIC;reset : IN STD_LOGIC;daout : OUT STD_LOGIC_VECTOR(5 DOWNTO 0) );END COMPONENT;--报时功能模块COMPONENT alertPORT(clk : IN STD_LOGIC;dain : IN STD_LOGIC_VECTOR(6 DOWNTO 0);speak : OUT STD_LOGIC);END COMPONENT;--扫描模块COMPONENT seltimePORT(clk1 : IN STD_LOGIC;reset : IN STD_LOGIC;hour : IN STD_LOGIC_VECTOR(5 DOWNTO 0);min : IN STD_LOGIC_VECTOR(6 DOWNTO 0);sec : IN STD_LOGIC_VECTOR(6 DOWNTO 0);daout : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);sel : OUT STD_LOGIC_VECTOR(2 DOWNTO 0) );END COMPONENT;--数码管选择模块,38译码COMPONENT decode3_8PORT(SEL : IN STD_LOGIC_VECTOR(2 DOWNTO 0);Q : OUT STD_LOGIC_VECTOR(7 DOWNTO 0) );END COMPONENT;--COMPONENT div_clkPORT(clk_in : IN STD_LOGIC;div_out : OUT STD_LOGIC);END COMPONENT;SIGNAL led : STD_LOGIC_VECTOR(0 TO 6);SIGNAL M_line : STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL lINE_0 : STD_LOGIC;SIGNAL lINE_1 : STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL lINE_2 : STD_LOGIC;SIGNAL lINE_9 : STD_LOGIC_VECTOR(6 DOWNTO 0);SIGNAL lINE_4 : STD_LOGIC;SIGNAL lINE_5 : STD_LOGIC_VECTOR(5 DOWNTO 0); SIGNAL lINE_7 : STD_LOGIC_VECTOR(6 DOWNTO 0); SIGNAL lINE_8 : STD_LOGIC_VECTOR(2 DOWNTO 0);BEGINdp <= '0';--分计数模块b2v_2 : minutePORT MAP(clk => lINE_0,reset => reset,enhour => lINE_2,daout => lINE_9);--数码管译码显示功能模块b2v_23 : deledPORT MAP(num => lINE_1,led => led);--秒计数模块b2v_24 : secondPORT MAP(clk => clk,reset => reset,enmin => lINE_0,daout => lINE_7);--时计数模块b2v_3 : hourPORT MAP(clk => lINE_2,reset => reset,daout => lINE_5);--报时功能模块b2v_4 : alertPORT MAP(clk => clk,dain => lINE_9,speak => speaker);--扫描模块b2v_5 : seltimePORT MAP(clk1 => lINE_4,reset => reset,hour => lINE_5,min => lINE_9,sec => lINE_7,daout => lINE_1,sel => lINE_8);--数码管选择模块,38译码b2v_inst1 : decode3_8PORT MAP(SEL => lINE_8,Q => selout);--b2v_inst2 : div_clkPORT MAP(clk_in => clkdsp,div_out => lINE_4);f <= led(5);g <= led(6);c <= led(2);d <= led(3);e <= led(4);b <= led(1);a <= led(0);M <= M_line;M_line(1) <= '1';M_line(0) <= '0';M_line(2) <= '0';M_line(3) <= '0';END bdf_type;【子程序--秒计数】LIBRARY ieee;use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all;ENTITY second ISPORT(clk : IN STD_LOGIC; --外部时钟频率reset :IN STD_LOGIC; --复位enmin : OUT STD_LOGIC; --向分进位daout: out std_logic_vector (6 downto 0));--秒计数END entity second;ARCHITECTURE fun OF second ISSIGNAL count: STD_LOGIC_VECTOR( 6 downto 0);BEGINdaout <= count;process ( clk , reset )beginif (reset='0') then--复位count <= "0000000";elsif (clk 'event and clk='1') then --clk上升沿if (count(3 downto 0)="1001") then --个位计数到9if (count <16#60#) then --count小于60Hif (count="1011001") then--count等于59Henmin<='1'; --就给进位置1count<="0000000"; --count归零初始化ELSEcount<=count+7; --跳过ah,bh,ch,dh,eh,fh。