资源描述
VHDL,FPGA数字闹钟
———————————————————————————————— 作者:
———————————————————————————————— 日期:
16
个人收集整理 勿做商业用途
课程设计:多功能数字闹钟的设计
专业:电气工程与自动化
姓名:陶静、 孙韬
学号:2009031523、2009031524
引言
人类社会已进入到高度发达的信息化社会,信息社会的发展离不开电子产品的进步。现代电子产品在性能提高、复杂度增大的同时,价格却一直呈下降趋势,而且产品更新换代的步伐也越来越快,实现这种进步的主要因素是生产制造技术和电子设计技术的发展。前者以微细加工技术为代表,目前已进展到深亚微米阶段,可以在几平方厘米的芯片上集成数千万个晶体管.后者的核心就是EDA技术,EDA是指以计算机为工作平台,融合应用电子技术、计算机技术、智能化技术最新成果而研制成的电子CAD通用软件包,主要能辅助进行三方面的设计工作:IC设计,电子电路设计,PCB设计.没有EDA技术的支持,想要完成上述超大规模集成电路的设计制造是不可想象的,反过来,生产制造技术的不断进步又必将对EDA技术提出新的要求。回顾近30年电子设计技术的发展历程,可将EDA技术分为三个阶段。七十年代为CAD阶段,人们开始用计算机辅助进行IC版图编辑、PCB布局布线,取代了手工操作,产生了计算机辅助设计的概念。八十年代为CAE阶段,与CAD相比,除了纯粹的图形绘制功能外,又增加了电路功能设计和结构设计,并且通过电气连接网络表将两者结合在一起,实现了工程设计,这就是计算机辅助工程的概念.CAE的主要功能是:原理图输入,逻辑仿真,电路分析,自动布局布线,PCB后分析.九十年代为ESDA阶段,尽管CAD/CAE技术取得了巨大的成功,但并没有把人从繁重的设计工作中彻底解放出来。在整个设计过程中,自动化和智能化程度还不高,各种EDA软件界面千差万别,学习使用困难,并且互不兼容,直接影响到设计环节间的衔接.基于以上不足,人们开始追求:贯彻整个设计过程的自动化,这就是ESDA即电子系统设计自动化。高层次设计给我们提供了一种%26ldquo;自顶向下%26rdquo;(Top%26ndash;Down)的全新设计方法,这种设计方法首先从系统设计入手,在顶层进行功能方框图的划分和结构设计。在方框图一级进行仿真、纠错,并用硬件描述语言对高层次的系统行为进行描述,在系统一级进行验证.然后用综合优化工具生成具体门电路的网表,其对应的物理实现级可以是印刷电路板或专用集成电路。由于设计的主要仿真和调试过程是在高层次上完成的,这一方面有利于早期发现结构设计上的错误,避免设计工作的浪费,同时也减少了逻辑功能仿真的工作量,提高了设计的一次成功率。现代电子产品的复杂度日益加深,一个电子系统可能由数万个中小规模集成电路构成,这就带来了体积大、功耗大、可靠性差的问题,解决这一问题的有效方法就是采用ASIC(Application Specific Integrated Circuits)芯片进行设计。ASIC按照设计方法的不同可分为:全定制ASIC,半定制ASIC,可编程ASIC(也称为可编程逻辑器件)。设计全定制ASIC芯片时,设计师要定义芯片上所有晶体管的几何图形和工艺规则,最后将设计结果交由IC厂家掩膜制造完成。优点是:芯片可以获得最优的性能,即面积利用率高、速度快、功耗低.缺点是:开发周期长,费用高,只适合大批量产品开发.半定制ASIC芯片的版图设计方法有所不同,分为门阵列设计法和标准单元设计法,这两种方法都是约束性的设计方法,其主要目的就是简化设计,以牺牲芯片性能为代价来缩短开发时间。可编程逻辑芯片与上述掩膜ASIC的不同之处在于:设计人员完成版图设计后,在实验室内就可以烧制出自己的芯片,无须IC厂家的参与,大大缩短了开发周期。20世纪末,电子技术获得了飞速的发展,在其带动下,现代电子产品几乎渗透了社会的各个领域,有力的推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。现代电子设计技术的核心是EDA技术。EDA技术就是依赖功能强大的计算机,在EDA工具软件平台上,对以硬件描述语言VHDL为系统逻辑描述手段完成的设计文件,自动的完成逻辑编译、逻辑化简、逻辑分割、逻辑综合、结构综合,以及逻辑优化和仿真测试,直至实现既定的电子线路系统功能。EDA技术使得设计者的工作仅限于利用软件的方式,即利用硬件描述语言和EDA软件来完成对系统硬件功能的实现。从另一方面看,在现代到新电子产品的设计和生产中,微电子技术和现代电子设计技术时互相促进、互相推动又相互制约的两个技术环节.前者代表了物理层在广度和深度上硬件电路实现的发展,后者则反应了现代先进的电子理论、电子技术、仿真技术、设计.工艺和设计技术与最新的计算机软件技术有机的融合和升华。因此,严格的说,EDA 技术已不是某一学科的分支,或某种新的技能技术,它应该是一门综合性学科。它融合多学科于一体,又渗透于各学科之中,打破了软件和硬件间的壁垒,使计算机的软件技术与硬件实现、设计效率和产品性能合二为一,它代表了电子设计技术和应用技术的发展方向。作为当代大学生,特别是信息工程类的学生,EDA技术是知识体系中不可缺少的一部分。所以我们这次课程设计是基于EDA技术来设计一个闹钟系统,通过对EDA的实际应用来更加充分的认识、使用和发展EDA技术。个人收集整理,勿做商业用途个人收集整理,勿做商业用途
一、 设计任务与要求
1、设计要求
(1)有“时”、“分”、“秒”十进制显示;
(2)计时以24小时为周期;
(3)具有校时电路,能对当前时间进行校对,(校对小时和分钟);
(4)整点报时;
(5)闹钟起闹(整点起闹)。
2、系统设计
3、主体设计
(1)秒信号发生器
(2)计时部分框图
(3)校时电路
当数字钟接通电源或者计时出现误差时,均需要校正时间,校时是数字钟应具备的基本功能
方案:快脉冲.将所需要校对的时或分计数电路的脉冲输入端切换到秒信号,使之用快脉冲计数,当到达标准时间后再切换回正确的输入信号,达到校准目的;
(4)定时起闹
要求整点起闹,不要求分;
可以用点亮发光二极管来表示。
(5)整点报时
每到整点时起闹.
二、 设计原理、方案
1、系统结构描述
(一) 系统的顶层文件:
1、 顶层文件图:(见下页)
2、 各模块的解释:
(1)、7个输入量clk,rst,alinem,alineh,alarm:
其中clk为1KHZ,给数码管译码模块提供刷新频率,并且经过三个74163十倍分频变为1HZ给秒模块,闹铃模块,校准模块等提供脉冲。Res为复位输入端:按下的时候时钟时间全部清零;alinem,alineh为分、时的校准开关:按下的时候能够使分、时以秒的速度跳动,达到校时的功能。Alarm为闹钟设定开关:按下时设定闹钟时间。
(2)4个输出端口:sg[7。。0]、bt[7..0]、point、ledalarm。
其中sg[7。.0]为数码管的段选,bt[7。.0]为数码管的位选.Point为整点报时的闹铃输出端,ledalarm为闹钟时的响铃输出端。
(3)、CNT60s模块:
这个模块式将clk_1hz这个时钟信号进行60进制计数,并产生一个分钟的触发信号.该模块能将当前计数值实时按BCD码的格式输出。将该输出接到两位LED数码后能时时显示秒的状态。
library ieee;
use ieee.std_logic_1164。all;
use ieee。std_logic_unsigned.all;
entity cnt60 is
port(clk,rst:in std_logic;
co:out std_logic;
qh,ql:buffer std_logic_vector(3 downto 0));
end cnt60;
architecture behave of cnt60 is
begin
process(rst,clk)
begin
if(rst='0’)then ql<="0000”;qh〈=”0000";
elsif(clk'event and clk=’1’)then
if(ql=9) then ql〈="0000";
if (qh=5) then
qh<=”0000";co〈=’1';
else
qh<=qh+1;
end if;
else ql〈=ql+1;co<='0’;
end if;
end if;
end process;
end behave;
(4)、CNT60M模块:
这个模块式将CNT60S或者1HZ的clk的输出信号进行60进制计数,并产生一个时位的触发信号。该模块能将当前计数值实时按BCD码的格式输出.将该输出接到两位LED数码后能时时显示分的状态。
library ieee;
use ieee.std_logic_1164。all;
use ieee。std_logic_unsigned.all;
entity cnt60 is
port(clk,rst:in std_logic;
co:out std_logic;
qh,ql:buffer std_logic_vector(3 downto 0));
end cnt60;
architecture behave of cnt60 is
begin
process(rst,clk)
begin
if(rst='0')then ql〈=”0000";qh〈="0000”;
elsif(clk’event and clk='1')then
if(ql=9) then ql<="0000";
if (qh=5) then
qh〈="0000";co〈=’1';
else
qh<=qh+1;
end if;
else ql〈=ql+1;co<='0';
end if;
end if;
end process;
end behave;
(5)、CNT24H
这个模块式将CNT60M或者1HZ的clk的输出信号进行24进制计数,并产生一个时位的触发信号.该模块能将当前计数值实时按BCD码的格式输出.将该输出接到两位LED数码后能时时显示分的状态.
library ieee ;
use ieee。std_logic_1164。all;
use ieee。std_logic_unsigned。all;
entity cnt24h is
port(clk,rst:in std_logic ;
ql,qh:buffer std_logic_vector(3 downto 0));
end cnt24h;
architecture behave of cnt24h is
begin
process(clk,rst)
variable y0,y1:std_logic_vector(3 downto 0);
begin
if(rst='0’)then ql<=”0000”;qh<=”0000";
elsif(clk’event and clk='1’)then
if(ql=9 or (qh=2 and ql=3)) then ql〈=”0000";
if (qh=2) then
qh<=”0000”;
else
qh<=qh+1;
end if;
else ql<=ql+1;
end if;
end if;
end process ;
end behave ;
(6)、ALINE模块
这个模块是校时模块,有两个时钟输入端,一个是秒信号输入,一个是进位信号输入。通过rst端的高低电平进行控制,当高电平时是将进位信号输出给CO,当低电平时把秒信号输出给CO,从而实现切换后一个模块的跳动速度,达到校时的功能.
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity aline is
port(clk1,clk2,rst:in std_logic;
co:out std_logic);
end aline;
architecture behave of aline is
begin
process(rst,clk1,clk2)
begin
if(rst='1') then co〈=clk1;
else co<=clk2;
end if;
end process;
end behave;
(7)、POINT模块
这个模块是整点输出模块,ql,qh是和分模块的信号输入端,输入进去后和0,0进行比较,如果为0,0则说明已经整点,进而在point口输出十秒的clk秒脉冲驱动led闪烁。Ah端是秒信号的高位输入端,和模块内部的1进行比较,到了十秒后关闭led。
LIBRARY ieee;
use ieee。std_logic_1164.all;
use ieee。std_logic_unsigned。all;
ENTITY point IS
PORT(
clk:IN STD_LOGIC;
ph,pl,ah:in std_logic_vector(3 downto 0);
speak:OUT STD_LOGIC);
END point;
ARCHITECTURE fun OF point IS
BEGIN
process(clk)
begin
if(ph="0000” and pl="0000” and ah<”0001”)then
speak〈=clk;
else
speak〈=’0’;
end if;
end process;
END fun;
(8)、ALARM模块
这个模块是设定闹钟的模块,alarm端输入低电平时允许clk秒信号输入让他进行摸24的计数,从而实现设定闹钟时间.同时通过ql,qh端采集cnt24h模块的计数信息,当两者一样时,输出十秒1HZ的闪烁信号。
LIBRARY ieee;
use ieee.std_logic_1164。all;
use ieee。std_logic_unsigned。all;
ENTITY alarm IS
PORT(
clk,alarm:IN STD_LOGIC;
al,ah:in std_logic_vector(3 downto 0);
ql,qh:buffer std_logic_vector(3 downto 0);
speak:OUT STD_LOGIC);
END alarm;
ARCHITECTURE fun OF alarm IS
BEGIN
process(clk,alarm,al,ah)
begin
if(alarm=’0')then NULL;
elsif(clk'event and clk='1')then
if(ql=9 or (qh=2 and ql=3)) then ql〈=”0000";
if (qh=2) then
qh〈=”0000";
else
qh〈=qh+1;
end if;
else ql〈=ql+1;
end if;
end if;
if(qh=ah and ql=al )then
speak〈=clk;
else
speak〈='0’;
end if;
end process;
END fun;
(9)、SCANF模块
这个模块为数码管译码模块,他是将各个计数器以及alarm模块的数字进行译码给数码管显示,刷新频率为1KHZ。
library ieee;
use ieee.std_logic_1164。all;
use ieee。std_logic_unsigned.all;
entity scanf is
port(clk:in std_logic;
a1,a2,a3,a4,a5,a6,a7,a8:in std_logic_vector(3 downto 0);
sg:out std_logic_vector(7 downto 0);
bt:out std_logic_vector(7 downto 0));
end;
architecture one of scanf is
signal cnt8:std_logic_vector(2 downto 0);
signal a:std_logic_vector(3 downto 0);
begin
p1:process(cnt8)
begin
case cnt8 is
when ”000"=〉bt<="00000001";a<=a1;
when ”001”=>bt<=”00000010";a〈=a2;
when ”010”=〉bt<=”00000100";a〈=a3;
when ”011”=>bt<=”00001000";a〈=a4;
when ”100"=〉bt〈="00010000";a〈=a5;
when ”101"=〉bt〈=”00100000";a〈=a6;
when ”110”=>bt〈="01000000";a〈=a7;
when ”111”=〉bt<="10000000";a<=a8;
when others=〉null;
end case;
end process p1;
p2:process(clk)
begin
if clk’event and clk=’1’
then cnt8<=cnt8+1;
end if;
end process p2;
p3:process(a)
begin
case a is
when "0000"=〉sg<="00111111";
when "0001”=>sg〈=”00000110";
when ”0010"=>sg〈=”01011011";
when "0011"=〉sg<="01001111”;
when ”0100"=>sg〈=”01100110";
when ”0101”=〉sg<=”01101101”;
when ”0110"=〉sg〈=”01111101";
when ”0111”=>sg<="00000111";
when "1000"=>sg<=”01111111";
when ”1001”=>sg〈="01101111”;
when others=〉null;
end case;
end process p3;
end;
(10)、脉冲分频模块
这个模块是由三个74163计数器组成的,每个计数器设定为摸十,三级进位就为模1000的计数器,1KHZ的脉冲经过分频器输出为1HZ的秒脉冲给各个模块提供秒信号。
三、实验步骤
1、 首先我们仔细阅读实验要求,
选择30Q—208器件进行实验。画原理图,确定各个模块
2、 编写各个模块的程序,进行仿真
Cnt24h模块仿真图
Cnt60模块仿真图
Scanf模块仿真图
4、将各个模块连接,编译无错误后开始分配引脚:
Ret:7脚;
Alineh:8脚;
Alinem:9脚;
Alarm:10脚;
Point:39脚;
Ledalarm:40脚;
Sg[7。。0]:75、76、83、84、85、86、87、88
Bt[7.。0]:89、90、92、93、94、95、96、97
Clk:183.
5、我们把最后做好的程序下载进入试验箱运行,检查错误,再分析错误,修改程序.
四、本次实验的的问题及解决方法
本次实验遇到了巨大的困难,第一次编译模24模块时,个位总是跳到3就进位了,后来发现控制个位进位的那句程序if(ql=9 or ql=3)修改为if(ql=9 or (qh=2 and ql =3))即可.
本来想尝试使用键盘输入数字来校准闹钟和时钟的时间,但是无论怎么写都有问题,后来不得不放弃键盘输入的想法,使努力功亏一篑。
实验时总是想不起来把文件调整为当前文件,第一天出了不少的问题,下次实验一定要注意。
闹钟的响铃每次触发都一分钟,整点提示也有一分钟,这样的闹钟设计是不合理的。
对于闹钟报时的问题,通过阅读程序发现是设计时为了兼顾闹钟报时能够响足一分钟而这样设计的.两者在这里引用了同样的电平的上升沿,即当闹钟时间和当前时间一样时,有一个报警电平信号,但是这个信号必须在秒钟进位信号变化的时候才能送到led使闹钟发出报时.解决这样的问题的方法时单独设立闹钟响时长度模块,即闹钟响一分钟不利用秒高位的进位信号控制而是单独制作这部分的电路,这样会增加电路的复杂程度。在要求不是很高的情况下是没有必要的,误差不超过一分钟时可以接受的。
五、实验感想
在设计的整个过程中,我们利用VHDL语言,设计了整个闹钟系统,并且利用MAX+PLUSⅡ对程序进行了仿真。这个闹钟系统包括了键盘接口电路、状态机、闹钟时间寄存器和计时器几个主要的模块。其中在设计状态机的时候,由于我们以前对它的研究比较少但在闹钟系统的设计中它又时最重要的部分,所以我们花费了大量的时间来研究它.最终我们通过查阅资料,顺利的完成了本部分的设计。同时状态机的使用也时我们这次课程设计的最大的收获。
在设计过程中,我们遇到的问题很多.开始的时候还时比较的迷茫没有头绪,但是通过思考和查阅资料后我们解决了状态机这样的问题。当把主要的问题解决后,后面的键盘接口电路、寄存器电路等电路就比容易的实现了。这使我们认识到,在研究过程中往往是某一个问题挡着我们进展,然而关键就是在这个时候我们不能放弃,只有坚持才能够获得最终的成功。、
在设计的整个过程中,我们利用VHDL语言来设计整个系统。通过对问题的分解,我们采取逐一进行问题突破的方法,一个一个的解决问题,将比较复杂的任务分成多个模块.这样就使设计比较简单问题比较集中,我们可以有重点的来解决问题。
在完成了整个系统程序的设计后我们利用MAX+PLUSⅡ对程序进行了仿真和硬件测试.通过测试我们不仅对MAX+PLUSⅡ这个软件有了更加一步的认识,而且对下载也有了更加深刻的理解.由下载测试我们最后发现了一个问题就是闹钟的报时不能和设定的时间完全同步,但是误差步会超过1分钟,这成了我们设计的一处败笔,比较遗憾.不过通过问题我们了解了不少问题,只有真正的通过实际测试才能完全的找出问题然后再经过实际的改进才能够使问题得到比较完美的解决。
总的来说我们这次毕业设计完成的比较的成功的,通过问题我们学到了关于EDA的很多知识。而且在实际工作中我们学到了更多的工作经验,知道了怎么和同事相处和合作。只有大家的共同努力才能解决问题,一个人的力量时很有限的。希望这次课程设计的收获能够对以后的学习生活带来帮助,帮助我们能够很好的发展。
展开阅读全文