VHDL课程设计.docx
- 文档编号:30155745
- 上传时间:2023-08-05
- 格式:DOCX
- 页数:28
- 大小:533.72KB
VHDL课程设计.docx
《VHDL课程设计.docx》由会员分享,可在线阅读,更多相关《VHDL课程设计.docx(28页珍藏版)》请在冰豆网上搜索。
VHDL课程设计
目录
1引言1
1.1EDA介绍1
1.2任务说明1
2系统设计2
2.1系统概述2
2.2系统原理2
2.3系统封装图3
3程序设计4
3.1系统结构示意图4
3.2分频程序4
3.2.1分频程序原理4
3.2.2分频程序仿真5
3.3位选程序6
3.3.1位选程序原理6
3.3.2位选程序仿真7
3.4时钟程序8
3.4.1时钟程序原理8
3.4.2时钟程序仿真9
3.5计数程序9
3.5.1计数程序原理9
3.5.2计数程序仿真11
3.6BCD码转换11
3.6.1BCD码转换原理11
3.6.2BCD码程序仿真13
3.7顶层文件14
3.7.1顶层文件介绍及仿真14
3.7.2硬件调试15
4总结17
参考文献18
附录19
1引言
1.1EDA介绍
EDA是电子设计自动化(ElectronicDesignAutomation)的缩写,在20世纪60年代中期从计算机辅助设计(CAD)、计算机辅助制造(CAM)、计算机辅助测试(CAT)和计算机辅助工程(CAE)的概念发展而来的。
EDA技术就是以计算机为工具,设计者在EDA软件平台上,用硬件描述语言HDL完成设计文件,然后由计算机自动地完成逻辑编译、化简、分割、综合、优化、布局、布线和仿真,直至对于特定目标芯片的适配编译、逻辑映射和编程下载等工作。
1.2任务说明
简易数字频率计是用数字显示被测信号频率的仪器,被测信号可以是正弦波,方波或其它周期性变化的信号。
如配以适当的传感器,可以对多种物理量进行测试,比如机械振动的频率,转速,声音的频率等。
其具有高速、精确、可靠、抗干扰性强和现场可编程等优点。
因此,数字频率计是一种应用很广泛的仪器。
本次EDA课程设计题目为简易数字频率计设计,实现对于1HZ-10MHZ的方波信号进行测量。
该频率计包括4个不同的档位,具有记忆功能和总体的复位功能。
需要利用VHDL(硬件描述语言)通过QuartusII编程软件进行程序的编写和调试、仿真。
并将程序下载到硬件上进行实际观测。
2系统设计
2.1系统概述
本设计基于可编程逻辑器件FPGA,使用VHDL进行设计、综合、仿真以及实现。
通过编程,根据选择的档位对输入的方波信号进行频率的测量,并且显示在四位七段数码管上,当数值溢出时进行报警指示。
2.2系统原理
本设计共分成五个子模块程序:
分频(fpq)程序、位选(wxq)程序、时钟(szq)程序、计数(jsq)程序、BCD转换(bcd)程序。
通过五个模块相互配合实现简易数字频率计的功能。
各模块间的连接关系如下所示:
图1系统原理图
系统原理为:
待测的方波信号首先通过分频模块,进行10/100/1000分频,产生10倍/100倍/1000倍及原待测信号共四路方波信号。
然后将四路信号送入位选功能模块,通过四个输入开关对该四路方波的选择。
位选模块所选择的方波信号送入计数模块后,与输入的系统基准时钟clk配合,计数得到输入方波的信号频率,最后送入bcd转换模块,将四位十进制数据转化成四组4位BCD码。
本设计具有记忆功能,在测量过程中不刷新数据,等数据测量过程结束后才显示测量的频率值,并保存到下一次测量结束,此频率计有整体异步复位功能。
2.3系统封装图
图2系统封装图
系统封装图如图2所示,其中shuru为待测试的方波输入端,clk为系统时钟频率输入端,rst为复位端,ginp为频率计乘1档端,sinp为频率计乘10档,sinp为频率计乘100档,binp为频率计乘1000档。
gout,sout,bout,qout分别为四路档位对应的标志位,通过四个LED灯点亮实现,cc为超量程警告位,通过一个LED灯闪烁实现。
gw,sw,bw,qw分别输出四位BCD码,并通过数码管显示,分别表示千位,百位,十位,个位。
当系统工作时,四个数码管所显示数据乘以档位即使所测量的方波的频率。
3程序设计
3.1系统结构示意图
图3系统结构示意图
3.2分频程序
3.2.1分频程序原理
该部分程序中使用process,其中敏感信号列表中为shuru,即待测方波信号。
系统备有×1档,×10档,×100档,×1000档,即需对待测方波进行10倍,100倍,1000倍的分频,通过定义三个变量,以待测方波为时钟进行计数,则需要程序中计数器计分别计数到5,50,500时对四路输出信号进行逻辑非运算。
分频程序代码:
libraryieee;
useieee.std_logic_1164.all;
entityfpqis
port(shuru:
instd_logic;
ao,bo,co,do:
bufferstd_logic);
endfpq;
architecturebhvoffpqis
begin
ao<=shuru;
process(shuru)
variablenu,nu1,nu2:
integerrange0to1000:
=0;
begin
if(shuru'eventandshuru='1')then
nu:
=nu+1;nu1:
=nu1+1;nu2:
=nu2+1;
if(nu=5)then
bo<=notbo;
nu:
=0;
endif;
if(nu1=50)then
co<=notco;
nu1:
=0;
endif;
if(nu2=500)then
do<=notdo;
nu2:
=0;
endif;
endif;
endprocess;
endbhv;
该程序封装图如下图所示:
图4分频程序封装图
3.2.2分频程序仿真
该部分程序仿真波形如下图5所示:
图5分频程序仿真图
分频程序仿真参数设定shuru1为输入的预测方波信号,ao,bo,co,do为四个输出信号,分别为对输入shuru1进行分频后以及本来方波信号,由图中可以看出ao频率与fb1频率相同,bo频率为fb1频率的1/10,co频率为fb1频率的1/100,do频率为fb1频率的1/1000。
3.3位选程序
3.3.1位选程序原理
该部分程序包含复位端rst,四个输入信号ai,bi,ci,di分别接分频程序的四路分频后的方波信号,通过四个开关控制端k1,k2,k3,k4分别选择输出信号的选择,例如若k1为高电平,则fb0等于ai的输入信号。
位选程序与分频程序公共构成频率计四个档位测量功能。
位选程序代码:
libraryieee;
useieee.std_logic_1164.all;
entitywxqis
port(ai,bi,ci,di,rst:
instd_logic;
ginp,sinp,binp,qinp:
instd_logic;
gout,sout,bout,qout:
outstd_logic;
shuru0:
outstd_logic);
endwxq;
architecturebhvofwxqis
begin
process(rst,ginp,sinp,binp,qinp,gout,sout,bout,qout)
begin
if(rst='1')then
gout<='0';sout<='0';bout<='0';qout<='0';
shuru0<='0';
elsif(ginp='1')then
gout<='1';sout<='0';bout<='0';qout<='0';
shuru0<=ai;
elsif(sinp='1')then
gout<='0';sout<='1';bout<='0';qout<='0';
shuru0<=bi;
elsif(binp='1')then
gout<='0';sout<='0';bout<='1';qout<='0';
shuru0<=ci;
elsif(qinp='1')then
gout<='0';sout<='0';bout<='0';qout<='1';
shuru0<=di;
endif;
endprocess;
endbhv;
位选程序封装图如下图所示:
图6位选程序封装图
封装图中输入信号ai,bi,ci,di为四路分频后的方波信号,ginp、binp、binp、qinp这四档开关选择输入信号,该程序中复位端rst为高电平时,将ginp、binp、binp、qinp四个开关控制端对应的输出信号gout、sout、bout、qout分别置零,在硬件电路中用四个LED灯的亮灭表示,测量时必须有且仅有一个灯点亮,否则为违规操作,测量数据错误。
3.3.2位选程序仿真
该部分程序仿真波形如下图7所示:
图7位选程序仿真图
由仿真图中可以看出,输入信号其中qinp为高电平,ginp、binp、binp皆为低电平,则相对应的输出信号qout为高电平,shuru0波形与第4路输入信号di相同。
复位信号在前端有一正脉冲,即当为高电平时,所有的输出信号皆为低电平。
此后,sinp为高电平而其它3档为低电平时,输出信号sout为高电平,shuru0波形与第2路输入信号bi相同。
3.4时钟程序
3.4.1时钟程序原理
该部分程序是为实现得到0.5Hz的系统基准时钟(高低电平各为1秒),用以对待测方波频率的计数测量。
由于硬件中系统时钟频率并不能锁定0.5Hz,则需要对输入的时钟频率进行分频,本系统中选择硬件中时钟clk2引脚的8Hz时钟,则需要对其进行16倍的分频。
时钟程序代码:
libraryieee;
useieee.std_logic_1164.all;
entityszqis
generic(v:
integer:
=8);
port(clki:
instd_logic;
clko:
bufferstd_logic);
endszq;
architecturebhvofszqis
begin
process(clki)
variablecount:
integerrange0tov;
begin
if(clki'eventandclki='1')then
count:
=count+1;
if(count=v)then
clko<=notclko;
count:
=0;
endif;
endif;
endprocess;
endbhv;
时钟程序封装如图8所示:
图8时钟程序封装图
图中输入信号clki为系统时钟频率,clko为输出信号,作为计数程序的基准时钟。
该时钟程序仍为一个分频程序,系统时钟频率作为进程中敏感信号列表的值,当定义的计数变量计数到8时对输出clko进行逻辑非运算,并将变量置零,从而得到0.5Hz的时钟信号。
此部分为计数部分输入时钟信号,作为频率测量的基准信号。
3.4.2时钟程序仿真
程序仿真波形如下图9所示:
图9时钟程序仿真图
其中输入信号clki为系统的时钟信号,输出信号clko为分频后得到的时钟信号,由上图中可以看出,clko的频率为clki的1/16。
因为系统输入时钟频率选为8Hz,则clko时钟频率则为0.5Hz。
3.5计数程序
3.5.1计数程序原理
该部分为本次课程简易频率计系统设计的核心部分,此处程序实现对于方波频率的测量。
需要说明的是,此处所得到的测量结果为频率计选择档位后的值,即输出的频率需要乘以档位,最终所得到数据才为所测量方波的频率值。
程序中以0.5Hz频率的时钟信号为基准脉冲,设置在一变量n,当时钟脉冲为高电平时对输入的方波上升沿进行计数,当时钟脉冲为地电平时,计数结束,并输出。
由于要求不能数码显示不能有变化的过程。
这里定义一个变量m,当时钟脉冲为高电平时将计数值即n的值赋给m,当时钟脉冲为低电平时,将m值送入输出信号q,由于下一个m送入时需要时钟脉冲进入下一个地电平,借此达到输出q值一直不变的要求.
计数程序代码:
libraryieee;
useieee.std_logic_1164.all;
entityjsqis
port(shuru,clk:
instd_logic;
cc:
outstd_logic;
q:
outintegerrange0to10000);
endjsq;
architecturebhvofjsqis
begin
process(shuru,clk)
variablen:
integerrange0to10000;
variablem:
integerrange0to10000;
begin
if(clk'stable)then
if(shuru'eventandshuru='1')then
n:
=n+1;
m:
=n;
if(n>9999orn=0)then
cc<='1';
q<=0;
endif;
endif;
endif;
if(clk='0')then
q<=m;
n:
=0;
cc<='0';
endif;
endprocess;
endbhv;
程序封装如下图3-7所示:
图10计数程序封装图
封装图中shuru为经过选档后的方波信号,clk为0.5Hz的计数基准时钟信号。
输出信号cc为超量程警告,q为计数得到频率数值。
计数程序中包含了系统对于测量数据超量程的处理,当计数值超过9999时,cc就会出现高低电平脉冲的持续变换,硬件中锁一LED灯,将显示不断闪烁。
此时为超量程,数码管显示值为错误量。
3.5.2计数程序仿真
计数程序仿真波形如下图11所示:
图11计数程序仿真图
由于仿真所限,此处并未使用0.5Hz时钟信号作为输入时钟信号。
图中clk时钟频率为0.2MHz,shuru为频率为100MHz,可以看出,shuru为clk频率的500倍,由于只有当clk为高电平时计数,所以得到计数结果q值为250。
同理,若clk频率为0.5Hz,则其高电平持续时间即为1s,所得到的计数结果250极为shuru信号相应频率值,即此时输入方波频率为250Hz。
此仿真图中并未显示超过量程现象,此功能将在顶层文件中说明。
3.6BCD码转换
3.6.1BCD码转换原理
由于计数程序输出结果为0到10000范围内的整型数据,若想通过模式5锁定引脚,并在四个数码管上显示,则需要首先对其进行BCD码的转换。
该部分程序中也包括系统复位功能的实现。
程序中分别设置三个常量a,b,c其值分别为1000,100,10。
首先将输入整形数据qi除以a,即1000,得到所得数据即为千位数值x1,令qi减去x1乘以1000,极为qi中除去千位后剩余的三位数值,同理继续进行算法,则能得到百位,十位,个位的数值,即将输入的整型数据qi转换成BCD码完成。
因为使用模式5,硬件中自带译码功能,直接可用于数码显示。
用四个数码管分别表示千位,百位,十位,个位,再乘以相应档位,即可得到频率计的测量数值。
BCD转换代码:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_signed.all;
useieee.std_logic_arith.all;
entitybcdis
port(qi:
inintegerrange0to10000;
rst:
instd_logic;
gw,sw,bw,qw:
bufferstd_logic_vector(3downto0));
endbcd;
architecturebhvofbcdis
begin
process(qi)
constanta:
integer:
=1000;
constantb:
integer:
=100;
constantc:
integer:
=10;
variablex1,x2,x3,x4,y,z:
integerrange0to1000;
begin
if(rst='1')then
x1:
=0;x2:
=0;x3:
=0;x4:
=0;
else
x1:
=qi/a;
y:
=qi-x1*1000;
x2:
=y/b;
z:
=y-x2*100;
x3:
=z/c;
x4:
=z-x3*10;
endif;
qw<=conv_std_logic_vector(x1,4);
bw<=conv_std_logic_vector(x2,4);
sw<=conv_std_logic_vector(x3,4);
gw<=conv_std_logic_vector(x4,4);
endprocess;
endbhv;
频率计程序封装图如图12所示:
图12频率计程序封装图
封装图中qi为经过分频后的方波计数得到的数据,为0~9999范围内的整型数据,qw、bw、sw、gw为四位BCD码,分别表示十进制数的千位、百位、十位、个位的数值。
程序中复位信号rst为高电平时,控制四个输出信号都为0,即四个数码管都显示0,达到复位功能。
3.6.2BCD码程序仿真
程序仿真图如下图13所示:
图13BCD码程序仿真图
程序仿真前输入信号qi值分别设置了9999,8649,1234三个值,并设置1个rst的正脉冲。
由上图中可以看到,其中当qi为9999时,各位输出值组合为9999;当复位信号rst为高电平时,四个输出信号值皆为0;当qi值为8649时,四位输出为8,6,4,9四个值。
同样,当qi值为1234时,四位BCD,码显示1,2,3,4。
3.7顶层文件
3.7.1顶层文件介绍及仿真
该程序分为五个部分,分别实现预定的功能,然后通过元件例化的方式,组合在一起,编写顶层文件,组合在一起,形成整个系统,各功能相互配合以实现简易频率计的设计,封装图如图14所示:
图14顶层文件封装图
顶层文件程序中设置一系列的信号,将五个部分的程序输入输出信号相对应的连接起来,并与整个系统的封装引脚相对应。
同时将五个程序分别编译后生成的.vhd文件加载进来,然后进行编译,仿真。
图15为顶层文件仿真图:
图15顶层文件程序仿真图
由于仿真所限,此处并未按实际需要进行参数设定。
其中,系统时钟频率clk设定为0.5MHz,预测试方波频率值设定为100MHz,由图中可以看出,此时频率计使用binp档进行测试,所得到的数据为16,该数据再乘以100得到的最后值1600才为仿真欲要得到的数据(注:
由于输入的系统时钟频率为0.5MHz,而实际应用的为8Hz,则系统时钟和预测试方波频率都缩小0.5M÷8=62500倍)。
仿真时设定了复位参数,由图中可看出当复位信号rst为高电平时,所有的输出都会置零或变为低电平,可实现总体复位功能。
该系统含有对于预测试频率超量程的标志,如下图16所示:
图16测量超量程仿真
由于频率计设计包括了四个档位,其中乘1档测试频率范围为1Hz~9999Hz,乘10档测试频率范围为10Hz~99990Hz,乘100档测试频率范围为100Hz~999900Hz,乘1000档测试频率范围为1000Hz~9999000Hz,所以相对应的档位,预测试的频率一旦超过量程就会出现错误显示。
这里以乘1档为例,仿真参数中ginp为高电平,系统时钟信号clk频率设定为0.05MHz,预测方波频率设定为100MHz,则需程序中计数器计到16000,产生溢出,所示输出信号cc会出现正脉冲信号,若硬件锁定在一个LED灯引脚,则会不断亮灭闪烁,以表示超量程,此时数码管数据错误。
3.7.2硬件调试
顶层文件编译仿真完成后对顶层文件程序中各个输入输出信号进行引脚锁定,硬件试验箱选用模式5,其中数码管自带译码功能。
其中重要的一点是系统基准时钟引脚应锁定为clk2引脚,待测方波shuru锁定右侧clk0引脚。
具体引脚锁定如下图17中所示:
图17引脚锁定图
锁定引脚完成后,对程序再次进行编译,然后下载到目标芯片中,通过硬件测试,检查频率计的各项功能,包括1Hz~10MHz频率测试,数据在四个数码管上的显示,频率计档位切换,系统复位功能,超量程报警等。
4总结
此次EDA课程设计历时两周时间,我和伙伴两人一组合作进行简易数字频率计系统的设计。
程序的编写我们采用元件例化的形式,经过思考和相互间的分析讨论,将整个系统划分五个功能模块,彼此配合进行五个功能模块设计和程序的编写。
其间,我们亦遇到许多问题,诸如整个系统核心模块计数过程的实现,时钟频率的设定,将整形数据转换成BCD码显示的算法等等。
另外,我们还对频率计的自动换挡功能进行了探索,编制出了相应的程序,然而我们又从实际的角度出发,最终认为手动换挡更符合人在实际使用时的习惯。
经过两周时间的不懈努力和伙伴间契的配合,我们终于完成预定的目的,完成整个简易数字频率计的设计。
虽然其中遇到很多困难,很多问题,但在我们两人相互支持和鼓励下,都能够得以顺利的找到解决办法或者改进的方法,并在合作中相互提高,彼此进步,在困难在中体会到合作的乐趣。
EDA技术极大地提高了电路设计的效率和可操作性,减轻了设计者的劳动强度,是一门实际应用很广泛的技术。
现在对EDA的概念或范畴用得很宽。
包括在机械、电子、通信、航空航天、化工、矿产、生物、医学、军事等各个领域,都有EDA的应用。
目前EDA技术已在各大公司、企事业单位和科研教学部门广泛使用。
例如在飞机制造过程中,从设计、性能测试及特性分析直到飞行模拟,都可能涉及到EDA技术。
总而言之,这次EDA课程设计对我们理论学习和实践能力的提高有十分重要的意义,帮助我巩固了VHDL程序设计和数字电子技术知识,提高了我的自学能力与合作精神,这对我以后的学习与工作会很有很大的帮助。
参考文献
[1]VokneiA.Pedroni.《VHDL数字电路设计教程》.电子工业出版社,2008.5
[2]潘松,黄继业.《EDA技术实用教程》(第二版).科学出版社,2005.2
[3]焦素敏.《EDA应用技术》.清华大学出版社,2002.4
[4]刘延飞等.基于AlteraFPGA/CPLD的电子系统设计及工程实践.北京:
人民邮电出版社,2009
[5]王新.EDA技术与虚拟实验.徐州:
中国矿业大学出版社,2007
附录
顶层文件程序
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitypljis
port(fb,clk,rst:
instd_logic;
k1,k2,k3,k4:
instd_logic;
g1,g2,g3,g4,g5:
outstd_logic;
d1,d2,d3,d4:
outstd_logic_vector(3downto0));
endplj;
architecturebhvofpljis
signalh0,h1,h2,h3:
std_logic;
signals0,s1,s2:
std_logic;
signalp0:
integerrange0to10000;
compo
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VHDL 课程设计