资源描述
EDA课程设计汇报
设计题目: 数字时钟设计
班 级: 电气工程及其自动化
姓 名:
学 号:
日 期: 6月15日
目录
摘要
一、课程设计任务及要求 3
1.1试验目标 3
1.2功效设计 4
二、整体设计思想 4
2.1性能指标及功效设计 4
2.2总体方框图 4
三、具体设计 5
3.1数字时钟结构: 5
3.2控制模块结构 5
3.3.1按键处理模块 6
3.3.2定时时钟模块 6
3.3.3扫描时钟模块 6
3.3.4定时计数模块 6
3.3.5显示控制模块 7
四、主程序……………………………………………………………………………………………. 7
五、试验步骤……………………………………………………………………………………………14
5.1工程建立及存盘 14
5.2时序仿真 14
5.3引脚锁定 14
5.4硬件测试 15
5.5试验结果 15
结束语 15
参考文件 16
EDA技术实现数字电子时钟设计
作者: 指导老师:
摘 要
EDA技术在硬件实现方面融合了大规模集成电路制造技术,IC版图设计技术、ASIC测 试和封装技术、FPGA /CPLD编程下载技术、自动检测技术等;EDA技术为现代电子理论和设计表示和实现提供了可能性。在现代技术全部领域中,纵观很多得以飞速发展科学技术,多为计算机辅助设计,而非自动化设计。显然,最早进入设计自动化技术领域之一是电子技术,这就是为何电子技术一直处于全部科学技术发展最前列原因之一。不难了解,EDA技术已不是某一学科分支,或某种新技能技术,应该是一门综合性学科。它融合多学科于一体,打破了软件和硬件间壁垒,是计算机软件技术和硬件实现、设计效率和产品性能合二为一,它代表了电子设计技术合应用激活速 发展方向。
电子时钟以成为大家常生活中数字电子钟通常由振荡器,分频器,译码器,显示器等部分组成。电子时钟应用很广泛,应用于人家庭或车站、剧场、办公室等公共场所,给大家生活,学习,工作,娱乐带来极大便利, 尽管现在市场上以有现成电子时钟集成电路芯片,价格廉价这些全部是数字电路中最基础,应用最广电路。数字电子钟基础逻辑功效框图以下:它是一个将“时”,“分”,“秒”显示于人视觉器官计时装置。她计时装置周期为二十四小时,显示满刻度为23时 59分59秒,另外应有校时功效。
关键字:EDA;VHDL语言;电子时钟
一、 课程设计任务及要求
1.1试验内容
选择适宜可编程逻辑器件及外围电子元器件。设计一个数字电子钟,利用EDA软件(QUARTUSⅡ)进行编译及仿真,设计输入可采取VHDL硬件描述语言输入法和原理图输入法,并下载到EDA试验开发系统,连接外围电路,完成实际测试。
1.2设计要求
1)用六个数码管显示时、分、秒信息
2)设置复位功效,可经过复位键将时、分、秒清零
3)含有时、分预置功效,可分别对时和分做递增设置和递减设置
二、整体设计思想
2.1性能指标及功效设计
数字钟时常见一个计数装置,数字钟以1Hz频率工作。该设计完成数字钟运行和显示。其关键功效有:
(1)数字钟以1Hz频率工作,其输入频率为1MHz。
(2)数字钟显示时、分、秒信息。这些显示信息在6个7段数码管上完成。
(3)经过按键设置时、分信息。而且含有对数字钟复位功效。
复位键将时、分、秒清零,并做好重新计数准备。按键含有预置时、分功效。分别对目前时和分信息做递增设置和递减设置。
2.2总体方框图
三、具体设计
3.1数字时钟结构
该数字钟控制部分由PLD芯片完成。该芯片输入和输出接口由下面信号组成:
输入信号:
复位信号(reset)
时钟输入信号(clk)
小时递增信号(inc_hour)
小时递减信号(sub_hour)
分钟递增信号(inc_min)
分钟递减信号(sub_min)
输出信号:
7段数码管选信号(sel)
7段数码管段选信号(q)
3.2控制模块结构
该设计分成下面五个模块:定时时钟模块、扫描时钟模块、按键处理模块、定时计数模块和显示控制模块。图11.2给出了这多个模块之间信号连接关系。
3.2.1、按键处理模块
因为VHDL语言规则,将按键处理和定时模块设计在一起。为了描述清楚,将对按键处理进行说明。在该设计中,采取异步复位电路方法。当复位信号低有效时,计数器停止计数,时、分、秒清零。
对于小时递增、递减按键操作,经过一个1Hz计数时钟采样。图11.3给出了递增、递减操作时序。
当1Hzdiv_clk信号上升沿到来时,检测hour_inc和hour_dec按键,图中虚线表示在时钟上升沿对按键信号进行采样。当hour_inc或hour_dec按键低有效时,对小时进行递加或递减操作。对于分钟递加、递减按键操作,也是经过一个1Hz计数时钟采样。原理同图11.3。
3.2.2、定时时钟模块
定时时钟模块其作用就是将外部提供1MHz时钟,经过分频器后向模块内定时计数模块提供1Hz定时计数时钟。在设计定时时钟模块时,采取同时计数电路。
3.2.3、扫描时钟模块
扫描时钟模块作用就是经过对1MHz分频处理后,向显示控制模块提供适宜显示扫描时钟,该时钟必需经过合理设计,才能确保7段数码显示稳定。在设计扫描时钟模块时,采取同时计数电路。
3.2.4、定时计数模块
定时计数模块是该设计中最关键一部分,在设计该模块时,为了便于后续显示控制模块设计,将时、分、秒进行分离,即小时分成了小时十位和个位分别处理,分钟分成了分钟十位和个位分别处理。秒分成了秒十位和个位分别处理。在该设计中,采取二十四小时计数模式。 比如:13:28:57。13为小时表示,1为小时十位,3为小时个位;28为分钟表示,2为分钟十位,8为分钟个位;57为秒表示,5为秒十位,7为秒个位。
秒个位计数从0-9,即十进制计数。当秒个位计数到9后,准备向秒十位进位。秒十位计数从0-5,即六进制计数。当秒十位计数到5后,准备向分个位进位。
分钟个位计数从0-9,即十进制计数。当分钟个位计数到9后,准备向分钟十位进位。分钟十位计数从0-5,即六进制计数。当分钟十位计数到5后,准备向小时个位进位。
对于小时处理比较复杂,小时十位和个位之间存在下面关系:
(1)当小时十位为0或1时,小时个位能够计数范围为0-9,即十进制计数;
(2)当小时十位为2时,小时各位能够计数范围为0-3,即四进制计数;
3.2.5、显示控制模块
显示控制模块关键作用是在7段数码管上正确显示0-9数字。sel三位选择线和3-8译码器相连
四、主程序
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity clock is
port(
clk : in std_logic;
rst : in std_logic;
inc_min : in std_logic;
sub_min : in std_logic;
inc_hour : in std_logic;
sub_hour : in std_logic;
sel : out std_logic_vector(5 downto 0);
q : out std_logic_vector(7 downto 0));
end clock;
architecture Behavioral of clock is
signal sec_counter1:std_logic_vector(3 downto 0);
signal sec_counter2:std_logic_vector(3 downto 0);
signal min_counter1:std_logic_vector(3 downto 0);
signal min_counter2:std_logic_vector(3 downto 0);
signal hour_counter1:std_logic_vector(3 downto 0);
signal hour_counter2:std_logic_vector(3 downto 0);
signal divcounter : std_logic_vector(8 downto 0);
signal div_clk : std_logic;
signal scancounter : std_logic_vector(1 downto 0);
signal scan_clk : std_logic;
signal scan_out : std_logic_vector(2 downto 0);
signal secseg1,secseg2,minseg1,minseg2,hourseg1,hourseg2:std_logic_vector(7 downto 0);
begin
process(rst,clk)
begin
if(rst='1')then
divcounter<="";
div_clk<='0';
elsif(rising_edge(clk)) then
if(divcounter="") then
divcounter<="";
div_clk<=not div_clk;
else
divcounter<=divcounter+1;
end if;
end if;
end process;
process(rst,clk)
begin
if(rst='1')then
scancounter<="00";
scan_clk<='0';
elsif(rising_edge(clk)) then
if(scancounter="11") then
scancounter<="00";
scan_clk<=not scan_clk;
else
scancounter<=scancounter+1;
end if;
end if;
end process;
clock:process(div_clk,rst)
begin
if(rst='1')then
sec_counter1<=X"0";
sec_counter2<=X"0";
min_counter1<=X"0";
min_counter2<=X"0";
hour_counter1<=X"0";
hour_counter2<=X"0";
elsif(rising_edge(div_clk))then
if(inc_min='1') then
if(min_counter1=X"9") then
min_counter1<=X"0";
if(min_counter2>=X"5") then
min_counter2<=X"0";
else
min_counter2<=min_counter2+1;
end if;
else
min_counter1<=min_counter1+1;
end if;
elsif(sub_min='1') then
if(min_counter1=X"0") then
min_counter1<=X"9";
if(min_counter2=X"0")then
min_counter2<=X"5";
else
min_counter2<=min_counter2-1;
end if;
else
min_counter1<=min_counter1-1;
end if;
elsif(inc_hour='1') then
if(hour_counter2=X"2")then
if(hour_counter1=X"3")then
hour_counter1<=X"0";
hour_counter2<=X"0";
else
hour_counter1<=hour_counter1+1;
end if;
else
if(hour_counter1=X"9") then
hour_counter1<=X"0";
hour_counter2<=hour_counter2+1;
else
hour_counter1<=hour_counter1+1;
end if;
end if;
elsif(sub_hour='1') then
if(hour_counter1=X"0")then
if(hour_counter2=X"0")then
hour_counter1<=X"3";
hour_counter2<=X"2";
else
hour_counter2<=hour_counter2-1;
hour_counter1<=X"9";
end if;
else
hour_counter1<=hour_counter1-1;
end if;
else
if(sec_counter1>=X"9") then
sec_counter1<=X"0";
if(sec_counter2>=X"5") then
sec_counter2<=X"0";
if(min_counter1>=X"9") then
min_counter1<=X"0";
if(min_counter2>=X"5") then
min_counter2<=X"0";
if(hour_counter2=X"2") then
if(hour_counter1=X"3") then
hour_counter1<=X"0";
hour_counter2<=X"0";
else
hour_counter1<=hour_counter1+1;
end if;
else
if(hour_counter1=X"9") then
hour_counter1<=X"0";
hour_counter2<=hour_counter2+1;
else
hour_counter1<=hour_counter1+1;
end if;
end if;
else
min_counter2<=min_counter2+1;
end if;
else
min_counter1<=min_counter1+1;
end if;
else
sec_counter2<=sec_counter2+1;
end if;
else
sec_counter1<=sec_counter1+1;
end if;
end if;
end if;
end process clock;
process(rst,scan_clk)
begin
if (rst='1') then
scan_out<="000";
elsif(rising_edge(scan_clk)) then
if(scan_out="101")then
scan_out<="000";
else
scan_out<=scan_out+1;
end if;
end if;
end process;
process(scan_out)
begin
case scan_out is
when "000" => q<=secseg1; sel<="000001";
when "001" => q<=secseg2; sel<="000010";
when "010" => q<=minseg1; sel<="000100";
when "011" => q<=minseg2; sel<="001000";
when "100" => q<=hourseg1; sel<="010000";
when "101"=> q<=hourseg2; sel<="100000";
when others => q<="11111111";sel<="000000";
end case;
end process;
second_counter1:process(sec_counter1)
begin
case sec_counter1 is
when "0000" => secseg1<="10111111";
when "0001" => secseg1<="10000110";
when "0010" => secseg1<="11011011";
when "0011" => secseg1<="11001111";
when "0100" => secseg1<="11100110";
when "0101" => secseg1<="11101101";
when "0110" => secseg1<="11111101";
when "0111" => secseg1<="10000111";
when "1000" => secseg1<="11111111";
when "1001" => secseg1<="11101111";
when others => secseg1<="11111111";
end case;
end process second_counter1;
second_counter2:process(sec_counter2)
begin
case sec_counter2 is
when "0000" => secseg2<="00111111";
when "0001" => secseg2<="00000110";
when "0010" => secseg2<="01011011";
when "0011" => secseg2<="01001111";
when "0100" => secseg2<="01100110";
when "0101" => secseg2<="01101101";
when others => secseg2<="01111111";
end case;
end process second_counter2;
minute_counter1:process(min_counter1)
begin
case min_counter1 is
when "0000" => minseg1<="10111111";
when "0001" => minseg1<="10000110";
when "0010" => minseg1<="11011011";
when "0011" => minseg1<="11001111";
when "0100" => minseg1<="11100110";
when "0101" => minseg1<="11101101";
when "0110" => minseg1<="11111101";
when "0111" => minseg1<="10000111";
when "1000" => minseg1<="11111111";
when "1001" => minseg1<="11101111";
when others => minseg1<="11111111";
end case;
end process minute_counter1;
minute_counter2:process(min_counter2)
begin
case min_counter2 is
when "0000" => minseg2<="00111111";
when "0001" => minseg2<="00000110";
when "0010" => minseg2<="01011011";
when "0011" => minseg2<="01001111";
when "0100" => minseg2<="01100110";
when "0101" => minseg2<="01101101";
when others => minseg2<="01111111";
end case;
end process minute_counter2;
process(hour_counter1)
begin
case hour_counter1 is
when "0000" => hourseg1<="10111111";
when "0001" => hourseg1<="10000110";
when "0010" => hourseg1<="11011011";
when "0011" => hourseg1<="11001111";
when "0100" => hourseg1<="11100110";
when "0101" => hourseg1<="11101101";
when "0110" => hourseg1<="11111101";
when "0111" => hourseg1<="10000111";
when "1000" => hourseg1<="11111111";
when "1001" => hourseg1<="11101111";
when others => hourseg1<="11111111";
end case;
end process;
hor_counter2:process(hour_counter2)
begin
case hour_counter2 is
when "0000" => hourseg2<="00111111";
when "0001" => hourseg2<="00000110";
when "0010" => hourseg2<="01011011";
when others => hourseg2<="01111111";
end case;
end process;
end Behavioral;
五、试验步骤
5.1工程建立及存盘
1. 打开 QuartusⅡ,单击“File”菜单,选择 File→New Project Wizard,对话框以下:分别输入项目标工作路径、项目名和实体名,单击Finish。
2.单击“File”菜单,选择New,弹出小对话框,双击“VHDL File",即选中了文本编辑方法。在出现“Vhdl1.vhd”文本编辑窗中键入VHDL程序,输入完成后,选择File→Save As,即出现“Save As”对话框。选择自己建立好存放本文件目录,然后在文件名框中键入文件名,按“Save”按钮。
3. 建立工程项目,在保留VHDL文件时会弹出是否建立项目标小窗口,点击“Yes”确定。即出现建立工程项目标导航窗口,点击“Next”,最终在出现屏幕中分别键入新项目标工作路径、项目名和实体名。注意,原理图输入设计方法中,存盘原理图文件名能够是任意,但VHDL程序文本存盘文件名必需和文件实体名一致,输入后,单击“Finish”按钮。
4.然后对程序进行编译
5.2时序仿真
建立波形文件:选择 File→New,在New窗中选中“Other File”标签。在出现屏幕中选择“Vector Waveform File”项出现一新屏幕。在出现新屏幕中,双击“Name”下方空白处,弹出“Insert Nod or Bus”对话框,单击该对话框“Node Finder……”。在屏幕中 Filter 中选择 Pins,单击“List”。以后,单击“>>”,全部输入/输出全部被拷贝到右边一侧,这些正是我们期望各个引脚,也能够只选其中一部分,依据实际情况决定。然后单击屏幕右上脚 “OK”。在出现小屏幕上单击“OK”。
设定仿真时间宽度。选择 Edit → End time…选项,在End time选择窗中选择合适仿真时间域,方便有足够长观察时间。
波形文件存盘。选择File→Save as 选项,直接存盘即可。
运行仿真器。在菜单中选择项,直到出现,仿真结束。
5.3引脚锁定
将设计编程下载进选定目标器件中
操作以下:
1.选择 Assignments → Assignments Editor ,即进入 Assignments Editor编辑器。在Category 栏选择 Pin,或直接单击右上侧 Pin 按钮。
2.双击 TO 栏《new》,在出现下拉栏中选择对应端口信号名(如 D[0]);然后双击对应栏《new》,在出现下拉栏中选择对应端口信号名期间引脚号。
3.最终存放这些引脚锁定信息后,必需再编译(开启 )一次,才能将引脚锁定信息编译进编程下载文件中。以后就能够准备将编译好 SOF 文件下载到试验系统FPGA中去了。
5.4硬件测试
1.首先将下载线把计算机打印机口和目标板(如开发板或试验板)连接好,打开电源,选择模式3。
2.打开编辑窗和配置文件。选择,弹出一个编辑窗。在Mode栏中选择JTAG,并在选项下小方框打勾。注意查对下载文件路径和文件名。假如文件没有出现或犯错,单击左Add file侧按钮,手动选择配置文件 clock.sof。
3.最终单击下载标符Start,即进入对目标器件 FPGA 配置下载操作。当 Progress 显示100%,和在底部处理栏中出现 Configuration Succeeded 时,表示编程成功,图所表示。注意,假如必需时,可再次单击 Start ,直至编程成功。
4.下载完成后,经过硬件测试深入确定设计是否达成全部技术指标,如未达成,可逐步检验,哪部分出现问题。假如是代码出现问题,须修改代码;若是时序波形图有问题,须重新设置。
5.5试验结果
试验箱使用模式3,键8为复位按键,键8为0时正常工作。键3、4设置小时,键1、2设置分钟。
下载成功后,按下键8,及使六个LED复位清零,松开键8,显示数秒自动计时,能够经过3、4键设置小时数,1、2键设置分钟数。当秒数满60则进一位,分钟数满60进一位,当显示为23:59:59时,秒数在加一则显示00:00:00,以后从新计时。
结束语
伴随电子设计自动化技术普及,利用EDA技术进行数字电路课程设计,不仅能够很好地锻炼学生综合设计开发能力和动手能力,从而激发学生学习爱好,还能够大大节省数字电路课程设计试验成本,提升设计效率。所以,将EDA技术应用于数字电路课程设计必将成为以后数字电路试验课程改革新动向。EDA软件,可方便地在计算机上进行电路设计、仿真,其电路结构及设计观念能够很轻易地被修正;也可方便地更换所需要元件。经过模拟可快速地反应出所设计电路性能。若能利用计算机辅助设计进行电路模拟和分析,则可有效地节省资源、缩短产品研发成本和时间。
在此次课程设计中,曾碰到过不少问题,假如单靠我个人努力,极难按时完成,在此,我衷心感谢我指导老师,我学到了很多东西。知道老师认真负责工作态度,严谨治学精神和深厚理论水平全部使我获益非浅。老师不管在理论上还是在实践中,全部给我无私帮助和悉心教导,使我课程得以顺利地按时完成。
参考文件
[1] 曾繁泰 李冰 李晓林.《EDA工程概论》[M]. 清华大学出版社, .
[2] 胡立涛.《EWB电子仿真试验指导书》[M]. 南海出版企业, .
[3] 朱运利.《EDA技术应用》[M]. 电子工业出版社, .
[4] 郭勇.《EDA技术》[M]. 高等教育出版社, .
[5] 钟文耀 段玉生 何丽静.《EWB电路设计入门和应用》[M].清华大学出版社, .
[6] 崔建明.《电子电工EDA仿真技术》[M]. 高等教育出版社, .
[7] 周功明 周陈深.《基于Electronics Workbench 6.0 数字电子钟设计和仿真》
展开阅读全文