VHDL电路设计论文.docx
《VHDL电路设计论文.docx》由会员分享,可在线阅读,更多相关《VHDL电路设计论文.docx(27页珍藏版)》请在冰豆网上搜索。
![VHDL电路设计论文.docx](https://file1.bdocx.com/fileroot1/2023-7/24/f806346b-cac1-4755-92b6-2a7c993e6cf9/f806346b-cac1-4755-92b6-2a7c993e6cf91.gif)
VHDL电路设计论文
摘要
随着大规模集成电路技术和计算机技术的不断发展,在涉及通信、国防、航天、医学、工业自动化、计算机应用、仪器仪表等领域的电子系统设计工作中EDA技术的含量正以惊人的速度上升;电子类的高新技术项目的开发也逾益依赖于EDA技术的应用。
即使是普通的电子产品的开发EDA技术常常使一些原来的技术瓶颈得以轻松突破从而使产品的开发周期大为收缩、性能价格比大幅提高。
不言而喻EDA技术将迅速成为电子设计领域中的极其重要的组成部分。
100Hz频率计数器的主要功能是在一定时间内对频率的计算。
在数字系统中,计数器可以统计输入脉冲的个数,实现计时、计数、分频、定时、产生节拍脉冲和序列脉冲。
而本篇论文主要介绍了频率计数器的实现:
系统以MAX+PULSLLII为开发环境,通过VHDL语言作为硬件描述语言实现对电路结构的描述。
在VHDL语言中采用了一系列的语句,例如:
if语句、case语句、loop语句等。
这些语句对程序中的输入输出端口进行了解释,并给出实现代码和仿真波形。
相关的一些关键词:
100Hz;分频;计数;MAX+PULSLLII;VHDL;编译;仿真等。
(论文修改)
前言
VHDL是超高速集成电路硬件描述语言(VeryHighSpeedIntegratedCircuitHardwareDescriptionLanguage)的缩写在美国国防部的支持下于1985年正式推出是目前标准化程度最高的硬件描述语言。
IEEE(TheInstituteofElectricalandElectronicsEngineers)于1987年将VHDL采纳为IEEE1076标准。
它经过十几年的发展、应用和完善以其强大的系统描述能力、规范的程序设计结构、灵活的语言表达风格和多层次的仿真测试手段在电子设计领域受到了普遍的认同和广泛的接受成为现代EDA领域的首选硬件描述语言。
目前流行的EDA工具软件全部支持VHDL它在EDA领域的学术交流、电子设计的存档、专用集成电路(ASIC)设计等方面担任着不可缺少的角色。
数字频率计是数字电路中的一个典型应用,实际的硬件设计用到的器件较多,连线比较复杂,而且会产生比较大的延时,造成测量误差、可靠性差。
随着复杂可编程逻辑器件(CPLD)的广泛应用,以EDA工具作为开发手段,运用VHDL语言。
将使整个系统大大简化。
提高整体的性能和可靠性。
本文用VHDL在CPLD器件上实现一种2b数字频率计测频系统,能够用十进制数码显示被测信号的频率,不仅能够测量正弦波、方波和三角波等信号的频率,而且还能对其他多种物理量进行测量。
具有体积小、可靠性高、功耗低的特点。
目录(论文修改)
摘要………………………………………………………………………1
前言……………………………………………………………………2
目录……………………………………………………………………3
第一章设计目的………………………………………………………5
1.1设计要求……………………………………………………5
1.2设计意义……………………………………………………5
第二章设计方案………………………………………………………6
第三章产生子模块……………………………………………………7
3.1分频模块……………………………………………………7
3.2分频模块源代码………………………………………………8
3.3仿真及波形图…………………………………………………9
第四章计数模块………………………………………………………9
4.1.计数模块分析…………………………………………………9
4.2.计数模块源代码………………………………………………10
4.3计数模块的仿真及波形图……………………………………12
第五章显示模块……………………………………………………12
5.1七段数码管的描述……………………………………………13
5.2八进制计数器count8的描述…………………………………14
5.3七段显示译码电路的描述……………………………………15
5.4计数位选择电路的描述………………………………………16
5.5总体功能描述……………………………………………18
5.6显示模块的仿真及波形图………………………………19
第六章顶层文件…………………………………………………20
6.1顶层文件设计源程序…………………………………………20
6.2顶层文件的仿真及波形图………………………………………21
结语…………………………………………………………22
参考文献……………………………………………………23
致谢…………………………………………………………24
附件…………………………………………………………25
第一章设计目的(毕业论文)
1.1设计要求
a.获得稳定100Hz频率
b.用数码管的显示
c.用VHDL写出设计整个程序
1.2设计意义
a.进一步学习VHDL硬件描述语言的编程方法和步骤。
b.运用VHDL硬件描述语言实现对电子元器件的功能控制
c.熟悉并掌握元件例化语句的使用方法
d.熟悉数字式频率的基本工作原理。
e.熟悉数字频率计中计数显示设计
f.熟悉掌握MAX+PLUSⅡ软件的基本使用方法。
第二章设计方案
此系统正常工作时,脉冲发生器提供的1Hz的输入信号,信号的变换,产生计数信号,被测信号通过信号整形电路产生同频率的矩形波,送入计数模块,计数模块对输入的矩形波进行计数,将计数结果送入锁存器中,保证系统可以稳定显示数据,显示译码驱动电路将二进制表示的计数结果转换成相应的能够在七段数码显示管上可以显示的十进制结果。
在数码显示管上可以看到计数结果。
在这个100HZ频率计的设计中一共分为3大模块:
产生子模块、计数模块、显示模块。
产生子模块是为此100赫兹频率计提供1Hz的时钟脉冲信号,为了实现严格的同步,在这个模块中采用了同步计数电路。
计数模块是实现从0到99的计数。
显示模块是将计数模块程序中产生的数值通过2个七段数码管表达出来,使大家对此频率计有一个更直观的认识。
此100HZ频率计的设计中,这3个大的模块是核心部分,这个3个大的模块会在后面的分析设计中给出详细的介绍。
频率计的工作原理是通过在一定时间内对外部信号进行计数,计数值与时间的比值,从而得到输入信号的频率,通过二个数码管作为频率值的输出。
对系统进行分析后,确定采用模块设计,基本框架图如
CLK
计数系统
显示系统
图1
第三章产生子模块
3.1分频模块
分频模块的功能是将输入的外部信号clk进行分频,分频成计数器所需要的计数信号,使计数器在计数信号有效的时间对外部信号进行计数。
根据频率计测量的范围,确定了分频至1Hz,从而得到频率值.
图2
555定时器(如图2)是一种模拟电路与数字电路相结合的中规模集成电路,它在信号产生、整形、延时(定时)、控制等方面获得了广泛的应用。
虽说555定时器应用领域十分广泛,但其电路结构归纳起来有三种基本形式,即多谐振荡器、单稳态触发器、施密特触发器
由于双极型555和CMOS型555的制作工艺和流程不同,生产出的555集成电路的性能指标是有差异的。
CMOS型555的功耗仅为双极型的几十分之一,静态电流仅为300uA左右,为微功耗电路。
CMOS型555的输出脉冲的上升沿和下降沿比双极型的要陡,转换时间短。
CMOS型555的在传输过度时间里产生的尖峰电流小,仅为2--3mA,而双极型555的尖峰电流高达300--400mA。
3.2分频程序如下:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYclk_div1000IS
PORT(clk:
INSTD_LOGIC;
clk_div:
outSTD_LOGIC);
ENDclk_div1000;
ARCHITECTURErt1OFclk_div1000IS
SIGNALq_tmp:
integerrange0to999;
BEGIN
process(clk)
begin
IF(clk'eventandclk='1')then
if(q_tmp=999)then
q_tmp<=0;
else
q_tmp<=q_tmp+1;
endif;
endif;
endprocess;
process(clk)
begin
IF(clk'eventandclk='1')then
if(q_tmp=999)then
clk_div<='1';
else
clk_div<='0';
endif;
endif;
endprocess;
endrt1;
在程序3.2中我们将外部信号clk进行10次分频输入信号为clk,输出信号为clk_div.
3.3仿真及波形图
图3
图4
图4
第四章计数模块
4.1.计数模块分析
经分析可知,此频率计计数模块分为2个子模块,即个位显示模块、十位显示模块。
详细分析如下:
①计数模块的个位可以用1个十进制计数器表示。
②计数模块的十位可以用1个十进制计数器表示。
频率计的计数模块主要来实现频率计数器内部的计数功能,计数器的内部计数信号clk和频率计数器的使能信号enable.频率计数器的计数模块的输出信号就是个位sec,十位sec10
电路图如下:
图5
十进制计数器,它的输入端口主要包括使能端口enable计数输入端口clk,输出端口主要包括计数输出端口q和进位输出端口cout.
4.2.计数模块的程序如下:
毕业论文
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYcount10IS
PORT(
enable:
INSTD_LOGIC;
clk:
INSTD_LOGIC;
cout:
outSTD_LOGIC;
q:
OUTSTD_LOGIC_VECTOR(3DOWNTO0));
ENDcount10;
ARCHITECTURErt1OFcount10IS
SIGNALq_tmp:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
process(clk)
begin
IF(clk'eventandclk='1')then
if(enable='1')then
if(q_tmp="1001")then
q_tmp<="0000";
else
q_tmp<=q_tmp+1;
endif;
endif;
endif;
q<=q_tmp;
endprocess;
cout<='1'whenq_tmp="1001"andenable='1'else'0';
--cout<='1'whenq_tmp="1001"else'0';
endrt1;
描述了上述的十进制计数器后,我们就可以根据图三所示的结构框图来进行频率计数器计数模块的VHDL描述了.在频率计数器计数模块的VHDL描述中,我们引用元件的形式调用上面描述的十进制计数器.从而得到频率计数器的计数功能,程序如下:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYtime_counterIS
PORT(
enable:
INSTD_LOGIC;
clk0:
INSTD_LOGIC;
sec10:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
sec:
OUTSTD_LOGIC_VECTOR(3DOWNTO0));
ENDtime_counter;
ARCHITECTURErt1OFtime_counterIS
COMPONENTcount10
PORT(
enable:
INSTD_LOGIC;
clk:
INSTD_LOGIC;
cout:
outSTD_LOGIC;
q:
OUTSTD_LOGIC_VECTOR(3DOWNTO0));
endCOMPONENT;
SIGNALco1,co2:
STD_LOGIC;
BEGIN
U1:
count10PORTMAP(enable,clk0,co1,sec);
U2:
count10PORTMAP(co1,clk0,co2,sec10);
endrt1;
4.3计数模块的仿真及波形图
图6
图7
第五章显示模块
有了计数模块还不能满足设计的要求,任何一个设计都是需要一定的硬件设备来表达。
否则,只有一个理论的程序是不足以来证明一个设计的完整性。
在参考一些资料和根据实验提供的条件,我在这个设计中采用2个七段数码管来对这个频率计进行实际的表达。
频率计数器要将计数的结果显示出来,就必需设计一个计数显示模块来完成该显示功能.频频计数器的显示模块的输入信号主要来自于频频计数器计数模块的计数信息,它的输出信号是choose和segment,以用来驱动计数显示的8个LED七段显示数码管,在输出信号中,为了节省资源,我们采用循环点亮LED七段显示数码管的方法来显示频率计数器的计数输出.我们通过信号choose(7downto0)来进行8个LED七段显示数码管的选择,,从而将输出信号segment(6downto0)送到相应的LED七段显示数码管上以完成频率计数的显示.
计数显示模块的结构框图如图8所示:
原创论文
图8
从图4以看出,计数显示模块可由三个部分组成:
八进制计数器,计数位选择电路,七段显示译码电路.
下面描述一下计数显示模块的工作过程:
在外部计数信号clk的作用下,八进制计数器的输出从000到111按顺序循环变化,输出信号为sel.信号sel作为计数位选择电路的选择信号,用来选择对应位的数据并将其转换为四位位矢量.最后将计数位选择电路的输出信号q送到七段显示译码电路的输入端口,将其转化成用来点燃LED七段显示数码管的segment信号.
5.1七段数码管的描述
我们所使用实验箱中的8个七段数码管有这样一个特点,8个数码管中每一个数码管中相同的段都是连在一根线上的。
如图所示:
图9
故只要有一个数码管的一段亮,则8个数码管中相同的段都会亮。
则,在选用了数码管后就我们需要考虑一个问题了,就是如何在每个数码管上正确的显示程序中每一位要显示的数据呢?
也就是如何将前面的计数模块中要显示的数字准确地表达在数码管上。
在这里就运用了人体生理学的一个结论,人的眼睛能分辨的时间是1/16秒,即频率为25Hz左右。
有了这个结论后,我们就可以解决正确显示的问题了,应用动态扫描的方法,只要我们在显示模块中所使用的频率大于25Hz就可以让每个数码管正确的显示程序中所要求的数字了。
因此,在显示模块中首先要设计一个分频器,实验提供的脉冲是1KHz,我们只要设计的分频器所分出来的频率大于25Hz即可,在此我选择一个8分频器。
8分频器的输入信号为clk,输出信号为sel(2DOWNTO0).
5.2八进制计数器count8的描述
我们来描述下三个子电路,然后再描述显示模块的总体功能.先来讨论下八进制计数器count8,这个八进制计数器除了没有使能端enable和进位输出端口cout之外,它的描述结构与前面描述的计数器的结构完全相同,用VHDL描述如下:
8分频器模块设计程序如下:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYcount8IS
PORT(
clk:
INSTD_LOGIC;
sel:
OUTSTD_LOGIC_VECTOR(2DOWNTO0));
ENDcount8;
ARCHITECTURErt1OFcount8IS
SIGNALsel_tmp:
STD_LOGIC_VECTOR(2DOWNTO0);
BEGIN
process(clk)
begin
IF(clk'eventandclk='1')then
if(sel_tmp="111")then
sel_tmp<=(others=>'0');
else
sel_tmp<=sel_tmp+1;
endif;
endif;
sel<=sel_tmp;
endprocess;
endrt1;
5.3七段显示译码电路的描述
显示模块中数字位选的问题解决后就需要解决另外一个问题了,那就是如何将程序中的数字在数码管上有效显示出来,即如何让我们能一眼就看出来显示的数字是0,1,2,3,4,5,6,7,8,9这十个数字。
根据数码的结构特点,我们采用高低电平的方法点亮数码管对应的段即可。
七段数码管的显示结构如图所示:
图10
则由图来详细的分析如何将0,1,2,3,4,5,6,7,8,9这十个数用高低电平的方法在数码管上显示出来。
表一:
7段数码管的显示关系
段
数字
a
b
c
d
e
f
g
0
1
1
1
1
1
1
0
1
0
1
1
0
0
0
0
2
1
1
0
1
1
0
1
3
1
1
1
1
0
0
1
4
0
1
1
0
0
1
1
5
1
0
1
1
0
1
1
6
1
0
1
1
0
1
1
7
1
1
1
0
0
0
0
8
1
1
1
1
1
1
1
9
1
1
1
1
0
1
1
有了这样的分析后,数字显示的问题就解决了。
另外,为了使程序能和硬件(七段数码管)能有效的结合起来,还需要一个3-8译码器在中间架起一个“桥梁”。
七段数码管的选择模块程序如下:
论文修改
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYseg7IS
PORT(q:
INSTD_LOGIC_VECTOR(3DOWNTO0);
segment:
OUTSTD_LOGIC_VECTOR(6DOWNTO0));
ENDseg7;
ARCHITECTURErt1OFseg7IS
BEGIN
PROCESS(q)
BEGIN
CASEqIS
WHEN"0000"=>segment<="0111111";
WHEN"0001"=>segment<="0000110";
WHEN"0010"=>segment<="1011011";
WHEN"0011"=>segment<="1001111";
WHEN"0100"=>segment<="1100110";
WHEN"0101"=>segment<="1101101";
WHEN"0110"=>segment<="1111101";
WHEN"0111"=>segment<="0100111";
WHEN"1000"=>segment<="1111111";
WHEN"1001"=>segment<="1101111";
WHENOTHERS=>segment<="XXXXXXX";
ENDCASE;
ENDPROCESS;
ENDrt1;
5.4计数位选择电路的描述
计数位选择电路的功能示根据八进制计数器count8输出的选择信号sel来选择对应显示位的计数数据,作为送到七段显示译码电路的输入数据.由于计数选择电路的输出端口的计数数据的位数不等,而七段显示译码电路的输入端口接收四位宽度的数据,
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYtime_chooseIS
PORT(sel:
INSTD_LOGIC_VECTOR(2DOWNTO0);
sec10:
INSTD_LOGIC_VECTOR(3DOWNTO0);
sec:
INSTD_LOGIC_VECTOR(3DOWNTO0);
q:
OUTSTD_LOGIC_VECTOR(3DOWNTO0));
ENDtime_choose;
ARCHITECTURErt1OFtime_chooseIS
BEGIN
PROCESS(sel,sec10,sec)
BEGIN
CASEselIS
WHEN"000"=>q<=sec;
WHEN"001"=>q<=sec10;
WHENOTHERS=>q<="XXXX";
ENDCASE;
ENDPROCESS;
ENDrt1;
******************************************************************
--LIBRARYIEEE;
--USEIEEE.STD_LOGIC_1164.ALL;
--ENTITYchoose_decoderIS
--PORT(sel:
INSTD_LOGIC_VECTOR(2DOWNTO0);
--choose:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
--ENDchoose_decoder;
--ARCHITECTURErt1OFchoose_decoderIS
--BEGIN
--PROCESS(sel)
--BEGIN
-
-CASEselIS
--WHEN"000"=>choose<="00000001";
--WHEN"001"=>choose<="00000010";
--WHEN"010"=>choose<="00000100";
--WHEN"011"=>choose<="00001000";
--WHEN"100"=>choose<="00010000";
--WHEN"101"=>choose<="00100000";
--WHEN"110"=>choose<="01000000";
--WHEN"111"=>choose<="10000000";
--WHENOTHERS=>choose<="XXXXXXXX";
--ENDCASE;
--ENDPROCESS;
--ENDrt1;
5.5总体功能描述
对计数器的显示模块的四个子电路描述以后,我们就可以进行计数器的总体功能描述了.在计数器显示模块的VHDL描述中,我们引用元件的形式来调用上面描述过的四个子电路,秒表显示