EDA多功能数字钟设

  • 格式:pdf
  • 大小:754.26 KB
  • 文档页数:50

实验报告

实验四 多功能数字钟设计

一、 实验目的 1、学习复杂数字电路系统的设计。 2、设计一个多功能数字钟。 二、实验要求 1.数字显示当前的小时、分钟; 2.可以预置为12小时计时显示和24小时计时显示; 3.一个调节键,用于调节目标数位的数字。对调节的内容敏感,如调节分钟或秒时,保持按下时自动计数,否则以脉冲计数; 4.一个功能键,用于切换不同状态:计时、调时、调分、调秒、调小时制式。 三、实验仪器

PC机、Quartus II软件、EDA实验箱 四、实验原理 1.系统需要两个六十进制计数器用于分钟和秒的计时,为方便译码采用60 进制计数器 (1)秒计时实验程序如下: library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; USE IEEE.STD_LOGIC_ARITH.ALL; entity second IS port(clk1,rst1:in std_logic; cout1:out std_logic; cq0:out std_logic_vector(3 downto 0); cq1:out std_logic_vector(3 downto 0)); END second; ARCHITECTURE behave of second is SIGNAL d: std_logic_vector(3 downto 0);

SIGNAL g: std_logic_vector(3 downto 0); BEGIN process(clk1,rst1,d,g) BEGIN if (rst1 ='1') then d <="0000"; g <="0000"; elsif(clk1'EVENT and clk1='1')then if(d=9 and g=5)then cout1<='1'; else cout1<='0'; end if; if(d=9)then d<="0000"; if(g=5)then g<="0000"; else g<=g+1; end if; else d<=d+1; end if; end if; end process; cq0<=d;cq1<=g; end behave; clk1是时钟信号,rst1是复位信号, cout1作为下一模块分钟设计的时钟信号,cq0,cq1输出信号最后接在动态译管码芯片上。 得出实验要求的秒计时器: clk1rst1cout1cq0[3..0]cq1[3..0]second

inst (2)分计时程序同秒计时程序 cout1作为clk2时钟信号,rst2是复位信号, cout2作为下一模块分钟设计的时钟信号,cq2,cq3输出信号最后接在动态译管码芯片上。 得出实验要求的分计时器: clk2rst2cout2cq2[3..0]cq3[3..0]minute

inst2 2,、系统要求实现12小时,24小时切换计时,采用一个12,24模可变计数器,程序如下: library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; USE IEEE.STD_LOGIC_ARITH.ALL; entity hour IS port(clk3,rst3,m:in std_logic; cq4:out std_logic_vector(3 downto 0); cq5:out std_logic_vector(3 downto 0)); END hour; ARCHITECTURE behave of hour is SIGNAL d: std_logic_vector(3 downto 0); SIGNAL g: std_logic_vector(3 downto 0); BEGIN process(clk3,rst3,m,d,g) BEGIN if (rst3 ='1') then d <="0000"; g <="0000"; elsif(clk3'EVENT and clk3='1')then if(m='0') then if(d=9 or (d=1 and g=1))then d<="0000"; if(g=1)then g<="0000"; else g<=g+1; end if; else d<=d+1; end if; else if(d=9 or (d=3 and g=2))then d<="0000"; if(g=2)then

g<="0000"; else g<=g+1; end if; else d<=d+1; end if; end if; end if; end process; cq4<=d;cq5<=g; end behave; 当m=0时,实现模12计数,当m=1时实现模24计数,cout2作为clk3时钟信号,rst3是复位信号, cq4,cq5输出信号最后接在动态译管码芯片上。 得出实验要求的小时计时器: clk3rst3mcq4[3..0]cq5[3..0]hour

inst3 3、数码管的动态扫描需要一个将八位的输入转化为四位的输出,还有一 三位的输出,用来作为动态数码管选择器的输入。 程序如下: LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; ENTITY yima IS PORT ( CLK : IN STD_LOGIC; RESET : IN STD_LOGIC; SEC1 : IN STD_LOGIC_VECTOR(3 DOWNTO 0); SEC2 : IN STD_LOGIC_VECTOR(3 DOWNTO 0); MIN1 : IN STD_LOGIC_VECTOR(3 DOWNTO 0); MIN2 : IN STD_LOGIC_VECTOR(3 DOWNTO 0); HOUR1 : IN STD_LOGIC_VECTOR(3 DOWNTO 0); HOUR2 : IN STD_LOGIC_VECTOR(3 DOWNTO 0); DAOUT : OUT STD_LOGIC_VECTOR(3 DOWNTO 0); SEL : OUT STD_LOGIC_VECTOR(2 DOWNTO 0)); END yima; ARCHITECTURE ART OF yima IS

SIGNAL COUNT : STD_LOGIC_VECTOR(2 DOWNTO 0); BEGIN PROCESS(CLK,RESET) BEGIN IF(RESET='1')THEN COUNT<="000"; ELSIF(CLK'EVENT AND CLK='1')THEN IF(COUNT>="101")THEN COUNT<="000"; ELSE COUNT<=COUNT + 1; END IF; END IF; END PROCESS; PROCESS(CLK,RESET) BEGIN IF(RESET='1')THEN DAOUT<="0000"; SEL<="111"; ELSIF(CLK'EVENT AND CLK='1')THEN CASE COUNT IS WHEN"000"=>DAOUT<=SEC1(3 DOWNTO 0); SEL<="000"; WHEN"001"=>DAOUT<=SEC2(3 DOWNTO 0); SEL<="001"; WHEN"010"=>DAOUT<=MIN1(3 DOWNTO 0); SEL<="010"; WHEN"011"=>DAOUT<=MIN2(3 DOWNTO 0); SEL<="011"; WHEN"100"=>DAOUT<=HOUR1(3 DOWNTO 0); SEL<="100"; WHEN"101"=>DAOUT<=HOUR2(3 DOWNTO 0); SEL<="101"; WHEN OTHERS=>DAOUT<="0000"; SEL<="111"; END CASE;

END IF; END PROCESS; END ART; 得出元件如图: CLKRESETSEC1[3..0]SEC2[3..0]MIN1[3..0]MIN2[3..0]HOUR1[3..0]HOUR2[3..0]DAOUT[3..0]SEL[2..0]yima

inst7 五、实验步骤 1、建立工作库文件夹和编辑设计文件 (1)建立一个文件夹保存工程文件; (2)打开QuartusII,建立新的VHDL文件,再打开的页面下输入以上程序。 2、.编译过程 (1)输入完程序之后逐个编译 (2)逐个编译无错之后进行全程编译 3、将以上模块生成元器件。 4、建立新的工程,将各个模块的元器件用原理图连接,进行编译。 原理图如下:

(说明:因为要实现调时调时功能,将脉冲与一个输入用或门连接,接到时钟引脚,实现不按下时以脉冲计数,按下时手动计数) 5、系统仿真

(1)建立新的波形激励文件 (2)在波形编辑器窗口添加节点 (3)通过Edit->End Time 来设定仿真结束时间 (4)将工程count的端口信号名选录波形编辑器中 (5)在CLOCK窗口中设置clk1的时钟周期为1us, 动态扫描管时钟周期为100ns (6) 点击save保存 (7) 通过Tools下的Simulator Tools项进行仿真,然后观察输出波形。 仿真波形如下:

(图中,sel0代表从右起第一号管,依次sel5代表第五号管,out则对应每号管显示的数值) 6、引脚设定

六、实验现象及验证 1、调时方面功能正常; 2、从24小时切换为12小时时,如果已计数到12~23,无法切换,可使用

模12,24两个计数器同时计数,再用数据选择器选择计数器的输出信号,接入动态扫描器件;(改进见实验心得) 3、当扫描频率过低,将会看到数码显示管依次显示(动态数码管工作的真实情况),当扫描频率高于人眼识别频率,将看到六个数码管同时显示。 cq5:out std_logic_vector(3 downto 0)); END hour12; ARCHITECTURE behave of hour12 is SIGNAL d: std_logic_vector(3 downto 0); SIGNAL g: std_logic_vector(3 downto 0); BEGIN process(clk3,rst3,d,g) BEGIN if (rst3 ='1') then d <="0000"; g <="0000"; elsif(clk3'EVENT and clk3='1')then if(d=9 or (d=1 and g=1))then end behave; (2)模24计数: library ieee; if (rst4 ='1') then d <="0000"; g <="0000"; elsif(clk4'EVENT and clk4='1')then if(d=9 or (d=3 and g=2))then d<="0000"; if(g=2)then g<="0000"; else end process; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY xzq IS PORT ( ain0 : IN STD_LOGIC_VECTOR(3 DOWNTO 0); ain1 : IN STD_LOGIC_VECTOR(3 DOWNTO 0); bin0 : IN STD_LOGIC_VECTOR(3 DOWNTO 0); bin1 : IN STD_LOGIC_VECTOR(3 DOWNTO 0); set : IN STD_LOGIC;