CPLDFPGA实验台设计.docx
《CPLDFPGA实验台设计.docx》由会员分享,可在线阅读,更多相关《CPLDFPGA实验台设计.docx(29页珍藏版)》请在冰豆网上搜索。
![CPLDFPGA实验台设计.docx](https://file1.bdocx.com/fileroot1/2023-1/26/f5fda857-5de9-4158-b982-033db1a5508d/f5fda857-5de9-4158-b982-033db1a5508d1.gif)
CPLDFPGA实验台设计
摘要
本系统中主要运用了电路编辑、VHDL语言来设计,并配合Altera公司的MAX+PLUSII软件进行仿真调试,该软件完全集成化,易学易用,它可以在多种平台上运行。
在设计本系统时,将其分解为若干个子系统。
子系统再分解为一个个功能独立的模块,这些模块经过设计、仿真、功能正确后,像拼积木似的根据需要进行不同的拼接,完成特定的功能。
运用可编程逻辑器件,是不仅能在短时间里完成计划任务,而且能使系统的速度更快,体积更小,重量更轻,功耗更少,加密性能更可靠,满足现代电子发展的需要。
本系统主要设计的是键盘扫描电路,数码显示电路,A/D、D/A控制器电路,然后运用可编程逻辑器件进行硬件验证。
关键词:
VHDL模块仿真
Abstract
Thissystemmakeuseofprimarilytheelectriccircuitedits,thelanguageofVHDLtodesign,andmatchwiththecompanyofAlteraMAX+PLUSIIsoftwareproceedstoimitatetoreallyadjusttotry,thatsoftwaregatherscompletely,iseasytobelearnedandusedeasily,itcanrunonvariousplatform.
Whiledesigningthesystem,itisseptratedfromsomesub-system.Thesub-systemresolvestoanagainindependentmoldinfunctionineachpiece,thesemoldsespiecethroughdesign,imitatetrue,functionrightempress,resembleputtogetherthewoodenblocksaccordingtoneedtobeproceededtoputtogethertoconnectdifferently,completetheparticularfunction.
Theprogrammablelogicinapplicationapparatuscannotonlycompletetoplanthemissionwithinshorttime,butalsocanmakesystemspeedissooner,thephysicalvolumeissmaller,theweightislighter,thepowerisless,encryptthefunctionismoredependable.itsatisfythedemandofthemodernelectronicsdevelopment.
Thissystemdesignsprimarilyisakeyboardtoscantheelectriccircuit,numberdisplay,A/D,D/Acontrollercircuit,thenwemakeuseoftheprogrammablelogicapparatuswhichproceedingthehardwaretheverification.
Keywords:
VHDL,Module,Really-Imitate
第一章绪论…………………………………………………………………1
1.1引言…………………………………………………………………1
第二章VHDL语言的概述…………………………………………………3
2.1VHDL语言的概述……………………………………………………3
2.2VHDL语言特性………………………………………………………3
2.3VHDL语言的基本结构………………………………………………4
第三章EPM7128S芯片简介………………………………………………5
第四章CPLD/FPGA实验平台设计……………………………………7
4.1CPLD实验平台功能概述…………………………………………7
4.2CPLD实验平台功能模块及VHDL程序设计说明……………………8
4.2.1键盘显示VHDL程序设计…………………………………………8
4.2.2A/D采样控制器设计及VHDL程序设计说明……………………27
4.2.3D/A接口电路与波形发生器设计………………………………30
结论……………………………………………………………………33
致谢……………………………………………………………………34
主要参考文献……………………………………………………………35
第一章绪论
1.1引言
随着技术的发展,电子信息类产品的开发研制出现了两个趋势:
开发的复杂程度加深和产品面世的时限紧迫。
就是说,一方面开发人员需要将更多的功能、更高的性能和更丰富的技术含量集成于所开发的电子系统之中,另一方面要让产品尽早地进入市场。
因此,增强系统功能、提高系统性能、缩短系统开发周期以及尽早推出产品并上市等对电子产品的开发提出了越来越高的要求。
解决这个问题的方法就是在系统设计引入可编程逻辑器件,并采用EDA(电子设计自动化)的设计方式。
以硬件描述语言表达设计意图、大规模可编程逻辑器件(CPLD/FPGA)作为硬件载体、计算机作为设计开发工具、EDA软件作为开发环境的现代电子设计方法日趋成熟。
目前,掌握这种先进的电子设计技术的人才还十分匮乏,这就给高等院校提出了急切的要求,即一方面要深入进行高等院校的教育改革,更新教学内容,培养大批适应这种技术发展所需要的科技人才;另一方面,要大量更新现有的实验用电子仪器设备,引进各种先进的可编程逻辑器件开发实验装备,提高学生的综合素质,适应未来的要求。
使用可编程逻辑器件不仅能短时间内完成设计任务,而且能使系统的速度更快,体积更小,重量更轻,功耗更小,加密性能可靠,满足现代电子发展需要。
为适应电子技术发展的进步和国际竞争对人才的需求,提高我院电子技术教学的质量和水平,使学生对可编程逻辑器件的开发实验环境有深刻的感性认识,开发一套完整的CPLD/FPGA实验系统势在必行。
基于上述考虑,我们认为:
为了让学生尽快掌握可编程逻辑器件的开发技术,关键在于能否给学生提供一个可编程器件的开发实验环境。
改革传统的课程实验模式,而专门研制具有系统级综合能力的实验设备。
本CPLD/FPGA实验平台包括体现CPLD/FPGA开发技术的基本方面,如核心CPLD/FPGA芯片,程序下载装置,CPLD/FPGA器件开发、调试、仿真所需要的软件平台,实现基本功能的其他器件和装置等。
基本实现键盘扫描,屏幕显示,A/D转换和控制器设计以及D/A接口电路与波形发生器设计等实验模拟仿真目的就是用最简单、最直接的方法体现CPLD/FPGA技术开发的原理和方法。
第二章VHDL语言的概述
2.1VHDL语言的概述
目前最通用的硬件描述语言有VHDL与Verilog两种。
1982年美国国防部的一个分支专案要求所有的数字电路必须用VHDL语言设计。
1983年的IBM及TI等公司在此专案规定下,开始开发VHDL。
随后IEEE也认可此成果为IEEE标准,1993年又修订为93年版的IEEE1076号标准[10]。
后来将一种可配合集成工具的VHDL程序包,特别命名为IEEE1076.3,并成为1076号IEEE标准的一部分。
最近,新标准包IEEE1076.4被开发出来,成为建立ASIC及FPGA的模型函数库。
VHDL的设计层面可以划分为系统层、算法层、寄存器传输层、逻辑层以及电路层。
另一支VHDL语言的主流是Verilog,其建模能力可以涵盖所有范围[1]。
2.2VHDL语言特性
VHDL主要用于描述数字系统的结构、行为、功能和接口。
除了含有许多硬件特征的语句外,VHDL的语言形式和描述风格与句法是十分类似于一般的计算机高级语言。
VHDL的程序结构特点是将一项工程设计,或称设计实体(可以是一个元件,一个电路模块或一个系统)分成外部(或称可视部分及端口)和内部(或称不可视部分),既涉及实体的内部功能和算法完成部分。
在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可以直接调用这个实体。
这种将设计实体分成内外部分的概念是VHDL系统设计的基本点。
应用VHDL进行工程设计的优点是多方面的[12]。
VHDL语言可描述一个数字电路的输入、输出以及相互间的行为与功能。
而其硬件关联性的语法与形式虽类似于一般程序语言,但是涵盖许多与硬件关联的语法构造。
其特有的层次性——由上而下的结构式语法结构适合大型设计项目的分包下去,各自独立运行。
从抽象的层次而言,VHDL的语句分成以下4个大类[3]:
采用语言逻辑方式直接描述硬件电路的工作,表示一个设计的功能或算法,描述IC内部电路行为。
在此结构定义中可以同时包含并行描述与顺序语句。
2数据流
从数据输入与输出的观点,大部分的并行语句都用于数据转换工作。
3结构式
允许设计者以树状形式调用内置电路组件。
通常以引脚图方式调用并连接。
从硬件的角度说,调用组件就像在组合与连接电路元器件一样。
4寄存器传输式
VHDL是一种类型化的语言,一种数据类型的数据内容不能指定给其他类型的数据,而且不同数据类型的数据需经过转换才能相互运算。
每一种电路的VHDL码都是实体与结构的成对组合,先用实体来定义一个IC电路引脚规格及基本参数,然后在用结构定义IC内部电路的功能运做,即构成一个完整的电路模块[6]。
2.3VHDL语言的基本结构
一个完整的VHDL语言程序通常包括实体(entity)、构造体(architecture)、配置(configuration)、包集合(package)和库(library)5个部分。
前4种是可分别编译的源设计单元。
实体用于描述所设计电路系统的外部接口信号,系统的输入输出端口及属性都是在实体中定义的;构造体用于描述系统内部的结构和行为,系统要实现的功能都是在构造体内用语言进行描述的;配置用于从库中选取所需单元来组成系统设计的不同版本;包集合存放各种设计模块都能共享的数据类型、常数和子程序等;库存放已经编译的实体、构造体、包集合和配置。
库可由用户生成或者是由ASIC芯片制造商提供,以便在设计中为大家所共享。
这种功能可以通过特定的语句来实现[8]。
在VHDL语言程序中,最重要的就是实体和构造体部分。
它们是一个具体设计的核心。
在构造体中,通过各种VHDL语句及合理的设计,接受外部输入信号,在构造体中各种信号协调工作,最后得到所需的输出,传送到输出端口和外部进行交流。
第三章EPM7128S芯片简介
本设计采用EPM7128S芯片,下面将对其进行简单介绍。
ALTERA的EPM7128S系列CPLD是基于第二代MAX结构体系地高性能EEPROM结构的CPLD。
完全符合IEEE1149.1JTAG边界扫描标准,具有5VISP的功能。
具有最小5ns的引脚到引脚的逻辑时延,最高可175.4MHz的计数频率。
引脚可配置为开漏输出。
每个宏单元都有独立的可编程电源控制,最多可以节省50%的功耗。
宏单元内的寄存器具有单独的时钟和复位等信号。
支持多种电压接口[7]。
MAX7128S是一种复杂可编程逻辑器件,IC管脚参阅原理图,是84pinPLCC封装,另外还有其它类型的管脚和封装,选择性强,该IC具有以下主要性能:
以第二代多阵列矩阵(MAX)结构为基础,是一种高性能CMOSEEPROM器件;
通过JTAG(JointTextActionGroup联合测试组)接口可实现在线编程(ISP),本实验板提供JTAG接口;
逻辑密度为2500个可用编程门电路,128个宏单元;
68条可编程I/O口,TTL逻辑电平为5V或3V;
引脚到引脚的逻辑延时为5.0ns,计数器工作频率可达到151.5MHz;有集电极开路选择,可编程宏单元触发器,具有专有的清除(clear)、时钟(clock)、输出使能(OE)控制;
与不同电源电压的系统接口,VCCIO引脚用于输出缓冲器接到5V电源时,输出电平与5V电源兼容,VCCIO引脚用于输出缓冲器接到3.3V电源时,输出电平与3.3V电源兼容,VCCINT用于内部电路和输入缓冲器;
包括一个可编程的程序加密位,全面保护专利设计,防止程序被复制和读出。
在本设计中,电源接5V,系统输入/出端口信号接I/O引脚,CLK接1024KHZ频率,RESET接外部复位电路。
图3-1EPM7128S芯片引脚图
第四章CPLD/FPGA实验平台设计
4.1CPLD实验平台功能概述
本文设计的CPLD/FPGA实验平台为VHDL语言学习实验平台。
分为外部硬件和软件两个方面。
结构图如下:
图4.1CPLD/FPGA实验平台结构图
外部硬件方面包括各个器件的实验板,本次设计的系统是根据现有的电路设计的。
软件方面将引用模块化的概念,将各个功能模块分开成多个小的模块,在实现具体功能的时候运用元件转化成原理图方式实现。
优点是可以增加程序的调试速度,同时也能够将工作细分(这种概念在以后编写较大型的电路设计程序时,是非常重要且有用的),以提高编程速度。
同时针对不同的程序可以适时修改一些参数适应不同的要求,以增加程序的灵活性[2]。
4.2CPLD实验平台功能模块及VHDL程序设计说明
4.2.1键盘显示VHDL程序设计
一、键盘扫描电路模块设计
键盘扫描的电路如附录流程图4.2分频器电路、键盘扫描计数器电路、键盘column和row按键检测电路、按键抖动消除电路、键盘编码电路等组成[11]。
图4.2键盘扫描电路流程图
下面分块介绍各电路VHDL程序实现及简单原理。
1.分频器电路模块
如果外加信号频率为3.6864MHZ,由于键盘扫描不需要那么高的频率,所以现在设计严格分频电路将频率降低为1KHZ,因此可以利用如下程序来实现该电路。
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityscan_genis
generic(osc_f:
integer:
=3686;osc_bit:
integer:
=12);
port(
clk:
instd_logic;
scan_f:
outstd_logic);
endscan_gen;
architecturebehaviorofscan_genis
begin
scan_freq:
process(clk)
variableQSCAN:
std_logic_VECTOR(osc_bit-1downto0);
begin
if(clk'eventandclk='1')then
if(qscan>=osc_f-1)then
foriinosc_bit-1downto0loop
qscan(i):
='0';
endloop;
else
qscan:
=qscan+1;
endif;
endif;
if(qscan>=osc_f-1)then
scan_f<='1';
else
scan_f<='0';
endif;
endprocessscan_freq;
endbehavior;
程序设计说明:
在entity模块中,定义了同步时钟脉冲信号输入CLK和输出频率信号scan_f,同时定义了分频次数osc_f为3686次,且计数数位为12位(二进制计数)。
在architecture模块里定义了分频的逻辑过程:
statel:
设定一个计数变量QSCAN定义为12位,表示当QSCAN在CLK计数过程中,数值如果>=osc_f-1则表示计数超过了3686次,输出scan_f<=’1’[5]。
state2:
否则,如果计数变量始终没有超过osc_f-1则在3686次中,始终为scan_f<=’0’,这样在输出的时候scan_f的频率就是输入的1/3686,即,输出为分频3686次后的1KHZ。
其仿真结果如图4.3所示。
图4.3分频器电路模块时序仿真图
2.键盘扫描计数电路模块
以1KHZ分频器电路的输出为clock。
按键(key_pressed)为使能位,当使用者尚未按下键盘时,key_pressed=‘1’,此时由0~15反复计数,并输出计数结果作为按键检测电路的输入而扫描键盘,直到使用者按下键盘时key_pressed=‘0’,计数器停止,持续输出计数值。
如下程序实现此功能。
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entityscan_countis
port(
clk:
instd_logic;--clock
scan_f:
instd_logic;--1khzclock
key_pressed:
instd_logic;--detectkey_preeedtostopcounter
scan_cnt:
outstd_logic_vector(3downto0));
endscan_count;
architecturebehaviorofscan_countis
signalqscan:
std_logic_vector(3downto0);
begin
scan_1:
process(clk,scan_f,key_pressed)
begin
if(clk'eventandclk='1')then
if(scan_f='1'andkey_pressed='1')then
qscan<=qscan+1;
endif;
endif;
endprocess;
scan_cnt<=qscan;
endbehavior;
程序设计说明:
在entity模块中定义了三个输入,分别是1KHZ的同步时钟、扫描频率scan_f、和按键使能key_pressed[4]。
在architecture模块中:
statel:
当key_pressed和scan_f都为高电平时,将计数教给scan_cnt输出;
state2:
如果key_pressed为低电平触发,则始终将当前计数输出到scan_cnt。
其仿真结果如图4.4所示。
图4.4键盘扫描模块时序仿真图
3.键盘检测电路模块
当尚未按下键盘时,依照每次输入计数对应一排一位的编码方式逐一扫描键盘按钮,如:
000代表一行第一个按钮;依次排序。
键盘输入到按键检测电路column的值均为1,使键盘无论扫描到哪个键时,均使按键使能位(key_pressed)为1,检测到尚未按下键盘。
当使用者按下键盘按钮,则键盘输入到按键监测电路column的值为0,直到键盘扫描到此键时则key_pressed=‘0’检测到已按键。
如下VHDL程序代码实现此功能。
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
useponents.all;
entitykey_scanis
port(
col:
instd_logic_vector(3downto0);
scan_cnt:
instd_logic_vector(3downto0);
row:
outstd_logic_vector(3downto0);
key_pressedoutstd_logic);
endkey_scan;
architecturebehaviorofkey_scanis
begin
row<="1110"whenscan_cnt(3downto2)="00"else
"1101"whenscan_cnt(3downto2)="01"else
"1011"whenscan_cnt(3downto2)="10"else
"0111";
key_pressed<=col(0)whenscan_cnt(1downto0)="00"else
col
(1)whenscan_cnt(1downto0)="01"else
col
(2)whenscan_cnt(1downto0)="10"else
col(3);
endbehavior;
程序设计说明:
在entity模块中定义了col:
按键检测电路输入;
scan_cnt:
扫描输出脉冲计数;
row:
行扫描计数;
key_pressed:
按键确定按下输出;
在architecture模块中
statel:
在没有按键按下的时候,column=”1”,使能key_pressed=”1”;
state2:
当按下按钮时,column=”0”,而直到扫描电路扫描到该按钮的时候key_pressed=”0”,此时输出按钮编码和按钮位。
其仿真结果如图4.5所示。
图4.5键盘检测电路模块时序仿真图
4.按键抖动消除电路模块
抖动消除电路实际就是一个倒数计数器,主要目的就是为了避免按键时键盘产生的按键抖动效应使key_pressed产生不必要的抖动变化,而造成重复统计按键次数的结果。
因此,只需要将key_pressed作为计数器的重置输入,使计数器只有在使用者按下按钮时,在key_pressed=‘0’时间足够长的一次使重置无动作,而计数器开始倒计数,自然可以将key_pressed在短时间内变为“0”的情况滤除掉。
利用如下VHDL程序来实现该电路。
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitydebounceis
port(
key_pressed:
instd_logic;
clk:
instd_logic;
scan_f:
instd_logic;
key_valid:
outstd_logic);
enddebounce;
architecturebehaviorofdebounceis
begin
debounce:
process(clk,scan_f,key_pressed)
variabledbnq:
std_logic_vector(5downto0);
begin
if(key_pressed='1')then
dbnq:
="111111";
elsif(clk'eventandclk='1')