南昌大学实验报告

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

学号:6100208248 专业班级:通信082班
实验日期:2010/11/11实验成绩:
实验四数字钟设计
一、实验目的
1.设计一个数字钟
2.掌握动态扫描数码管的工作原理和相关的VHDL程序的编写方法
3.掌握分模块设计的方法
二、实验内容与要求
1.在实验箱上实现动态扫描数码管显示时分秒;
2.可以预置为12小时计时显示和24小时计时显示;
3.一个调节键,用于调节目标数位的数字。

对调节的内容敏感,如调节分钟或秒时,保
持按下时自动计数,否则以脉冲计数;
4.一个功能键,用于切换不同的状态;计时、调时、调分、调秒、调小时制式;
三、设计思路
时、分、秒计数模块可以用计数器实现,时计数分为模12/24进制计数器,分和秒为模60计数器,显示模块用动态扫描数码管实现。

数字钟总的设计框图:
图1:数字钟设计框图
四、实验程序(程序来源:根据网络上的修改)
1.控制模块:控制模块分散在各计数模块的控制引脚
2.秒计数模块
①VHDL程序:
ENTITY SECOND IS
PORT ( CLK : IN STD_LOGIC;
RESET : IN STD_LOGIC;
SETMIN : IN STD_LOGIC;
ENMIN : OUT STD_LOGIC;
DAOUT : OUT STD_LOGIC_VECTOR(7 DOWNTO 0)); END ENTITY SECOND;
ARCHITECTURE ART OF SECOND IS
SIGNAL COUNT : STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL ENMIN_1,ENMIN_2 : STD_LOGIC;
BEGIN
DAOUT<=COUNT;
ENMIN_2<=(SETMIN AND CLK);
ENMIN<=(ENMIN_1 OR ENMIN_2);
PROCESS(CLK,RESET,SETMIN)
BEGIN
IF(RESET='0')THEN
COUNT<="00000000";
ENMIN_1<='0';
ELSIF(CLK'EVENT AND CLK='1')THEN
IF(COUNT(3 DOWNTO 0)="1001")THEN
IF(COUNT<16#60#)THEN
IF(COUNT="01011001")THEN
ENMIN_1<='1';COUNT<="00000000";
ELSE
COUNT<=COUNT + 7;
END IF;
ELSE
COUNT<="00000000";
END IF;
ELSIF(COUNT<16#60#)THEN
COUNT<=COUNT + 1;
ENMIN_1<='0';
ELSE
COUNT<="00000000";ENMIN_1<='0'; END IF;
END IF;
END PROCESS;
END ART;
②封装后的秒计数模块:
图2:秒计数模块
3.分计数模块
①VHDL 程序(与秒计数程序基本相同,略) ②封装后的分计数模块:
图3:分计数模块
4.时计数模块
①VHDL 程序(分为12进制和24进制,与秒计数基本相同,略)
②封装后的时计数模块:
图4:时计数模块(12进制、24进制、2选1数据选择器)
5.显示模块 ①VHDL 程序
ENTITY SETTIME IS
PORT ( CLK1 : IN STD_LOGIC; RESET : IN STD_LOGIC;
SEC,MIN : IN STD_LOGIC_VECTOR(7 DOWNTO 0); HOUR : IN STD_LOGIC_VECTOR(7 DOWNTO 0); DAOUT : OUT STD_LOGIC_VECTOR(3 DOWNTO 0); SEL : OUT STD_LOGIC_VECTOR(2 DOWNTO 0)); END SETTIME;
ARCHITECTURE ART OF SETTIME IS
SIGNAL COUNT : STD_LOGIC_VECTOR(2 DOWNTO 0); BEGIN
PROCESS(CLK1,RESET) BEGIN
IF(RESET='0')THEN
COUNT<="000";
ELSIF(CLK1'EVENT AND CLK1='1')THEN
IF(COUNT>="101")THEN
COUNT<="000";
ELSE
COUNT<=COUNT + 1;
END IF;
END IF;
END PROCESS;
PROCESS(CLK1,RESET)
BEGIN
IF(RESET='0')THEN
DAOUT<="0000";
SEL<="111";
ELSIF(CLK1'EVENT AND CLK1='1')THEN
CASE COUNT IS
WHEN"000"=>DAOUT<=SEC(3 DOWNTO 0);SEL<="000";--秒低位 WHEN"001"=>DAOUT<=SEC(7 DOWNTO 4);SEL<="001";--秒高位 WHEN"010"=>DAOUT<=MIN(3 DOWNTO 0);SEL<="010";--分低位 WHEN"011"=>DAOUT<=MIN(7 DOWNTO 4);SEL<="011";--分高位 WHEN"100"=>DAOUT<=HOUR(3 DOWNTO 0);SEL<="100";--时低位 WHEN"101"=>DAOUT<=HOUR(7 DOWNTO 4);SEL<="101";--时高位 WHEN OTHERS=>DAOUT<="0000";SEL<="111";
END CASE;
END IF;
END PROCESS;
END ART;
②封装后的动态扫描数码管显示模块
图5:显示模块
6.顶层文件
五、实验步骤
①.新建工程。

打开Quartus II,新建工程。

注意顶层文件名与实体名保持一致;
②.硬件选择。

在family中选择芯片EP1K100QC208-3;
③.编写程序。

新建VHDL文件,复制事先编好的程序,保存;
④.全程编译。

先选择,进行编译,看是否有语法错误。

然后选择进行全程编译;
⑤.功能仿真。

新建波形文件,设置输入信号的波形,并且保存,再点按钮进行功能
仿真;
⑥.引脚锁定。

完成仿真后,点击进行引脚锁定。

如图6:
⑦.程序下载。

引脚设置后,一定要在再一次进行全程编译,然后下载。

⑧.硬件测试。

图:6:引脚设置
六、仿真波形分析
图7:仿真波形图
七、硬件测试结果
1.各引脚的意义
CLK1扫描时钟,CLK2计数时钟,REST复位清零,SET模12/24小时制选择,SETHOUR 调时,SETMIN调分,DAOUT计数输出,SEL动态数码管位选通。

2.测试结果
当REST=’0’时,计数清零,动态数码管“111”位显示0;当REST=’1’时,SET=’0’,12小时制,SET=’1’,24小时制;按下SETHOUR键,脉冲调时,长按则自动调时;按下SETMIN键,脉冲调分,长按则自动调分。

八、实验心得
1.进一步掌握了对计数器的设计。

在实验二设计模可变计数器时,是把BCD码计数看成
是二进制,比如数码管显示22可看成是00100010B即34,现在可以直接设置成一个16进制数16#22#,这样就比较直观,容易读懂程序。

2.仿真波形与实际硬件测试结果是有区别的。

为了使SEL引脚不重复出现同一个数值,
以免误认为是功能不对,要设置好时钟频率与扫描频率的关系,我设置的时钟频率为CLK1=165Hz,CLK2=25Hz,这样SEL的数值基本不会有重复。

3.网络上的程序也不是完美的,必须要自己修改。

第一,有些是功能不对的,第二,有
些语句是冗余的,可以自己修改一下,这样仿真波形的毛刺会减少,程序看起来也简洁许多。

相关文档
最新文档