EDA多功能数字钟设

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验报告
实验四多功能数字钟设计
一、实验目的
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输出信号最后接在动态译管码芯片上。

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

得出实验要求的分计时器:
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输出信号最后接在动态译管码芯片上。

得出实验要求的小时计时器:
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;
得出元件如图:
五、实验步骤
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;
y0 : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
y1 : OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); END ENTITY xzq;
ARCHITECTURE ART OF xzq IS
BEGIN
y0<=ain0 WHEN set = '0' ELSE bin0;
y1<=ain1 WHEN set = '0' ELSE bin1;
END ARCHITECTURE ART;
生成元件:
实验原理图:
仿真结果:
满足实验要求
原文已完。

下文为附加文档,如不需要,下载后可以编辑删除,谢谢!。

相关文档
最新文档