eda课程设计数字频率计.docx
《eda课程设计数字频率计.docx》由会员分享,可在线阅读,更多相关《eda课程设计数字频率计.docx(20页珍藏版)》请在冰点文库上搜索。
eda课程设计数字频率计
1绪论
EDA技术是以大规模可编程逻辑器件为设计载体,以硬件语言为系统逻辑描述的主要方式,以计算机、大规模可编程逻辑器件的开发软件及实验开发系统为设计工具,通过有关的开发软件,自动完成用软件设计的电子系统到硬件系统的设计,最终形成集成电子系统或专用集成芯片的一门新技术。
其设计的灵活性使得EDA技术得以快速发展和广泛应用。
本文以QuartusⅡ软件为设计平台,采用VHDL语言实现数字频率计的整体设计。
1.1EDA简介
EDA是电子设计自动化(ElectronicDesignAutomation)缩写,是90年代初从CAD(计算机辅助设计)、CAM(计算机辅助制造)、CAT(计算机辅助测试)和CAE(计算机辅助工程)的概念发展而来的。
EDA技术是以计算机为工具,根据硬件描述语言HDL(HardwareDescriptionlanguage)完成的设计文件,自动地完成逻辑编译、化简、分割、综合及优化、布局布线、仿真以及对于特定目标芯片的适配编译和编程下载等工作。
典型的EDA工具中必须包含两个特殊的软件包,即综合器和适配器。
综合器的功能就是将设计者在EDA平台上完成的针对某个系统项目的VHDL、原理图或状态图形描述,针对给定的硬件系统组件,进行编译、优化、转换和综合,最终获得我们欲实现功能的描述文件。
综合器在工作前,必须给定所要实现的硬件结构参数,它的功能就是将软件描述与给定的硬件结构用一定的方式联系起来。
也就是说,综合器是软件描述与硬件实现的一座桥梁。
综合过程就是将电路的高级语言描述转换低级的、可与目标器件FPGA/CPLD相映射的网表文件。
适配器的功能是将由综合器产生的王表文件配置与指定的目标器件中,产生最终的下载文件,如JED文件。
适配所选定的目标器件(FPGA/CPLD芯片)必须属于在综合器中已指定的目标器件系列。
硬件描述语言HDL是相对于一般的计算机软件语言,如:
C、PASCAL而言的。
HDL语言使用与设计硬件电子系统的计算机语言,它能描述电子系统的逻辑功能、电路结构和连接方式。
设计者可利用HDL程序来描述所希望的电路系统,规定器件结构特征和电路的行为方式;然后利用综合器和适配器将此程序编程能控制FPGA和CPLD内部结构,并实现相应逻辑功能的的门级或更底层的结构网表文件或下载文件。
目前,就FPGA/CPLD开发来说,比较常用和流行的HDL主要有ABEL-HDL、AHDL和VHDL。
1.2基于EDA工具的FPGA/CPLD开发流程
1.文本/原理图编辑与修改。
首先利用EDA工具的文本或图形编辑器将设计者的设计意图用文本(ABEL-HDL程序)或图形方式(原理图或状态图)表达出来
2.编译。
完成设计描述后即可通过编译器进行排错编译,变成特定的文本格式,为下一步的综合做准备。
3.综合。
这是将软件设计与硬件的可实现性挂钩,是将软件转化为硬件电路的关键步骤。
综合后HDL综合器可生成ENIF、XNF或VHDL等格式的网表文件,他们从门级开始描述了最基本的门电路结构。
4.行为仿真和功能仿真。
利用产生的网表文件进行功能仿真,以便了解设计描述与设计意图的一致性。
(该步骤可以略去)
5.适配。
利用FPGA/CPLD布局布线适配器将综合后的网表文件针对某一具体的目标器件进行逻辑映射操作,其中包括底层器件配置、逻辑分割、逻辑优化、布局布线。
该操作完成后,EDA软件将产生针对此项设计的适配报告和JED下载文件等多项结果。
适配报告指明了芯片内资源的分配与利用、引脚锁定、设计的布尔方程描述情况。
6.功能仿真和时序仿真。
该不妨真实接近真实器件运行的方针,仿真过程已将器件的硬件特性考虑进去了,因此仿真精度要高的多。
(该步骤也可略去)
7.下载。
如果以上的所有过程都没有发现问题,就可以将适配器产生的下载文件通过FPGA/CPLD下载电缆载入目标芯片FPGA或CPLD中。
8.硬件仿真与测试。
2数字频率计的设计分析
2.1数字频率计的工作原理
众所周知,频率信号易于传输,抗干扰性强,可以获得较好的测量精度。
因此,频率检测是电子测量领域最基本的测量之一。
频率计的基本原理是用一个频率稳定度高的频率源作为基准时钟,对比测量其他信号的频率。
通常情况下计算每秒内待测信号的脉冲个数,即闸门时间为1s。
闸门时间可以根据需要取值,大于或小于1s都可以。
闸门时间越长,得到的频率值就越准确,但闸门时间越长,则每测一次频率的间隔就越长。
闸门时间越短,测得的频率值刷新就越快,但测得的频率精度就受影响。
一般取1s作为闸门时间。
数字频率计的关键组成部分包括测频控制信号发生器、计数器、锁存器、译码驱动电路和显示电路,其原理框图如图2-1所示。
2.2设计分析
测频控制信号发生器
测频控制信号发生器产生测量频率的控制时序,是设计频率计的关键。
这里控制信号CLK取为1Hz,2分频后就是一个脉宽为1s的使能信号EN,用来作为计数闸门信号。
测频控制信号发生器封装图如图2-2所示。
图2-2测频控制信号发生器封装图
测频控制信号发生器程序源代码如下:
libraryieee;
Entityshinengis
Port(clk,rst:
instd_logic;
En:
bufferstd_logic);
Endshineng;
Architecturebhvofshinengis
begin
process(clk,rst)
begin
ifrst='1'then
en<='0';
elsifclk'eventandclk='1'then
en<=noten;
endif;
endprocess;
Endbhv;
测频控制信号发生器仿真图如图2-3所示。
以上为测频控制信号发生器仿真图,仿真图中clk为基准信号,rst为复位端。
复位端有效时,en输出为零。
en为使能端,当clk为1hz输入信号时,输出en为0.5hz
的信号即1s高电平信号。
计数器
计数器以使能信号EN作为时钟,当EN为高电平时开始计数;在EN的下降沿,产生一个锁存信号,用来锁存数据,锁存数据后,还要在下次EN上升沿到来之前产生清零信号,为下次计数做准备,清零信号是EN为低电平时有效。
在清零信号到来时,异步清零;EN为高电平时再次开始计数。
本文设计的计数器计数最大值是9999999。
由于计数器和锁存器共同由测频器控制模块控制因此可以将计数器和锁存器看成一个环节,因此计数器和锁存器的仿真图如图2-5所示。
锁存器
当锁存信号即EN下降沿到来时,将计数器的计数值锁存,这样可由外部的七段译码器译码并在数码管上显示。
设置锁存器的好处是使显示的数据稳定,不会由于周期性的清零信号而不断闪烁。
锁存器的位数应跟计数器完全一样,均是28位。
计数器模块和锁存器模块封装图如图2-4所示。
图2-4计数器模块和锁存器模块封装图
计数器模块和锁存器模块程序源代码如下所示。
libraryieee;
entitycountis
port(rst,en,input:
instd_logic;
number1,number2,number3,number4,number5,number6,
number7:
outstd_logic_vector(3downto0);
ov:
bufferstd_logic);
endcount;
architecturebhvofcountis
begin
process(input,rst,en)
variabletemp1,temp2,temp3,temp4,temp5,temp6,temp7:
std_logic_vector(3downto0);
begin
ifrst='1'then
temp1:
="0000";temp2:
="0000";temp3:
="0000";temp4:
="0000";
temp5:
="0000";temp6:
="0000";temp7:
="0000";ov<='0';
elsifen='1'then
ifinput'eventandinput='1'then
temp1:
=temp1+1;
iftemp1="1010"then
temp1:
="0000";
temp2:
=temp2+1;
iftemp2="1010"then
temp2:
="0000";
temp3:
=temp3+1;
iftemp3="1010"then
temp3:
="0000";
temp4:
=temp4+1;
iftemp4="1010"then
temp4:
="0000";
temp5:
=temp5+1;
iftemp5="1010"then
temp5:
="0000";
temp6:
=temp6+1;
iftemp6="1010"then
temp6:
="0000";
temp7:
=temp7+1;
iftemp7="1010"then
temp7:
="0000";ov<='1';
endif;
endif;
endif;
endif;
endif;
endif;
endif;
endif;
else
temp1:
="0000";temp2:
="0000";temp3:
="0000";temp4:
="0000";temp5:
="0000";
temp6:
="0000";temp7:
="0000";ov<='0';
endif;
number1<=temp1;number2<=temp2;number3<=temp3;number4<=temp4;
number5<=temp5;number6<=temp6;number7<=temp7;
endprocess;
endbhv;
以上为计数器模块和锁存器模块仿真图。
仿真图中rst为复位端,当复位端有效时,计数值清零。
Input为输入待测信号,en为使能端,当en=1且input上升沿时开始计数,en=0时清零计数值,进程结束前锁存数据。
译码驱动和数码管显示电路
本次课程设计采用实验箱模式5,模式5自带译码驱动电路,译码输出接数码管
显示,即每一个数码管的输入分别接到译码驱动电路的输出。
本次课程设计采用4个共阴极数码管来显示待测频率的数值,其显示范围从0~9999999。
数码管显示电路封装图如图2-6所示。
图2-6数码管显示电路封装图
以下是数码管显示的程序源代码:
libraryieee;
entityshowis
port(en,rst:
instd_logic;
number1,number2,number3,number4,number5,number6,
number7:
std_logic_vector(3downto0);
show1,show2,show3,show4,flag:
outstd_logic_vector(3downto0);
ov:
bufferstd_logic);
endshow;
architecturebhvofshowis
begin
process(rst,en)
begin
ifrst='1'then
show1<="0000";show2<="0000";show3<="0000";show4<="0000";
flag<="0000";
elsifen'eventanden='0'then
ifov='1'then
show1<="1110";show2<="1010";show3<="1010";show4<="0000";
flag<="1010";
elsifnumber7>"0000"then
show1<=number7;show2<=number6;show3<=number5;show4<=number4;
flag<="0011";
elsifnumber6>"0000"then
show1<=number6;show2<=number5;show3<=number4;show4<=number3;
flag<="0010";
elsifnumber5>"0000"then
show1<=number5;show2<=number4;show3<=number3;show4<=number2;
flag<="0001";
elseshow1<=number4;show2<=number3;show3<=number2;show4<=number1;
flag<="0000";
endif;
endif;
endprocess;
endbhv;
数码管显示模块仿真图如图2-7所示。
以下便是数码管显示模块仿真图,在仿真图中number7~number1为计数和锁存环节的输出。
ov即作为输入又作为输出,当输入待测信号的频率足够大,以至于超过测频器的最大量程时,ov作为输出且为1。
当ov=1时,show4~show1以及flag标志位共同显示ERROR。
rst为复位端,当rst为1时,show输出均为零。
en为使能端,在前面几个模块中,en=1时开始计数,en=0时清零记录数值,而在en下降沿时将记录的数值,送到输出show。
以此做到不断记录数据,保存数据,刷新数据等,反复循环测量待测信号频率的目的。
图2-7数码管显示模块仿真图
鉴于篇幅问题,总体设计仿真图分析将在本章分析,望读者谅解。
总体设计仿真图中,clk是基准信号,其二分频得到en使能信号,input为输入待测信号,rst为复位端,当rst=1时,en=0,输出show均为零。
En=1时,当待测输入信号为上升沿开始计数,倘若超过9999999,则ov=1,如果ov=1则show4~show1以及flag标志位共同显示ERROR。
计数进程结束前锁存数据。
将记录数据锁存到总体设计进程中的定义number1~number7中,在en下降沿再将number1~number7按照程序中的要求,送到show4~show1以及flag标志位。
Flag显示自动调档的档次。
综上所述,本次eda设计利用VHDL语言详尽准确的做到了测量待测信号频率。
本次设计可谓做到了,言简意赅,程序流程简明扼要,易于读者分析,各个模块化设计正是遵循了eda设计的自上而下,逐步细化的设计原理。
并且本次设计的一大原理就是可以实时的根据现况,任意测量待测输入信号的频率,量程可以任意调整,鉴于本次要求,制作了最大量程为10MBhz的测频器,稍加修改便可做到任意量程的测频器。
当然本次设计还有很多不足之处,望批评指正。
3总体设计
以上模块分别为测频控制模块,计数模块,锁存模块,显示模块综合以上模块分析,予以分析综合如下,可得整体设计封装图如图3-1所示。
总体设计程序源代码如下所示:
libraryieee;
entityfreqis
port(clk,rst,input:
instd_logic;
show1,show2,show3,show4,flag:
outstd_logic_vector(3downto0);
ov:
bufferstd_logic);
endfreq;
architecturebhvoffreqis
signalen:
std_logic;
signalnumber1,number2,number3,number4,number5,number6,
number7:
std_logic_vector(3downto0);
begin
shineng:
process(clk,rst)
begin
ifrst='1'then
en<='0';
elsifclk'eventandclk='1'then
en<=noten;
endif;
endprocessshineng;
count:
process(input,rst,en)
variabletemp1,temp2,temp3,temp4,temp5,temp6,
temp7:
std_logic_vector(3downto0);
begin
ifrst='1'then
temp1:
="0000";temp2:
="0000";temp3:
="0000";temp4:
="0000";
temp5:
="0000";temp6:
="0000";temp7:
="0000";ov<='0';
elsifen='1'then
ifinput'eventandinput='1'then
temp1:
=temp1+1;
iftemp1="1010"then
temp1:
="0000";
temp2:
=temp2+1;
iftemp2="1010"then
temp2:
="0000";
temp3:
=temp3+1;
iftemp3="1010"then
temp3:
="0000";
temp4:
=temp4+1;
iftemp4="1010"then
temp4:
="0000";
temp5:
=temp5+1;
iftemp5="1010"then
temp5:
="0000";
temp6:
=temp6+1;
iftemp6="1010"then
temp6:
="0000";
temp7:
=temp7+1;
iftemp7="1010"then
temp7:
="0000";ov<='1';
endif;
endif;
endif;
endif;
endif;
endif;
endif;
endif;
else
temp1:
="0000";temp2:
="0000";temp3:
="0000";temp4:
="0000";
temp5:
="0000";temp6:
="0000";temp7:
="0000";ov<='0';
endif;
number1<=temp1;number2<=temp2;number3<=temp3;number4<=temp4;
number5<=temp5;number6<=temp6;number7<=temp7;
endprocesscount;
show:
process(rst,en)
begin
ifrst='1'then
show1<="0000";show2<="0000";show3<="0000";show4<="0000";
flag<="0000";
elsifen'eventanden='0'then
ifov='1'then
show1<="1110";show2<="1010";show3<="1010";show4<="0000";
flag<="1010";
elsifnumber7>"0000"then
show1<=number7;show2<=number6;show3<=number5;show4<=number4;
flag<="0011";
elsifnumber6>"0000"then
show1<=number6;show2<=number5;show3<=number4;show4<=number3;
flag<="0010";
elsifnumber5>"0000"then
show1<=number5;show2<=number4;show3<=number3;show4<=number2;
flag<="0001";
Else
show1<=number4;show2<=number3;show3<=number2;show4<=number1;
flag<="0000";
endif;
endif;
endprocessshow;
endbhv;
总体设计仿真图如图3-2所示。
经过了分析软件,查询相关资料,编写程序,编译,综合,适配,仿真,下一步便是下载的关键步骤即引脚锁定。
引脚锁定的好坏直接影响下载的成功与否,更应符合读者的观看习惯。
已达到一目了然,清晰理解的目的。
鉴于此,先将总体设计的引脚设计安排如下:
本次课程设计的引脚图如图3-3所示。
clk信号利用clock2产生1hz基准信号,同理输入待测信号input接clock0即可产生实验箱上的部分信号,也可直外接信号发生器。
以便达到测量任意输入信号的目的。
溢出信号ov接二极管,由二极管的亮灭,来判断是否溢出。
此外由show4~show1以及flag标志位共同显示ERROR。
以致告诉使用者应减少输入信号频率,或者修改程序以便更大的增大待测信号的量程。
使得适应性更加的广泛。
4设计总结
本次课程设计采用EDA设计方法,把数字频率计系统组建分解成若干个功能模块进行设计描述,选用Altera公司生产的FPGA产品ACEX1K系列EP1K30TC144-3芯片,下载适配后,便可以在数码管上显示出待测频率的数值。
经编译,综合,适配,下载到实验箱,其软件设计思想清晰,硬件电路简单,具有一定的实用性。
通过这次课程设计,我感受到了VHDL功能的强大,享受到了其中的乐趣。
通过这次课程设计,使我感受到了什么是“纸上得来终觉浅,觉知此事要躬行”,平时不下一番苦功夫是学不好的。
我们必须要养成严谨求学的态度,这样才能做起程序来得心应手。
才能在以后的实践中,提升自己。
在课程设计过程中,我遇到了很多的问题,这些问题暴露了我平时学习的不足,因此我需要在今后的学习中更加努力地去学习有关VHDL语言的知识,使自己能够更好的掌握此项技能。
在这两周的时间里,我总结出善于交流意见,也是学习能力的一种体现,每次完成一个编程模块,我都会和同学们交流一下,找到自己的不足,从而更好的提升自己。
也许这就是成长,汗水预示着结果也见证着收获。
劳动是人类生存生活永恒不变的话题。
通过实际动手做,我们才真正领略到“艰苦奋斗”这一词的真正含义,我们想说,编程确实有些辛苦,但苦中也有乐,在这个团队的任务中,一起的工作可以让我们有说有笑,相互帮助,配合默契。
对我们而言,知识上的收获虽然重要,但精神上的收获则更是可喜的。
挫折是一份财富,经历是一份拥有。
这次实际操作必将成为我们大学生涯中一段美好的回忆!
与此同时,在老师的身上,我也看到了什么叫做老师是园丁的内涵。
老师们辛勤工作,耐心讲解,更是深深的教育了我。
我要秉承老师们的精神,在以后的学习工作中,奉献出自己的一份力量。
参考文献
[1]黄正瑾.系统编程技术及其应用,南京:
东南大学出版社,1997
[2]
[3]
[4]
[5]NaylorD.andS.Jones,VHDL:
ALogicSynthesisApproach,London:
Chapman&Hall,1997
[6]YalamanchiliS.,VHDLStarter'sGuide,EnglewoodCliffs,NJ:
PrenticeHall,1998