电子系统课程设计任务书设计题目:基于EDA技术的数字时钟设计设计目的:课程设计是一种复杂的学习实践过程。
设计过程采用系统设计的方法,先分析任务,得到系统设计的要求,然后进行总体设计,划分子系统模块,然后进行详细设计,编写各个功能子系统VHDL代码并进行功能仿真,最后进行整个系统总装并仿真。
设计内容:设计一个采用0.5英寸LED数码管显示的数字时钟系统,工作电源5V,它采用24小时制,具有“时”、“分”、“秒”显示,并且可以校正时间显示。
设计要求:1.由石英晶体多谐振荡器20MHz和分频器产生1Hz标准秒脉冲;(说明:EDA试验箱中晶振频率20MHz,经试验箱内一系列二分频可将频率降低,但无法直接产生1Hz信号,需要大家根据实际情况编制分频器得到1Hz信号);2.秒电路、分电路均为60进制计数,时电路为24进制计数;3.数码管采用动态扫描方式;4.能动手校时,校时模块功能可以自由发挥。
比如可用两个按钮实现校时,A按钮控制调整项目,B按钮调整数字,B按钮还可以根据按下时间长短实现慢调、快调功能。
也可以用三个按钮实现增减两个方向的手动校时。
校时用按钮开关不能超过4个;5.扩展内容:1)进入校时状态后,被调整数字以2Hz闪烁;2)24/12小时可调,处于12小时制时,要有AM/PM显示;3)所有开关加入防抖设计;4)加入检测外部环境亮度功能,夜间自动降低数码管显示亮度;5)加入整点报时电路;6)增加秒表功能;7)增加报闹功能。
6.以上电路功能除外部环境亮度检测电路外均由VHDL代码实现层次式设计,顶层电路可以采用EDA电路图。
设计成果:1.课程设计说明书,要求内容完整,图表完备,条理清楚,字迹工整,程序完整有相应的注解,仿真波形设计合理有必要的分析,引用资料要注明出处。
2.顶层电路原理图,各层电路VHDL代码及仿真波形。
设计说明书目录一、前言二、任务分析和方案设计三、外部输入输出要求四、内部各功能模块1)分频模块2) 秒计数模块SECOND3) 分计数模块MINUTE4)时计数模块HOUR5)整点报时功能模块ALERT6)扫描模块SELTIME7)译码显示功能模块DISPLAY8)按键防抖模块KEY五、系统顶层设计图六、各模块块程序七、心得体会参考文献基于EDA技术的数字时钟设计一.前言EDA简介EDA是电子设计自动化(Electronic Design Automation)的缩写,在20世纪90年代初从计算机辅助设计(CAD)、计算机辅助制造(CAM)、计算机辅助测试(CAT)和计算机辅助工程(CAE)的概念发展而来的。
EDA技术就是以计算机为工具,设计者在EDA 软件平台上,用硬件描述语言HDL完成设计文件,然后由计算机自动地完成逻辑编译、化简、分割、综合、优化、布局、布线和仿真,直至对于特定目标芯片的适配编译、逻辑映射和编程下载等工作。
EDA技术的出现,极大地提高了电路设计的效率和可操作性,减轻了设计者的劳动强度。
二.任务分析和方案设计根据设计内容与要求知,本系统由分频模块(20MHz变为1Hz)、秒计数模块(六十进制)、分计数模块(六十进制)、时计数模块(二十四进制)、时间数据扫描分时选择模块和8421BCD 到7段码的译码模块,再加上一个整点报时模块和按键防抖模块作为发挥部分。
设计框图三、外部输入输出要求1.输入接口代表清零,调时,调分信号RESET、SETHOUR、SETMIN 的引脚分别接高电平、KEY1、KEY2;代表计数时钟信号CLK和扫描时钟信号CLKDSP的引脚分别同1HZ时钟源和200HZ(或更高)时钟源相连。
2.输出接口代表扫描显示驱动信号SEL[2..0]连到SEL2、SEL1、SEL0端,段码信号输出abcdefg连接到7段数码管的段码插口abcdefg端,小数点DP输出端同7段数码管的段码插口DP 相连;代表扬声器驱动信号的引脚SPEAKER同扬声器驱动接口SPEAKER相连;代表花样LED灯显示的信号引脚LAMP[2..0]同3个LED灯相连。
四、内部各功能模块:1)FREQ分频模块:整点报时用的200Hz与时钟用的1Hz的脉冲信号,这里的输入信号是20MHz信号,所以要设计两个分频器,将20MHz变为1Hz、200Hz。
程序见后面。
例图为1000分频,输入为5MHz,输出为5KHz.2)秒计数模块SECOND:60进制,带有进位和清零功能的,输入为1Hz脉冲和高电平有效的清零信号RESET。
程序见后面。
3)分计数模块MINUTE60进制,带有进位和置数功能的,输入为1Hz脉冲和高电平有效的使能信号EN。
程序见后面。
4)时计数模块HOUR:24进制,输入为1Hz脉冲和高电平有效的使能信号EN。
程序见后面。
5)整点报时功能模块ALERT:输入为分/秒信号,输出为SPEAK信号。
程序见后面。
6)扫描模块SELTIME:输入为秒、分、时、扫描时钟CLK1,输出为DP和显示控制信号SEL。
程序见后面。
7)译码显示功能模块DISPLAY:输入为NUM,输出为LED。
程序见后面。
8)按键防抖模块KEY输入为按键信号和20MHz的时钟信号,输出为CK信号。
程序见后面。
五、系统顶层设计图六、各模块程序1.分频器a(20MHZ分成1HZ)程序library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity freq1 isport(clk:in std_logic;freout:out std_logic);end freq1;architecture behave of freq1 issignal full:std_logic;beginp1:process(clk)variable cqi:std_logic_vector(23 downto 0);beginif clk'event and clk='1' thenif cqi<9999999 thencqi:=cqi+1;else cqi:=(others=>'0');end if;end if;if cqi=9999999 then full<='1';else full<='0';end if;end process;p2:process(full)variable cnt1:std_logic;beginif full'event and full='1' thencnt1:=not cnt1;if cnt1='1' thenfreout<='1';elsefreout<='0';end if;end if;end process;end behave;2.分频器b(20MHz分为200Hz)程序library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity freq2 isport(clk:in std_logic;freout:out std_logic);end freq2;architecture fun of freq2 isbeginp1:process(clk)variable cq:std_logic_vector(17 downto 0);beginif clk'event and clk='1' thenif cq<99999 thencq:=cq+1;else cq:=(others=>'0');end if;end if;if cq=99999 then freout<='1';else freout<='0';end if;end process;end fun;由上面程序原理可得1000分频的波形图3.秒计数器LIBRARY ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;ENTITY second ISPORT(clk,reset,setmin:IN STD_LOGIC;enmin:OUT STD_LOGIC;daout:out std_logic_vector(6 downto 0));END entity second;ARCHITECTURE fun OF second ISSIGNAL 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)beginif (reset='0') then count<="0000000"; \\若reset为0,则异步清零(即直接复0)elsif (clk'event and clk='1') then \\否则,若clk上升沿到if (count(3 downto 0)="1001") then \\若个位计数值恰好到“1001”if(count<16#60#) then \\ 又若count小于16#60#(即X“60” ;即60H,为十六进制数写法)if (count="1011001") then \\又若count已到59Denmin_1<='1';count<="0000000";\\则置进位为1及count复0else \\若count未到59Dcount<=count+7; \\则加7,而+7=+1+6,即作“加6校正”,使前面16#60#的end if; \\个位转变为8421BCD的容量,即个位的最大值只能是1001了(注)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<16#60#count<=count+1; \\则count加1enmin_1<='0' after 100 ns; \\没有进位发生else \\否则,若count不小于16#60#(即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;仿真波形图如下:4.分计数器LIBRARY ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;ENTITY minute ISPORT(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 ISSIGNAL count:STD_LOGIC_VECTOR(6 downto 0);SIGNAL enhour_1,enhour_2:STD_LOGIC;BEGINdaout<=count;enhour_2<=(sethour and clk1);enhour<=(enhour_1 or enhour_2);process(clk,reset,sethour)beginif(reset='0')thencount<="0000000";elsif(clk'event and clk='1')thenif(count(3 downto 0)="1001")thenif(count<16#60#)thenif(count="1011001")thenenhour_1<='1';count<="0000000";ELSEcount<=count+7;end if;elsecount<="0000000";end if;elsif(count<16#60#)thencount<=count+1;enhour_1<='0' after 100 ns;elsecount<="0000000";end if;end if;end process;END fun;仿真波形如下图;5.小时文本LIBRARY ieee;use ieee .std_logic_1164.all;use ieee .std_logic_unsigned.all;ENTITY hour ISPORT(clk,reset:IN STD_LOGIC;daout:out std_logic_vector(5 downto 0));END entity hour;ARCHITECTURE fun OF hour ISSIGNAL count:STD_LOGIC_VECTOR(5 downto 0); BEGINdaout<=count;process(clk,reset)beginif(reset='0')thencount<="000000";elsif(clk'event and clk='1')thenif(count(3 downto 0)="1001")thenif(count<16#23#)thencount<=count+7;elsecount<="000000";end if;elsif(count<16#23#)thencount<=count+1;elsecount<="000000";end if;end if;end process;END fun;仿真波形如下图:6.报警文本LIBRARY ieee;use ieee .std_logic_1164.all;use ieee .std_logic_unsigned.all;ENTITY alert ISPORT(clk:IN STD_LOGIC;dain: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 ISsignal count:std_logic_vector(1 downto 0);signal count1:std_logic_vector(1 downto 0);BEGINspeaker:process(clk)beginspeak<=count(1);if(clk'event and clk='1')thenif(dain="0000000")thenif(count1>="10")thencount1<="00"; \\-count1为三进制加法计数器elsecount1<=count1+1;end if;end if;end if;end process speaker;lamper:process(clk)beginif(rising_edge(clk))thenif(count<="10")thenif(count="00")thenlamp<="001"; \\循环点亮3只LED灯elsif(count="01")thenlamp<="010";elsif(count="10")thenlamp<="100";end if;count<=count+1;elsecount<="00";end if;end if;end process lamper;END fun;7.时间数据扫描分时选择模块文本LIBRARY ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;ENTITY seltime ISPORT(clk1,reset:IN STD_LOGIC;sec,min: IN STD_LOGIC_VECTOR(6 downto 0);hour:in std_logic_vector(5 downto 0);daout:OUT STD_LOGIC_vector(3 downto 0);dp:OUT STD_LOGIC;sel:out std_logic_vector(2 downto 0));END seltime;ARCHITECTURE fun OF seltime ISSIGNAL count:STD_LOGIC_vector(2 downto 0);BEGINsel<=count;process(clk1,reset)beginif(reset='0')thencount<="000";elsif(clk1'event and clk1='1')thenif(count>="101")thencount<="000";elsecount<=count+1;end if;end if;case count iswhen"000"=>daout<=sec(3 downto 0);dp<='0'; \\送出秒个位,秒个位的dp 不点亮when"001"=>daout(3)<='0';daout(2 downto 0)<=sec(6 downto 4); \\送出秒十位dp<='0'; \\秒十位的dp不点亮when"010"=>daout<=min(3 downto 0);dp<='1'; \\送出分个位,分个位的dp 点亮when"011"=>daout(3)<='0';daout(2 downto 0)<=min(6 downto 4); \\送出分十位dp<='0'; \\分十位的dp不点亮when"100"=>daout<=hour(3 downto 0);dp<='1'; \\送出小时个位,小时个位的dp点亮when others=>daout(3 downto 2)<="00"; \\送出小时十位daout(1 downto 0)<=hour(5 downto 4);dp<='0'; \\小时十位的dp不点亮end case;end processend fun;8.译码器文本LIBRARY ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;ENTITY deled ISPORT(num: IN std_logic_vector(3 downto 0);led: OUT std_logic_vector(6 downto 0));END deled;ARCHITECTURE fun OF deled ISBEGIN--abcdefgled<="1111110" when num="0000" else \\7段管显示0,led[6..0]=7EH "0110000" when num="0001" else \\7段管显示1,led[6..0]=30H"1101101" when num="0010" else \\7段管显示2,led[6..0]=6DH"1111001" when num="0011" else \\ 7段管显示3,led[6..0]=79H"0110011" when num="0100" else \\7段管显示4,led[6..0]=33H"1011011" when num="0101" else \\ 7段管显示5,led[6..0]=5BH "1011111" when num="0110" else \\7段管显示6,led[6..0]=5FH"1110000" when num="0111" else \\ 7段管显示7,led[6..0]=70H"1111111" when num="1000" else \\ 7段管显示8,led[6..0]=7FH"1111011" when num="1001" else \\7段管显示9,led[6..0]=7BH"1110111" when num="1010" else \\ 7段管显示A,led[6..0]=77H "0011111" when num="1011" else \\ 7段管显示b,led[6..0]=1FH"1001110" when num="1100" else \\ 7段管显示C,led[6..0]=4EH "0111101" when num="1101" else \\ 7段管显示d,led[6..0]=3DH "1001111" when num="1110" else \\ 7段管显示E,led[6..0]=4FH "1000111" when num="1111" ; \\ 7段管显示F,led[6..0]=47H END fun;9.按键A、B防抖程序library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity key isport(clk1,key1: in std_logic;ck1:out std_logic);end entity key;architecture fun of key issignal tmp1:std_logic_vector(9 downto 0);beginprocess(clk1)beginif rising_edge(clk1) thentmp1(0)<=key1;tmp1(9 downto 1)<=tmp1(8 downto 0);if tmp1="1111111111" then ck1<='1';else ck1<='0';end if ;end if;end process;end fun;仿真波形为:七、心得体会论文的撰写过程是对所学的电子技术基本理论知识的综合运用,对三年专业知识的一次综合应用、扩充和深化,也是对我们理论运用于实际设计的一次锻炼。