第一篇:EDA数字钟设计
数字钟
一、实验目的
1、掌握多位计数器相连的设计方法。
2、掌握十进制,六进制,二十四进制计数器的设计方法。
3、掌握扬声器的驱动及报时的设计。
4、LED灯的花样显示。
5、掌握CPLD技术的层次化设计方法。
二、实验器材
1、主芯片Altera EPF10K10LC84-4。2、8个LED灯。
3、扬声器。4、4位数码显示管。5、8个按键开关(清零,调小时,调分钟)。
三、实验内容
根据电路特点,运用层次设计概念设计。将此设计任务分成若干模块,规定每一模块的功能和各模块之间的接口。
1、时计时程序: library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;
entity hour is
port(reset,clk : in std_logic;
daout : out std_logic_vector(7 downto 0));end hour;
architecture behav of hour is
signal count : std_logic_vector(3 downto 0);signal counter : std_logic_vector(3 downto 0);begin
p1: process(reset,clk)
begin
if reset='0' then
count<=“0000”;
counter<=“0000”;
elsif(clk'event and clk='1')then
if(counter<2)then
if(count=9)then
count<=“0000”;
counter<=counter + 1;
else
count<=count+1;
end if;
else
if(count=3)
then
counter<=“0000”;
else
count<=count+1;
count<=“0000”;
end if;
end if;
end if;
end process;
daout(7 downto 4)<=counter;daout(3 downto 0)<=count;
end behav;
2、分计时程序: library ieee;
use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;
entity minute is
port(reset,clk,sethour: in std_logic;
daout : out std_logic_vector(7 downto 0);
enhour : out std_logic);end minute;
architecture behav of minute is
signal count : std_logic_vector(3 downto 0);signal counter : std_logic_vector(3 downto 0);signal carry_out1 : std_logic;signal carry_out2 : std_logic;begin
p1: process(reset,clk)begin
if reset='0' then
count<=“0000”;
counter<=“0000”;
elsif(clk'event and clk='1')then
if(counter<5)then
if(count=9)then
count<=“0000”;
counter<=counter + 1;
else
count<=count+1;
end if;
carry_out1<='0';
else
if(count=9)then
count<=“0000”;
counter<=“0000”;
carry_out1<='1';
else
count<=count+1;
carry_out1<='0';
end if;
end if;end if;end process;
p2: process(clk)begin
if(clk'event and clk='0')then
if(counter=0)then
if(count=0)then
carry_out2<='0';
end if;
else
carry_out2<='1';
end if;end if;end process;
daout(7 downto 4)<=counter;daout(3 downto 0)<=count;enhour<=(carry_out1 and carry_out2)or sethour;end behav;
3、秒计时程序: library ieee;
use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;
entity second is
port(reset,clk,setmin : in std_logic;
daout : out std_logic_vector(7 downto 0);
enmin : out std_logic);end second;
architecture behav of second is
signal count : std_logic_vector(3 downto 0);signal counter : std_logic_vector(3 downto 0);signal carry_out1 : std_logic;signal carry_out2 : std_logic;begin
p1: process(reset,clk)begin
if reset='0' then
count<=“0000”;
counter<=“0000”;
elsif(clk'event and clk='1')then
if(counter<5)
then
if
(count=9)
then
count<=“0000”;
counter<=counter + 1;
else
count<=count+1;
end if;
carry_out1<='0';
else
if(count=9)
then
count<=“0000”;
counter<=“0000”;
carry_out1<='1';
else
count<=count+1;
carry_out1<='0';
end if;
end if;end if;end process;daout(7 downto
4)<=counter;
daout(3
downto
0)<=count;enmin<=carry_out1 or setmin;end behav;6
4、alert程序: library ieee;
use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;
entity alert is port(clkspk : in std_logic;
second : in std_logic_vector(7 downto 0);
minute : in std_logic_vector(7 downto 0);
speak : out std_logic;
lamp : out std_logic_vector(8 downto 0));end alert;
architecture behav of alert is signal divclkspk2 : std_logic;begin p1: process(clkspk)begin
if(clkspk'event and clkspk='1')then
divclkspk2<=not divclkspk2;
end if;end process;p2: process(second,minute)begin if(minute=“01011001”)then case second is
when “01010001”=>lamp<=“000000001”;speak<=divclkspk2;when “01010010”=>lamp<=“000000010”;speak<='0';when “01010011”=>lamp<=“000000100”;speak<=divclkspk2;when “01010100”=>lamp<=“000001000”;speak<='0';when “01010101”=>lamp<=“000010000”;speak<=divclkspk2;when “01010110”=>lamp<=“000100000”;speak<='0';when “01010111”=>lamp<=“001000000”;speak<=divclkspk2;when “01011000”=>lamp<=“010000000”;speak<='0';when “01011001”=>lamp<=“100000000”;speak<=clkspk;when others=>lamp<=“000000000”;end case;end if;end process;end behav;8
5、seltime程序 library ieee;
use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;
entity seltime is port(ckdsp : in std_logic;
reset : in std_logic;
second : in std_logic_vector(7 downto 0);
minute : 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 seltime;
architecture behav of seltime is signal sec : std_logic_vector(2 downto 0);begin
process(reset,ckdsp)begin
if(reset='0')then sec<=“000”;
elsif(ckdsp'event and ckdsp='1')then
sec<=“000”;else
sec<=sec+1;end if;end if;end process;
process(sec,second,minute,hour)begin case sec is
when “000”=>daout<=second(3 downto 0);when “001”=>daout<=second(7 downto 4);when “011”=>daout<=minute(3 downto 0);when “100”=>daout<=minute(7 downto 4);when “110”=>daout<=hour(3 downto 0);when “111”=>daout<=hour(7 downto 4);when others=>daout<=“1111”;end case;end process;
if(sec=“111”)then
sel<=sec;end behav;
6、deled程序: LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;use ieee.std_logic_unsigned.all;
ENTITY deled IS PORT(S: IN STD_LOGIC_VECTOR(3 DOWNTO 0);
A,B,C,D,E,F,G,H: OUT STD_LOGIC);END deled;
ARCHITECTURE BEHAV OF deled IS
SIGNAL DATA:STD_LOGIC_VECTOR(3 DOWNTO 0);SIGNAL DOUT:STD_LOGIC_VECTOR(7 DOWNTO 0);BEGIN DATA<=S;PROCESS(DATA)BEGIN
CASE DATA IS
WHEN “0000”=>DOUT<=“00111111”;WHEN “0001”=>DOUT<=“00000110”;WHEN “0010”=>DOUT<=“01011011”;WHEN “0011”=>DOUT<=“01001111”;WHEN “0100”=>DOUT<=“01100110”;WHEN “0101”=>DOUT<=“01101101”;WHEN “0110”=>DOUT<=“01111101”;WHEN “0111”=>DOUT<=“00000111”;WHEN “1000”=>DOUT<=“01111111”;WHEN “1001”=>DOUT<=“01101111”;WHEN “1010”=>DOUT<=“01110111”;WHEN “1011”=>DOUT<=“01111100”;WHEN “1100”=>DOUT<=“00111001”;WHEN “1101”=>DOUT<=“01011110”;WHEN “1110”=>DOUT<=“01111001”;WHEN “1111”=>DOUT<=“01000000”;WHEN OTHERS=>DOUT<=“00000000”;END CASE;END PROCESS;H<=DOUT(7);
G<=DOUT(6);
F<=DOUT(5);
E<=DOUT(4);D<=DOUT(3);C<=DOUT(2);B<=DOUT(1);A<=DOUT(0);END BEHAV;
7、顶层原理图:
四、实验结果 顶层原理图仿真波形:
五、心得体会
1、系统设计进要行充分的方案论证,不可盲目就动手去做;
2、实验中对每一个细节部分都要全面思考,要对特殊情况进行处理;
3、对于数字系统,要考虑同步、异步问题;
4、数字电路的理论分析要结合时序图;
5、遇到问题,要顺藤摸瓜,分析清楚,不可胡乱改动,每做一次改变都要有充分的理由;
6、模块化设计方法的优点在于其简洁性,但是在实验设计中也发现,在实验最终电路确定之前,要尽量减少模块重叠嵌套,因为在总的电路敲定之前,电路还不成熟,很多地方需要改进,如果在开始时就进行多层模块化,里层模块电路的修改将影响其外层的全部电路,这样就是牵一发动全身,很显然,这样将导致电 数字钟课程设计 电路设计的低效,所以在设计过程中,一定要尽量减少超过两层的模块;
7、遇到问题花了很长时间没有解决掉,要学会想他人请教,别人的不经意一点,可能就能把自己带出思维死区。
第二篇:EDA数字钟毕业设计
[ 标签:数字钟, eda ]
1、设计一个能显示1/10秒、秒、分、时的12小时数字钟。
2、时钟源使用频率为0.1Hz的连续脉冲。
3、设置两个按钮,一个供“开始”及“停止”用,一个供系统“复位”用。
4、时钟显示使用数码管显示。
基于VHDL的多功能数字钟的设计 EDA课程设计 资料类别课程(专业)EDA 适用年级大学文件格式word+DLS 文件大小1725K 上传时间2008-10-10 20:57:00 预览文件无(只能预览文件中的部分内容)下载次数0内容简介:EDA课程设计 基于VHDL的多功能数字钟的设计,共11页,6086字,附源程序。摘要:介绍了利用VHDL硬件描述语言设计的多功能数字钟的思路和技巧。在MAX+PLUSII开发环境中编译和仿真了所设计的程序,并在可编程逻辑器件上下栽验证。仿真和验证结果表明,该设计方法切实可行。
EDA-时钟设计-基于Altera数字钟的实
现:EDA课程设计 基于VHDL的多功能数字钟的设计:EDA数字钟设计报告:资料包括: 论文(12页2036字)图纸说明:中文摘要:数字钟学习的目的是掌握各类计数器及它们相连的设计方法;掌握多个数码管显示的原理与方法;掌握FPGA技术的层次化设计方法;掌握用VHDL语言的设计思想以及整个数字系统的设计。此数字钟设计具有时,分,秒计数显示功能,以24小时为计数循环;能实现清零,调节小时,分钟以及整点报时的功能。
第三篇:eda数字钟程序
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY clock IS PORT(EN
:IN STD_LOGIC;数码管使能
CLK
:IN STD_LOGIC;时钟信号
RST
:IN STD_LOGIC;复位信号
SEC_1
:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);秒高位
SEC_01 :OUT STD_LOGIC_VECTOR(3 DOWNTO 0);秒低位
MIN_1
:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);分高位
MIN_01 :OUT STD_LOGIC_VECTOR(3 DOWNTO 0);分低位
HOU_1
:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);时高位
HOU_01 :OUT STD_LOGIC_VECTOR(3 DOWNTO 0);时低位
BEE
:OUT STD_LOGIC);END clock;
ARCHITECTURE behovior OF clock IS SIGNAL SEC_HIGH:STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL SEC_LOW
:STD_LOGIC_VECTOR(3 DOWNTO 0);SIGNAL MIN_HIGH:STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL MIN_LOW:STD_LOGIC_VECTOR(3 DOWNTO 0);SIGNAL HOU_HIGH:STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL HOU_LOW
:STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL CY_MIN
:STD_LOGIC;分进位
SIGNAL CY_HOU
:STD_LOGIC;时进位
SIGNAL LOGO_1
:STD_LOGIC;标志
SIGNAL LOGO_2
:STD_LOGIC;
SIGNAL LOGO_3
:STD_LOGIC;
BEGIN MIAOLOW:PROCESS(CLK,RST,EN)
BEGIN
IF(RST = '0')
THEN
SEC_LOW <= “1000”;附给秒低位为8
ELSIF(CLK'EVENT AND CLK = '1' AND EN = '1')THEN 检测时钟上升沿及数码管使能端
IF(SEC_LOW = “1001”)THEN
SEC_LOW <= “0000”;
ELSE
SEC_LOW <= SEC_LOW + “0001”;加一
END IF;
END IF;
END PROCESS MIAOLOW;
LOGO_1 <= SEC_LOW(3)AND SEC_LOW(0);
SEC_01<= SEC_LOW;秒个位放8
MIAOHIGH:PROCESS(CLK,RST)
BEGIN
IF(RST = '0')
THEN
SEC_HIGH <= “0101”;
ELSIF(CLK'EVENT AND CLK = '1')THEN检测时钟上升沿
IF(LOGO_1 = '1')THEN
IF(SEC_HIGH = “0101”)THEN
SEC_HIGH <= “0000”;
CY_MIN <= '1';
ELSE
SEC_HIGH <= SEC_HIGH + “0001”;加一
CY_MIN <= '0';
END IF;
END IF;
END IF;
END PROCESS MIAOHIGH;
SEC_1 <= SEC_HIGH;秒十位放5
FENLOW:PROCESS(CY_MIN,RST,EN)
BEGIN
IF(RST = '0')
THEN 若复位位为0
MIN_LOW <= “1000”;则分个位为8
ELSIF(CY_MIN'EVENT AND CY_MIN = '1' AND EN = '1')THEN检测时钟上升沿及数码管使能端
IF(MIN_LOW = “1001”)THEN
MIN_LOW <= “0000”;
ELSE
MIN_LOW <= MIN_LOW + “0001”;加一
END IF;
END IF;
END PROCESS FENLOW;
LOGO_2 <= MIN_LOW(3)AND MIN_LOW(0);
MIN_01 <= MIN_LOW;分个位放8
FENHIGH:PROCESS(CY_MIN,RST)
BEGIN
IF(RST = '0')
THEN
MIN_HIGH <= “0101”;
ELSIF(CY_MIN'EVENT AND CY_MIN = '1')THEN检测分进位上升沿
IF(LOGO_2 = '1')THEN
IF(MIN_HIGH = “0101”)THEN若分十位为5
MIN_HIGH <= “0000”;
CY_HOU <= '1';时进位为1
ELSE
MIN_HIGH <= MIN_HIGH + “0001”;加一
CY_HOU <= '0';
END IF;
END IF;
END IF;
END PROCESS FENHIGH;
MIN_1 <= MIN_HIGH;分十位放5
SHILOW:PROCESS(CY_HOU,RST,EN)
BEGIN
IF(RST = '0')
THEN
HOU_LOW <= “1001”;
ELSIF(CY_HOU'EVENT AND CY_HOU = '1'
AND EN = '1')THEN检测时进位上升沿及数码管使能端
IF(HOU_LOW = “1001”)THEN若时低位为9
HOU_LOW <= “0000”;
ELSIF(HOU_HIGH = “0010” AND HOU_LOW = “0011”)THEN若时十位为2,个位为3
HOU_LOW <= “0000”;
ELSE
HOU_LOW <= HOU_LOW + “0001”;加一
END IF;
END IF;
END PROCESS SHILOW;
LOGO_3 <= HOU_LOW(3)AND HOU_LOW(0);
HOU_01 <= HOU_LOW;时个位放3
SHIHIGH:PROCESS(CY_HOU,RST)
BEGIN
IF(RST = '0')
THEN
HOU_HIGH <= “0001”;
ELSIF(CY_HOU'EVENT AND CY_HOU = '1')THEN检测时进位上升沿
IF(HOU_HIGH = “0010” AND HOU_LOW = “0011”)THEN若时十位为2,时个位为3
HOU_HIGH <= “0000”;
ELSIF(LOGO_3 = '1')THEN
HOU_HIGH <= HOU_HIGH + “0001”;加一
END IF;
END IF;
END PROCESS SHIHIGH;
BEE_CLOCK:PROCESS(CLK)
BEGIN
IF(CLK'EVENT AND CLK = '1')THEN检测时钟上升沿
IF(SEC_HIGH = “0101” AND SEC_LOW = “1001”
AND MIN_HIGH = “0101” AND MIN_LOW = “1001”)THEN
BEE <= '1';
ELSE
BEE <= '0';
END IF;
END IF;
END PROCESS BEE_CLOCK;
HOU_1 <= HOU_HIGH;时十位放2
END behovior;
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY clock1 IS PORT(EN
:IN STD_LOGIC;
CLK
:IN STD_LOGIC;
RST
:IN STD_LOGIC;SEC_1
:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
SEC_01 :OUT STD_LOGIC_VECTOR(3 DOWNTO 0);MIN_1
:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
MIN_01 :OUT STD_LOGIC_VECTOR(3 DOWNTO 0);HOU_1
:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
HOU_01 :OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
BEE
:OUT STD_LOGIC);END clock1;
ARCHITECTURE behovior OF clock1 IS SIGNAL SEC_HIGH:STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL SEC_LOW
:STD_LOGIC_VECTOR(3 DOWNTO 0);SIGNAL MIN_HIGH:STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL MIN_LOW:STD_LOGIC_VECTOR(3 DOWNTO 0);SIGNAL HOU_HIGH:STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL HOU_LOW
:STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL CY_MIN
:STD_LOGIC;
SIGNAL CY_HOU
:STD_LOGIC;SIGNAL LOGO_1
:STD_LOGIC;
SIGNAL LOGO_2
:STD_LOGIC;
SIGNAL LOGO_3
:STD_LOGIC;
BEGIN MIAOLOW:PROCESS(CLK,RST,EN)
BEGIN
IF(RST = '0')
THEN
SEC_LOW <= “1000”;
ELSIF(CLK'EVENT AND CLK = '1' AND EN = '1')THEN
IF(SEC_LOW = “1001”)THEN
SEC_LOW <= “0000”;
ELSE
SEC_LOW <= SEC_LOW + “0001”;
END IF;
END IF;
END PROCESS MIAOLOW;
LOGO_1 <= SEC_LOW(3)AND SEC_LOW(0);
SEC_01<= SEC_LOW;
MIAOHIGH:PROCESS(CLK,RST)
BEGIN
IF(RST = '0')
THEN
SEC_HIGH <= “0101”;
ELSIF(CLK'EVENT AND CLK = '1')THEN
IF(LOGO_1 = '1')THEN
IF(SEC_HIGH = “0101”)THEN
SEC_HIGH <= “0000”;
CY_MIN <= '1';
ELSE
SEC_HIGH <= SEC_HIGH + “0001”;
CY_MIN <= '0';
END IF;
END IF;
END IF;
END PROCESS MIAOHIGH;
SEC_1 <= SEC_HIGH;FENLOW:PROCESS(CY_MIN,RST,EN)
BEGIN
IF(RST = '0')
THEN
MIN_LOW <= “1000”;
ELSIF(CY_MIN'EVENT AND CY_MIN = '1' AND EN = '1')THEN
IF(MIN_LOW = “1001”)THEN
MIN_LOW <= “0000”;
ELSE
MIN_LOW <= MIN_LOW + “0001”;
END IF;
END IF;
END PROCESS FENLOW;
LOGO_2 <= MIN_LOW(3)AND MIN_LOW(0);
MIN_01 <= MIN_LOW;
FENHIGH:PROCESS(CY_MIN,RST)
BEGIN
IF(RST = '0')
THEN
MIN_HIGH <= “0101”;
ELSIF(Cy_MIN'EVENT AND CY_MIN = '1')THEN
IF(LOGO_2 = '1')THEN
IF(MIN_HIGH = “0101”)THEN
MIN_HIGH <= “0000”;
CY_HOU <= '1';
ELSE
MIN_HIGH <= MIN_HIGH + “0001”;
CY_HOU <= '0';
END IF;
END IF;
END IF;
END PROCESS FENHIGH;
MIN_1 <= MIN_HIGH;SHILOW:PROCESS(CY_HOU,RST,EN)
BEGIN
IF(RST = '0')
THEN
HOU_LOW <= “1001”;
ELSIF(CY_HOU'EVENT AND CY_HOU = '1' AND EN = '1')THEN
IF(HOU_LOW = “1001”)THEN
HOU_LOW <= “0000”;
ELSIF(HOU_HIGH = “0010” AND HOU_LOW = “0011”)THEN
HOU_LOW <= “0000”;
ELSE
HOU_LOW <= HOU_LOW + “0001”;
END IF;
END IF;
END PROCESS SHILOW;
LOGO_3 <= HOU_LOW(3)AND HOU_LOW(0);
HOU_01 <= HOU_LOW;
SHIHIGH:PROCESS(Cy_HOU,RST)
BEGIN
IF(RST = '0')
THEN
HOU_HIGH <= “0001”;
ELSIF(CY_HOU'EVENT AND CY_HOU = '1')THEN
IF(HOU_HIGH = “0010” AND HOU_LOW = “0011”)THEN
HOU_HIGH <= “0000”;
ELSIF(LOGO_3 = '1')THEN
HOU_HIGH <= HOU_HIGH + “0001”;
END IF;
END IF;
END PROCESS SHIHIGH;
BEE_CLOCK:PROCESS(CLK)
BEGIN
IF(CLK'EVENT AND CLK = '1')THEN
IF(SEC_HIGH = “0101” AND SEC_LOW = “1001”
AND MIN_HIGH = “0101” AND MIN_LOW = “1001”)THEN
BEE <= '1';
ELSE
BEE <= '0';
END IF;
END IF;
END PROCESS BEE_CLOCK;
HOU_1 <= HOU_HIGH;
END behovior;
第四篇:EDA数字钟课程设计
课 程 设 计 报 告
设计题目:用VHDL语言实现数字钟的设计
班 级:电子1002班 学 号:20102625 姓 名:于晓 指导教师:李世平、李宁 设计时间:2012年12月
摘要
数字钟是一种用数字电路技术实现时、分、秒计时的钟表。本设计主要是实现数字钟的功能,程序用VHDL语言编写,整体采用TOP-TO-DOWN设计思路,具有基本的显示年月日时分秒和星期的功能,此外还有整点报时功能。该数字钟的实现程序分为顶层模块、年月模块、日模块、时分秒定时模块、数码管显示模块、分频模块、星期模块,此外还有一个库。该程序主要是用了元件例化的方法,此外还有进程等重要语句。
没有脉冲时,显示时分秒,set按钮产生第一个脉冲时,显示年月日,第2个脉冲到来时可预置年份,第3个脉冲到来时可预置月份,依次第4、5、6、7、8个脉冲到来时分别可预置日期、时、分、秒、星期,第 9个脉冲到来时设置星期后预置结束,正常工作,显示的是时分秒和星期。调整设置通过Up来控制,UP为高电平,upclk有脉冲到达时,预置位加1,否则减1。当整点到达时,报时器会鸣响,然后手动按键停止报时。
关键词:数字钟,VHDL,元件例化,数码管
1、课程设计目的
掌握利用可编程逻辑器件和EDA设计工具进行电子系统设计的方法
2、课程设计内容及要求
设计实现一个具有带预置数的数字钟,具有显示年月日时分秒的功能。用6个数码管显示时分秒,set按钮产生第一个脉冲时,显示切换年月日,第2个脉冲到来时可预置年份,第3个脉冲到来时可预置月份,依次第4、5、6、7个脉冲到来时分别可预置日期、时、分、秒,第 8个脉冲到来后预置结束,正常工作,显示的是时分秒。Up为高电平时,upclk有脉冲到达时,预置位加1.否则减1,还可以在此基础上增加其它功能。
3、VHDL程序设计
3.1整体设计思路
本设计采用top-down 模式设计,分模块进行,各功能都使用元件例化方式设计,主要有LED显示模块、时分秒定时模块、日期模块、年月模块、分频模块、星期模块,此外还创建了一个程序包,用来实现年月日、时分秒的加减调整。主要运用了过程语句、元件例化语句、信号赋值语句、和顺序语句
图3-1-1 整体结构图
图3-1-2 顶层模块引脚图
3.2各模块设计思路
3.2.1 普通计数器(时、分、秒、月、年计数器)设计
时钟模块通过调用程序包的时分秒加减过程语句实现两个六十进制,一个二十四进制,秒的进位信号作为分的计数时钟信号,分的进位信号作为时的时钟信号。时的进位信号通过管脚映射到日期模块的计数时钟信号。
定时功能在时分秒模块中,是由分计数器在到达59时产生一个脉冲,让speaker产生高电位鸣响。
年月模块主要实现月份的十二进制计数器,和100进制的年份计数器。月份的计数信号由日期模块的进位信号传递过来,年份的时钟信号由月份的进位信号产生。
图3-2-1 时分秒引脚图 图3-2-2 年月引脚图 3.2.2 可变进制计数器(天计数器)模块设计
不同月中的天的数量是不同的,例如“大月”就有31“天”,“小月”有30“天”,平年“二月”有28“天”,而闰年“二月”有29“天”。所以天计数器应该具备进制可变的性能。日期模块主要分为三个部分,预置日期加,预置日期减和产生进位信号,使月份增加。平闰年的判断是通过年月模块传输过来年份信号(两个4位的BCD码),如果高位的信号为“xxx0”且低位的信号为“xx00”(如20,84等),或高位为“xxx1”且低位为“xx10”(如32等)则判断为闰年。这种方法的包含了一百年中的所有闰年的情况。然后判断大月小月可以判断月份来确定30进制还是31进制。进位信号也是分为大月、小月、平年闰年来确定是否产生。
图3-2-3 日模块引脚图
3.2.3 LED显示模块
主要通过接受setpin的控制信号来选择显示的内容,把不同的信号赋给输出的端口,从而实现时分秒,年月日的切换。3.2.4 星期模块
通过七进制计数器实现,同时带有预置的功能,不能同年月调整联动,但是能单独调整。
图3-2-4 星期模块引脚图
4、仿真与分析
4.1 日模块
4.1.1 年份为2000年,月份为2月,有29天,初值设为2000年2月28日,仿真中日为:28、29、1、2、„
4.1.2 年份为1999年,月份为2月,有28天,初值设为1999年2月28日,仿真中日为:28、1、2、„
4.1.3 年份为2000年,月份为3月,有31天,初值设为2000年3月30日,仿真中日为:30、31、1、2、„
4.1.4 年份为2000年,月份为4月,有30天,初值设为2000年4月30日,仿真中日为:30、1、2、„
4.2 年月模块
初值设为1999年12月,lock为1时,显示年月,lock为3时,预置月,lock为2时,预置年
4.3 时分秒定时模块
lock为0时,显示时分秒,lock为5时,预置时,lock为6时,预置分,lock为7时,预置秒。当分到达59时,整点报时器响,speaker高电位,随着手动清零,恢复原位。
4.4 星期模块
初值设为星期1,仿真中显示为:1、2、3、4、5、6、7、1、„
4.5 分频模块
4.6 顶层设计模块
5、课程设计总结
本次课程设计历时两天半,经过自己不断的努力完成了数字钟的设计,程序代码的编写调试及仿真。以前只是看书或者编一些很小的程序用来仿真,觉得没怎么难,但当进行此次课程设计真正处理一个较大程序时,问题便都显现出来。虽然在这个过程中遇到了很多的问题,但是最终都得到了很好的解决。
我此次设计的程序是在课本原有数字钟程序的基础上进行添加更改得来的,最初在运行原有程序时很顺利,但是随着加的东西越来越多,程序中出现的问题也就越来越多。很多同学都觉得在已有程序上再添加东西看似简单,实则很容易混乱,理不清头绪,而且这个原有程序是用进程所写,比较麻烦。虽然这样容易出现问题,不过我觉得这是一个锻炼的好机会。、在处理分频模块时,最开始按照老师的要求设置了频率,但是当运行时,发现根本出不来,后来与同学讨论后,发现频率过大,后来改为八分频,使得分频
模块能够使用。在一开始加星期模块时,没怎么考虑,可是当加进去后才发现,星期模块不能与其他模块很好的相连,不能很好的做到与“日模块”相合,后来虽有改动,但最终没能改成功。在加定时器功能时,一开始单独为定时器列了一个模块,所写的程序也很复杂,错误百出,最后程序改好后,仿真却出不来。后来经过同学的提点,就把程序改简单了,单纯的来个脉冲就出现高电平,但后来仿真发现高电平一直在高位,没法给脉冲,最后没办法便手动脉冲。与顶层模块连接后,又发现分满59的脉冲没给,因为我的时分秒全都放在了一起,只能将定时模块挪到时分秒模块中,这样反而使得整个工程简单了一些。
在各个模块都能仿真成功后,顶层模块的程序与仿真却出现了很多问题。首先是顶层模块程序有很多警告,例如“second_waver”没有用到之类的,后来在改动的过程中,便把内变量换为了外变量,但是有些原来的警告没有了,但是新的警告又出现了,原本能够连好的U3与U4 模块均不能正常连接,后来与同学自习查找,才终于将错误找出,由于粗心大意误动了一些元件例化时的变量,使得时间拜拜浪费。最后在仿真的时候,仿真结果出不来,经过与同学商量在每个程序中都给年月日等变量均付了初值,才让仿真出来。
此次课程设计虽然只有短短的两天半的时间,但是经过前期的查找资料,后来的实验室实际操作,再到现在的报告总结,我收获了很多。其实完成一个设计,编程只是很小的一部分,最主要的在于查找资料以及调试程序,此次设计我在查找资料方面做的不是很充分,以至于设计的面很小,而且在遇到问题后不能很快的找出,以后一定要做好准备工作。此次课程设计中遇到的问题看似不大,但都是很好的问题,对我以后的设计有很大的帮助,一定会牢牢记住。
最后,此次课程设计的完成很大程度上取决于老师和同学对我的指导与帮助,这更能说明,一个较大设计的完成及实现,不是仅限于自身,我们要学会与别人交流沟通,才能做到更好。
6、参考文献
[1]李景华,杜玉远.可编程逻辑器件与EDA技术.沈阳:东北大学出版社,2000 [2] 姜如东,VHDL语言程序设计及应用,北京邮电大学出版社
[3] 康华光.电子技术基础(数字部分)[M].北 京:高等教育出版社,2001.
[4] [5]
第五篇:EDA实现多功能数字钟
EDA实现多功能数字钟
实
验 报 告
专业班级:
学生姓名:
学生学号:
目录
一、内容摘要
二、实验要求
三、各底层模块设计
四、总体方案
五、心得体会
一、实验内容
利用 QuartusII 软件,结合所学的数字电路的知识设计一个 24 时多功能数 字钟,具有正常分、秒计时,动态显示的功能。分析整个电路的工作原理,分别说明各子模块的设计原理和调试、仿真、编 程的过程。
二、实验任务:
用 FPGA 器件和 EDA 技术实现多功能数字钟的设计
已知条件:
1、MAX+Plus 软件
2、FPGA 实验开发装置
基本功能:
1、以数字形式显示时、分、秒的时间;
2、小时计数器为 24 进制;
3、分、秒计数器为 60 进制。
三、底层模块设计(电路原理图及仿真)
1、小时计数器为24进制 电路原理图
仿真图
封装图
2、分、秒计时器都为60进制 电路原理图
仿真图
封装图
四、总体方案
按照上述实验要求,本次电子数字时钟实验,通过两个模 60 计数器及一个模 24 计数器级联既可以实现计时模块。多功能数字钟的主体部分 电路原理图
仿真图
封装图
五、心得体会
刚刚开始觉得做这个电子实验报告挺难的,因为对软件的不熟悉和对这个实验操作的也不熟悉,对着老师给的资料也做了很长时间,就是仿真的时候有些该注意的没有注意,导致仿真失败,但是后来还是自己慢慢拿的请教同学、老师哪里出了问题,后来才做出来了,把60进制的做出来了,后来的24进制按照老师给的电路原理图也成功了仿真出来,我用了很长时间才编写出来,现在看看,也没有那么难了。同时请教老师,和同学、通过实验掌握一些逻辑组合器件的基本功能和用法。总之,我很感谢这次实验可以给我这样的机会,这个实验给了我很对的收获,我相信这会对我以后的学习很有帮助。