实验三 EDA技术
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
性实验-数字钟的设计
一、实验目的
为了使学生有效加深对数字系统的
分析
定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析
和设计方法,熟练用EDA工具完成对数字系统的设计及仿真过程;安排本“设计性实验”。本实验由学生自行拟定实验电路、实验步骤并进行独立实验主,学会系统设计、调试、仿真及故障诊断、排除方法。
二、实验题目
数字钟的设计
1.任务要求:
(1) 设计一个数字钟。
(2) 具有时,分,秒计数显示功能,以24小时循环计时。
(3) 具有清零,调节小时、分钟功能。
(4) 具有整点报时功能,整LED灯花样显示。
2.设计说明提示
(1) 数字钟的原理框图如图S4-1所示。
系统时钟
图S4-1
(2) 系统时钟可由实验箱上的时钟源经分频得到。功能键可由实验箱上的按键开关实现。
三、实验设备及器材:
1.GW48EDA/SOPC+PK2实验系统。
四、实验步骤
1、秒计数器模块的VHDL语言:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY second IS
PORT( clk,reset,setmin:STD_LOGIC;
enmin:OUT STD_LOGIC;
daout:OUT STD_LOGIC_VECTOR(6 DOWNTO 0));
END ENTITY second;
ARCHITECTURE fun OF second IS
SIGNAL count:STD_LOGIC_VECTOR(6 DOWNTO 0);
SIGNAL enmin_1,enmin_2:STD_LOGIC; --enmin_1为59秒时的进位信号
BEGIN --enmin_2由clk调制后的手动调分脉冲信号串
daout<=count;
enmin_2<=(setmin and clk); --setmin为手动调分控制信号,高电平有效
enmin<=(enmin_1 or enmin_2); --enmin为向分进位信号
PROCESS(clk,reset,setmin)
BEGIN
IF(reset='0')THEN count<="0000000"; --若reset为0,则异步清零
ELSIF(clk 'event and clk='1')then --否则,若clk上升沿到
IF(count(3 downto 0)="1001")then --若个位计时恰好到"1001"即9
IF(count<16#60#)then --又若count小于16#60#,即60H
IF(count="1011001")then --又若已到59D
enmin_1<='1';count<="0000000";--则置进位为1及count复0
ELSE --未到59D
count<=count+7; --则加7,而+7=+1+6,即作"加6校正"
END IF;
ELSE --若count不小于16#60#(即count等于或大于16#60#)
count<="0000000"; --count复0
END IF; --END IF(count<16#60#)
ELSIF(count<16#60#)then --若个位计数未到"1001"则转此句再判
count<=count+1; --若count<16#60#则count加1
enmin_1<='0'after 100 ns; --没有发生进位
ELSE --否则,若count不小于16#60#
count<="0000000"; --则count复0
END IF; --END IF(count(3 DOWNTO 0)="1001")
END IF; --END IF(reset='0')
END PROCESS;
END fun;
2、分计数器模块的VHDL语言:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY minute IS
PORT(clk,clk1,reset,sethour:IN STD_LOGIC;
enhour:OUT STD_LOGIC;
daout:OUT STD_LOGIC_VECTOR(6 DOWNTO 0));
END ENTITY minute;
ARCHITECTURE fun OF minute IS
SIGNAL count :STD_LOGIC_VECTOR (6 DOWNTO 0);
SIGNAL enhour_1, enhour_2: STD_LOGIC; --enmin_1为59分时的进位信号
BEGIN --enmin_2由clk调制后的手动调时脉冲信号串
daout<=count;
enhour_2<= (sethour and clk1); --sethour为手动调时控制信号,高电平有效
enhour<= (enhour_1 or enhour_2);
PROCESS(clk,reset,sethour)
BEGIN
IF(reset='0') THEN --若reset为0,则异步清零
count<="0000000";
ELSIF(clk'event and clk='1')THEN --否则,若clk上升沿到
IF(count (3 DOWNTO 0) ="1001")THEN--若个位计时恰好到"1001"即9
IF(count <16#60#) THEN --又若count小于16#60#,即60
IF(count="1011001") THEN--又若已到59D
enhour_1<='1'; --则置进位为1
count<="0000000"; --count复0
ELSE
count<=count+7; --若count未到59D,则加7,即作"加6校正"
END IF; --使前面的16#60#的个位转变为8421BCD的容量
ELSE
count<="0000000";--count复0(有此句,则对无效状态电路可自启动)
END IF; --END IF(count<16#60#)
ELSIF (count <16#60#) THEN
count<=count+1; --若count<16#60#则count加1
enhour_1<='0' after 100 ns; --没有发生进位
ELSE
count<="0000000"; --否则,若count不小于16#60# count复0
END IF; --END IF(count(3 DOWNTO 0)="1001")
END IF; --END IF(reset='0')
END process;
END fun;
3、时计数器模块的VHDL语言:
LIBRARY IEEE;
use IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY hour IS
PORT(clk,reset:IN STD_LOGIC;
daout:out STD_LOGIC_VECTOR(5 DOWNTO 0));
END ENTITY hour;
ARCHITECTURE fun OF hour IS
SIGNAL count:STD_LOGIC_VECTOR(5 DOWNTO 0);
BEGIN
daout<=count;
PROCESS(clk,reset)
BEGIN
IF(reset='0')THEN count<="000000"; --若reset=0,则异步清零
ELSIF(clk'event and clk='1')THEN --否则,若clk上升沿到
IF(count(3 DOWNTO 0)="1001")THEN --若个位计时恰好到"1001"即9
IF(count<16#23#)THEN --23进制
count<=count+7; --若到23D则
else
count<="000000"; --复0
END IF;
ELSIF (count<16#23#)THEN --若未到23D,则count进1
count<=count+1;
ELSE --否则清零
count<="000000";
END IF; --END IF(count(3 DOWNTO 0)="1001")
END IF; --END IF(reset='0')
END PROCESS;
END fun;
4、报警模块的VHDL语言:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY alert IS
PORT(clk5:IN STD_LOGIC;
dain:IN STD_LOGIC_VECTOR(6 DOWNTO 0);
miao:IN STD_LOGIC_VECTOR(6 DOWNTO 0);
speak:OUT STD_LOGIC;
lamp:OUT STD_LOGIC_VECTOR(2 DOWNTO 0));
END alert;
ARCHITECTURE fun OF alert IS
SIGNAL count:STD_LOGIC_VECTOR(1 DOWNTO 0);
SIGNAL count1:STD_LOGIC_VECTOR(1 DOWNTO 0);
BEGIN
speaker:PROCESS(clk5)
BEGIN
--speak<=count1(1);
IF(clk5'event and clk5='1')THEN
IF(dain="0000000")and (miao<="0010000")THEN
speak<=count1(1);
IF(count1>="10")THEN
count1<="00";--count1为三进制加法计数器
ELSE
count1<=count1+1;
END IF;
END IF;
END IF;
END PROCESS speaker;
lamper:PROCESS(clk5)
BEGIN
IF(rising_edge(clk5))THEN
IF(count<="10")THEN
IF(count="00")THEN
lamp<="001";--循环点亮三只灯
ELSIF(count="01")THEN
lamp<="010";
ELSIF(count="10")THEN
lamp<="100";
END IF;
count<=count+1;
ELSE
count<="00";
END IF;
END IF;
END PROCESS lamper;
END fun;
5、各模块整合:
6、引脚锁定:
7、程序烧录并测试:
硬件验证的方法如下:选择实验模式7;时钟脉冲clk与clock0(1Hz)信号相连,蜂鸣器脉冲clk5与clock5(1024HZ)信号相连;键8和键5均为低电平,时钟正常计时,数码管1和2显示秒,数码管4和5显示分钟,数码管7和8显示小时;键8为低电平时,时钟清零;键5为高电平时,按下键7和键4进行调时调分操作;当时钟为整点的时候,三个发光二极管进行循环移位操作,同时蜂鸣器持续响10秒。
5、实验心得: