第八章 CPLD器件应用.docx
《第八章 CPLD器件应用.docx》由会员分享,可在线阅读,更多相关《第八章 CPLD器件应用.docx(20页珍藏版)》请在冰豆网上搜索。
第八章CPLD器件应用
第八章CPLD器件应用
随着生产工艺的逐步提高以及CPLD开发系统的不断完善,CPLD器件容量也由几百门飞速发展到百万门以上,使得一个复杂数字系统完全可以在一个芯片中实现。
HDL语言的使用,以及强大的EDA综合仿真工具,使CPLD的开发形象、快捷,特别是MAX+PLUSⅡ10.0和QUARTUSⅡ2.0以上版本,图形输入和文本输入可以方便地结合在一起,错误定位使用方便,极大地加快了开发速度。
因此CPLD在数字系统、微机系统、控制系统以及通信系统中或得广泛应用。
8-1CPLD在数字系统中的应用
CPLD器件由于本身是一种纯数字器件,因此中小规模数字器件完成的设计可以完全由一片CPLD器件所取代。
CPLD在数字系统中的典型应用主要有数字中的设计、数字频率计的设计、A/D及D/A转换时序设计、键盘扫描与去抖动设计等。
下面以0.1Hz-50MHz的频率计为例介绍CPLD器件在频率计设计中的应用。
1、设计内容:
频率采样、16进制转换成BCD码、数码管显示。
2、开发系统:
MAX+PLUSⅡ10.0
3、使用的器件:
ACEXEP1K100QC208-3
4、实验系统:
CPLDEE-4实验开发系统
(1)频率采样:
由于测量的范围较宽,因此分成两种处理方式:
频率大于等于1000Hz的采用直接计数方式,即在一秒内对被测频率所计的数即得频率值。
等频率小于1000Hz时采用脉宽测量的方式,即首先将被测信号进行二分频,使得被测信号的正负脉宽相等,然后利用正脉宽对1MHz的标准频率进行采样,频率值f=100MHz/采样值,这样可以得到小数点后两位的值。
如图8.1所示:
图8.1频率测量示意图
图8.2频率计模块示意图
图8.2中详细描述了各个模块的功能及连接关系。
其中信号inclk为系统时钟,这里采用40MHz,fin为被测信号,其范围为0.1Hz至50MHz,二分频后的FS作为测量的输入时钟,开关k实现计数方式与脉宽测量方式的切换。
模块fsurveya实现计数方式测量,原理是将系统时钟inclk分频,得到高、低电平分别2秒的方波,在高电平时对被测信号计数,在低电平时将计数值输出。
其HDL描述如下:
模块fsurvb完成脉宽测量方式,为了提高测量精度采用1MHz作为计数时钟,因此首先将系统时钟inclk分频得到1MHz的时钟,在FS为高电平时计数,低电平时将测量数据输出,其HDL描述如下:
模块div10mc完成脉宽测量数据到频率的转换,公式为频率值f=100MHz/采样值,HDL描述如下:
在模块div10mc中为了完成除法运算,调用了标准的32位除法运算器模块divide32,divide32模块的HDL描述如下:
模块sel完成计数方式测量与脉宽测量方式得到的数据之间的切换,其中K为高电平时选择计数方式数据,K为低电平时选择脉宽测量方式数据,HDL描述如下:
模块decode7s主要任务完成7段共阴极数码管的译码及驱动,其中8位BCD码由mout[31..0]输入,7SA[6..0]、7SB[7..0]分别为两个扫描显示的段输出,sela[3..0]、selb[3..0]为八个扫描显示的位选择。
7sc[6..0]、7sd[6..0]为两个静态显示数码管的段输出,显示“HZ”字样。
整个设计采用高位灭零的显示方式。
HDL描述如下:
由于分频系数太大,软件仿真很困难,因此采用CPLDEE-4实验开发系统进行硬件仿真,仿真结果满足设计要求。
8-2CPLD器件在人机接口中的应用
人机接口电路在微机系统中应用非常广泛,其主要接口是键盘和显示器,在CPLD系统的开发中人机接口电路也是一个重要的环节。
数码管的显示(包括静态和串行扫描显示)前面已经讨论的比较详细,本节内容主要讨论矩阵排列方式的键盘的扫描、按键去抖动、键码识别等内容。
下面介绍4X4矩阵扫描、去抖、键码识别及显示。
主要原理是先将系统时钟inclk(22MHz)分频至5ms作为键查询时钟keyclkout,keyclkout十分频后得到50ms时钟chuclkout作为触发时钟,在该时钟高电平的期间送出列扫描数据,然后将行数据送到去抖电路进行去抖后读入,根据行、列数据之间的关系确定键值。
键盘布局如图8.3所示,去抖电路如图8.4所示:
在该电路中采用5ms的时钟接收输入数据,如果连续三次数据为零,则可以确认数据是稳定的并可以接收。
图8.3键盘电路示意图
图8.4键盘去抖电路
以上是一个比较通用的抖动消除电路,它由D触发器与RS触发器构成。
要求信号稳定的时间由D触发器的个数来决定。
这个单元电路被命名为tinglmove,并被作为元件在下面的VHDL程序中引用。
下面是完整的键盘串行扫描显示电路的VHDL语言描述:
LIBRARYieee;
USEieee.std_logic_1164.all;
USEieee.std_logic_arith.all;
USEieee.std_logic_unsigned.all;
ENTITYkey2IS
PORT(inclk:
INstd_logic;--输入时钟信号
inkey:
INstd_logic_vector(0to3);--输入按键信号
outkey:
OUTstd_logic_vector(0to3);--输出键盘扫描信号
outled:
OUTstd_logic_vector(7downto0)--LED显示
);
ENDkey2;
ARCHITECTUREartOFkey2IS
COMPONENTtinglmove--去抖电路引入
PORT(a,clk:
INstd_logic;
b:
OUTstd_logic);
ENDCOMPONENT;
SIGNALkeyclk:
std_logic_vector(16downto0);
SIGNALchuclk:
std_logic_vector(2downto0);
SIGNALkeyclkout,chuclkout:
std_logic;--键盘去抖脉冲,串行扫描产生脉冲
SIGNALchuout:
std_logic_vector(0to3);--扫描信号
SIGNALinkeymap:
std_logic_vector(0to3);--按键去抖后的信号
SIGNALkeyout:
std_logic_vector(0to7);--
BEGIN
roll:
FORiIN0TO3GENERATE--生成四个去抖单元电路
movskipX:
tinglmovePORTMAP(inkey(i),keyclkout,inkeymap(i));
ENDGENERATE;
clk_key:
PROCESS(inclk)
BEGIN
if(inclk'eventandinclk='1')then
ifkeyclk=54999then
keyclk<="00000000000000000";
keyclkout<=notkeyclkout;
else
keyclk<=keyclk+1;
endif;
endif;
ENDPROCESSclk_key;
clk_chu:
PROCESS(keyclkout)
BEGIN
IF(keyclkout'EVENTANDkeyclkout='1')THEN
IFchuclk=4THEN
chuclk<="000";chuclkout<=notchuclkout;
ELSE
chuclk<=chuclk+1;
ENDIF;
ENDIF;
ENDPROCESSclk_chu;
clk_chu_out:
PROCESS(chuclkout)
BEGIN
IF(chuclkout'EVENTANDchuclkout='1')THEN
IFchuout="1110"THEN
IFinkeymap/="1111"THEN
keyout<=chuout&inkeymap;
ENDIF;
chuout<="1101";
ELSIFchuout="1101"THEN
IFinkeymap/="1111"THEN
keyout<=chuout&inkeymap;
ENDIF;
chuout<="1011";
ELSIFchuout="1011"THEN
IFinkeymap/="1111"THEN
keyout<=chuout&inkeymap;
ENDIF;
chuout<="0111";
ELSIFchuout="0111"THEN
IFinkeymap/="1111"THEN
keyout<=chuout&inkeymap;
ENDIF;
chuout<="1110";
ELSE
chuout<="1110";
ENDIF;
ENDIF;
ENDPROCESSclk_chu_out;
outkey<=chuout;
out_led:
PROCESS(keyout)
BEGIN
casekeyout(0to3)is
when"0111"=>casekeyout(4to7)is
when"0111"=>outled<=x"7e";
when"1011"=>outled<=x"33";
when"1101"=>outled<=x"7f";
when"1110"=>outled<=x"4e";
whenothers=>outled<=x"00";
endcase;
when"1011"=>casekeyout(4to7)is
when"0111"=>outled<=x"30";
when"1011"=>outled<=x"5b";
when"1101"=>outled<=x"7b";
when"1110"=>outled<=x"3d";
whenothers=>outled<=x"00";
endcase;
when"1101"=>casekeyout(4to7)is
when"0111"=>outled<=x"6d";
when"1011"=>outled<=x"5f";
when"1101"=>outled<=x"77";
when"1110"=>outled<=x"4f";
whenothers=>outled<=x"00";
endcase;
when"1110"=>casekeyout(4to7)is
when"0111"=>outled<=x"79";
when"1011"=>outled<=x"70";
when"1101"=>outled<=x"1f";
when"1110"=>outled<=x"47";
whenothers=>outled<=x"00";
endcase;
whenothers=>outled<=x"00";
endcase;
ENDPROCESSout_led;
endart;
程序说明:
这个系统中引入时钟频率为10M---40M之间或更高时都能很好的工作。
如果系统时钟不在此范围,只要改变分频系数使keyclkout的周期约为5ms即可。
8-3CPLD在微机系统中的应用
由于目前CPLD器件使用灵活,可编程管脚丰富,而且与微机相关IPCORE也越来越多,用CPLD与微机配合可以极大地缩短开发周期和上市时间,因此CPLD器件在微机系统获得广泛应用。
本节以CPLD器件作为MCS51单片机的接口器件研究单片机、CPLD配合在数据采集、数据传输、人机接口、波形产生等各方面的应用。
接口的模块如图8.5、8.6所示:
图8.5通过CPLD构建开关、RAM、A/D、D/A与单片机的接口
在图8.5中采用层次设计方式,其中模块adcdac完成ADC0809数/模转换、DAC0832模/数转换与单片机的接口;模块key4X4完成4X4键盘与单片机的接口,键盘电路如图8.3所示;模块switch完成16个数位开关与单片机的接口;模块ram6232是利用CPLD内部的EAB技术生成可以完全替代4kram的存储器;模块adrdcode是利用单片机P2口的p2.4、p2.5、p2.6、p2.7进行译码将64k的读写空间进行划分,其中地址空间0-0FFFH译码产生ym0,控制RAM的读写;1000H译码产生ym1,2000H译码产生ym2分别控制键盘的扫描和回读;3000H,4000H译码产生ym3,ym4控制八个串行扫描数码管的显示,其连接方式见图8.6;5000H,6000H译码产生adccs、daccs控制ADC0809和DAC0832数据接口;7000H、8000H译码产生switch1、switch2信号控制16个开关的读写(这里采用的实验系统中16个开关和16个状态指示LED是复用的方式,因此既可以输入,也可以输出);9000H、0A000H译码产生stdis1、stdis2分别控制两个静态数码管的显示。
图8.6通过CPLD构建显示、通信、键盘与单片机的接口
下面分别介绍各个模块的原理:
1、adcdac模块:
由于ADC0809采样与DCA0832的数据输入端都使用单片机的P0口,因此采用74244三态总线进行隔离,读写选通由rd、wr、adccs、daccs、eoc、ale信号以及它们之间组合逻辑关系构成,该部分内容是常规的单片机接口信号,这里不在累述。
pa0、pa1、pa2分别为单片机的p0.0、p0.1、p0.2与ale、74373配合产生ADC0809的八路模拟通道的选择信号。
ADC0809的采样时钟adcclk由单片机的ale经74163计数器5分频后产生。
adcs、dacs为ADC0809与DAC0832的片选端,这里采用直接接地的方式。
具体的电路连接方式如图8.7所示:
图8.7ADC0809与DAC0832的接口模块
2、adrdcode模块:
adrdcode模块的原理比较简单,利用单片机的P2口的p2.4、p2.5、p2.6、p2.7四根地址线与两片74138级连进行译码将I/O空间划分为16个部分,这里只使用了其中的11个,还有5个地址空间没有使用,可以留着作为扩展空间,如液晶显示器、PC机的并行接口等,划分后的地址空间上面已经做了详细介绍。
电路如图8.8所示:
图8.8地址译码器
3、switch模块:
在switch模块中主要利用单片机实现16个开关和16个LED指示灯的读写,开关、指示灯与CPLD的连接方式如图8.9所示:
图8.9开关与LED指示灯与CPLD的物理连接
图8.10是switch模块的具体内部电路,在该电路中由于输入、输出都是由单片机的P0口操作,因此输入、输出需要74244三态总线隔离,控制逻辑由rd、wr、switch1、switch2配合产生。
图8.10switch模块的内部电路
4、ram6232模块:
该模块是利用CPLD器件内部的EAB技术构造的4K的RAM,其功能可以完全替代ram6232,其HDL描述如下:
在该模块的描述中,将一个标准的4KRAM模块YY与ALE以及锁存器md[7..0]配合实现数据总线、地址总线的分离。
4KRAM的电路如图8.11所示:
图8.11利用CPLD器件的EAB技术实现4KRAM
5、scan7seg模块的原理:
在该模块中可以控制10个数码管的显示,整个图形分为上、下两个块,上半部分由单片机的P0口、stdis1、stdis2、wr以及两个74273配合驱动两个静态数码管的显示。
下半部分主要用来驱动8个串行扫描数码管。
由ym3和ym4决定段驱动和位扫描的地址空间,scana[7..0],scanb[7..0]各驱动四个数码管的八段,sel[8..1]驱动八个数码管的位。
具体电路如图8.12所示:
图8.12数码管的选择与驱动
6、key4x4模块的原理:
该模块的功能是利用单片机的P0口,进行16个键盘的扫描和查询并形成编码。
键盘的排列方式见图8.3,将P0口分成高、低四位,其中低四位值经74273锁存后输出列扫描线,扫描码为“0111”、“1011”、“1101”、“1110”,并依次循环。
键盘的行线经74244隔离和缓冲后送P0口的高四位,单片机依据扫描码和回读行线的值就可以确定被按下的键的位置,并进行编码。
键扫描的时序由ym1和wr产生的逻辑关系确定,键值的回读时序由ym2和rd确定,具体电路如图8.13所示:
图8.13键盘的扫描与回读
7、acom模块的原理:
该模块主要研究异步串行通信的内容,主要由三个部分:
(1)PC机的异步串行口经RS232与CPLD相连
(2)单片机的异步串行口与CPLD相连(3)CPLD与MAX487相连acom模块内容主要研究如何控制PC机到单片机,PC机到485,单片机到485的通信。
其中单片机的P1.0、P1.1经74138译码后产生控制逻辑,当P1.1、P1.0组合的值为“00”时选通PC机到485的直通方式,“01”时选通PC机与单片机之间的相互通信,“10”时选通单片机与485的连接,实现单片机的远距离传输与多机通信。
P1.2控制485的收、发,P1.2为“0”时接收,为“1”发送。
具体电路见图8.14所示:
图8.14通信接口电路
8-4CPLD器件在通信中的应用
由于HDL语言的使用,使CPLD器件在数字设计中变的非常容易,因此CPLD器件在通信领域获得广泛应用。
特别是在差错编码技术、信息加密技术、位同步信号提取技术、复接技术、串行异步通信等方面更是应用广泛。
下面就以异步串行通信为例介绍CPLD在通信方面的应用。
本节内容介绍如何将CPLD与PC机配合形成任意波形函数发生器,其主要模块介绍如下:
模块UNIVERSALRXD是用VHDL语言描述的通用异步接收器,可以接受和9位数据,第九位数据由CHEN输出,为“0”表示接收的是数据码,为“1”表示接收的是命令码。
FS[3..0]控制该模块的波特率,总共有16中选择(300—115200)。
OUTEN表示数据接收完成,OUTDATA[7..0]是输出的低八位数据,INCLK是系统时钟(22.1184MHz),OUTCLK是波特率的96倍,可以给其它模块使用。
模块WAVEVBIO主要完成ID号的选择,这是在多机通信中必不可少的一个部件。
其功能描述如下:
ID[5..0]是本机的地址码,当UNIVERSALRXD模块第九位数据接收完毕,且第九位数据CHEN为“1”时,使能WAVEVBIO模块,将接收到的八位数据与本机的ID号比较,如果相等则表示本机选中,使iden为“1”并使能其它模块,以处理后续接收的数据,否则本机将接收的数据丢弃,其中命令码INDATA[7..0]中高两位编码INDATA[7..6]是“01”时,低位数据为ID号;“10”时,低位数据为波特率调整系数;“11”时,低位数据为扫描频率系数。
模块WAVEVB-BPS是波特率选择器,其主要原理是当本机的ID号,接收的第九位数据完成(INEN有效)以及CHEN有效时,根据INDATA[7..0]来调整接收器的波特率。
波特率的调整码由fs[3..0]输出。
Csen为D/A转换器的片选端,电路如图8.15所示:
图8.15异步通信控制电路
模块LPM-RAM-DP是双口RAM,其中DATA[],wraddress[],wren控制数据的写入,是序逻辑由模块WAVEVB-22控制;LPM-RAM-DP模块的rdaddress[]、q[]控制数据读出,并送D/A转换器产生波形,波形的频率是由rdaddress[]的变化快慢决定的;模块WAVEVB-3的功能是根据infs[11..0]的数据调整rdaddress[]的时钟;模块WAVE-F的功能是将接收的多字节数据拼接形成insf[11..0]。
具体电路见图8.16所示:
图8.16波形发生器电路模块图
模块UNIVERSALRXD的VHDL语言如如下: