通信与电子系统综合设计实验报告6系.docx
《通信与电子系统综合设计实验报告6系.docx》由会员分享,可在线阅读,更多相关《通信与电子系统综合设计实验报告6系.docx(23页珍藏版)》请在冰豆网上搜索。
通信与电子系统综合设计实验报告6系
通信与电子系统综合设计
院系:
信息学院6系
姓名:
学号:
邮箱:
cxxie@
手机:
2013年12月27日
设计一实现FPGA对CPLD外设的全部利用
实验要求
•编写CPLD程序控制其外设(LED,数码管,输入开关等),并全部提供给FPGA使用
•编写CPLD与FPGA(XC2V2000)的接口电路,实现FPGA与CPLD外设的直接对应关系.
•编写FPGA程序测试CPLD的全部外设
实验说明
1.硬件分析
本次实验涉及的硬件包括:
4个脉冲触发开关、8个拨码开关、8个7段数码管、32个LED发光二极管以及如图1.1所示的CPLD和FPGA芯片。
图1.1硬件连接图
2.实验要求分析
要求通过FPGA对CPLD的全部外设进行控制,如果不进行编码则需要4+8+32+16=60根连接线,而实际只有23条,在这种情况下,对于8位拨码开关,可以在CPLD中对进行并串转换,8位需要3位地址线,再用一位表示指定地址的拨码开关的状态,这样就可以用4位将8位拨码开关信号传输到FPGA,在FPGA中将4位表示拨码开关的信号进行串并转换,得到8位信号,然后用这8位信号控制8个7段数码管,用高4位信号表示段码,再用低四位实现功能控制,最多有16种。
对于4个脉冲开关,可直接传输,在FPGA中,用这4位信号实现对32位LED发光二极管进行控制;此外,8个7段数码管,需要3根地址线和4根数据线,32个LED发光二极管,需要5根地址线和1位状态位,状态位用来表示指定地址的LED的状态。
通过上述分析,总共需要4+4+3+4+5+1=21根连接线,不超过实际的23条连接线,所以上述方案是可实现的。
图1.2为FPGA控制CPLD外设的结构示意图。
图1.2FPGA控制CPLD外设的结构示意图
设计方案
1.CPLD程序设计
CPLD程序分为以下几个功能模块:
首先对八位拨码开关信号进行并串转换传输到FPGA中;对脉冲开关信号进行处理,每按一次脉冲开关,经过程序处理得到‘0’或‘1’传输到FPGA;对FPGA传输过来的5位LED地址、数码管3位位选信号和4位段码信号进行译码然后将译码之后的信号传输到外设。
CPLD程序主要结构图如如1.3所示。
图1.3CPLD程序结构图
a)并串转换
8位拨码开关信号进入CPLD后对其进行并串转换,转换后用4位信号表示,其中高3位表示拨码开关地址,最低位表示开关的状态。
在程序模块,用一个3位计数器,每一次时钟上升沿到来时计数器加1,然后根据计数器的值进行选择转换,程序如下:
process(clk,dip,counter)
begin
if(clk'eventandclk='1')then
ifcounter>="111"then
counter<="000";
else
counter<=counter+1;
endif;
endif;
casecounteris
when"000"=>dip_sw<="000"&dip(0);
when"001"=>dip_sw<="001"&dip
(1);
……
when"111"=>dip_sw<="111"&dip(7);
whenothers=>dip_sw<="111"&dip(7);
endcase;
endprocess;
b)脉冲开关信号处理
每按一次脉冲开关,对其脉冲信号进行处理,得到1位信号‘0’或‘1’然后传输到FPGA。
其处理的程序如下(4个脉冲开关处理过程一样):
process(key1)
variableK1:
std_logic;
begin
ifkey1'eventandkey1='1'then
K1:
=not(K1);
endif;
pul_sw1<=K1;
endprocess;
c)LED地址译码
5位LED地址信号和1位LED状态信号从FPGA传输到CPLD后要对其进行译码,其代码如下:
process(clk)
begin
ifclk'eventandclk='1'then
caseled_addris
when"00000"=>led(0)<=led_val;
when"00001"=>led
(1)<=led_val;
……
when"11110"=>led(30)<=led_val;
whenothers=>led(31)<=led_val;
endcase;
endif;
endprocess;
d)数码管位选和段码译码
FPGA传输过来的3位位选信号和4位段码信号,需要在CPLD中对其进行译码,然后直接传输到外设。
其代码见附录中实验1的CPLD完整代码。
2.FPGA程序设计
在FPGA程序中,首先要对系统48MHz时钟进行两次分频得到10KHz和1Hz的时钟,其中10KHz时钟用于LED和数码管进程控制,1Hz时钟用于循环功能控制;其次要对CPLD传输过来的拨码开关的4位串行信号进行串并转换得到8位信号;LED驱动模块包括LED功能控制进程、LED循环控制进程以及计数最大为32的计数器(在进程中指定LED的位置);数码管驱动模块包括数码管功能控制进程、数码管循环控制进程和一个32bit计数器。
由于FPGA的VHDL代码较长,见附录中实验1的FPGA完整代码。
图1.4为FPGA程序结构图。
图1.4FPGA程序结构图
a)时钟分频
FPGA硬件系统接的时钟频率是48MHz,在程序中要对其进行分频。
通过两次分频得到频率为10KHz和1Hz的时钟。
10KHz主要用于LED和数码管的动态扫描;1Hz的时钟用于LED和数码管的循环功能。
b)LED功能控制模块
标号为pul_s1、pul_s2、pul_s3和pul_s4的用于对LED的控制。
pul_s2和pul_s1组成2位二进制数用于表示LED实现何种功能;pul_s3用于计数值最大为32的计数器的触发控制,pul_s3每按下一次计数器计数值(LED_cnt)加1,用于指定LED的地址;pul_s4用于功能实现中子功能的选择。
四个脉冲开发和LED功能的关系如表1.1。
表1.1四个脉冲开关与LED功能对应关系
c)数码管功能控制模块
拨码开关4位串行信号在FPGA中转换成8位并行信号dip(7downto0)后用于控制数码管功能实现。
高四位dip(7downto4)用作功能状态位,可以实现16种功能,但在本程序中只设计了7种功能;低四位dip(3downto0)用于数码管段码控制;此外,数码管的其中两个功能是关于计数器counter的,8个数码管显示32位计数器加减计数,计数器每隔1秒加1或减1。
dip(7downto0)与数码管的功能如表1.2所示。
表1.2dip与数码管功能的关系
设计结果
因为这个实验分为CPLD设计和FPGA设计,故实验程序仿真也分为两部分。
1.CPLD仿真
图1.5黄颜色部分是8位拨码开关信号并串转换的波形,每个时钟上升沿是转换其中一位,每完成一次转换需要8个时钟周期;蓝颜色和淡粉色的部分分别是4位段码信号和3位位选信号的译码。
图1.5CPLD仿真波形1
图1.6是LED地址译码过程,每个时钟上升沿到来时将led_value的值赋给指定地址的LED,每完成一次需要32个时钟周期。
图1.6CPLD仿真波形2
2.FPGA仿真
图1.7是LED功能的仿真波形,包括全亮、全灭和循环移动的仿真波形。
图1.7LED功能仿真波形
图1.8至图1.11是数码管各个功能的仿真波形,具体功能见图下方的标注。
图1.8数码管76543210循环移动功能
图1.9数码管显示7(可设置)并循环移动
图1.10数码管显示32位16进制计数器
图1.11数码管静态显示FDB75310
设计总结
本次实验由于涉及到CPLD和FPGA的综合设计,所以花费的时间比较长。
其中CPLD的设计较为简单,基本是并串转换和译码之类的;而FPGA的设计相对来说复杂很多,主要是其包含了LED和数码管各种功能的设计。
在设计过程中,代码的设计看似逻辑正确,但在硬件上实现的时候结果却不是原本所期望的,比较深的感受是,一开始把LED和数码管循环控制的代码都放在LED、数码管功能控制进程中,但却不能实现循环功能,后来分别设计了一个LED和数码管的循环控制子进程,时钟选用1Hz,然后让其和主功能模块连接起来就达到预期的目标了。
设计二AD/DA控制及ChipScope使用
实验要求
•FPGA控制AD/DA双通道最高速度下工作
•学习ChipScope分析工具,并利用其观看AD或DA数字接口的数据
实验说明
本实验中用到的AD芯片AD9021和DA芯片AD9761都有两个通道(I通道和Q通道),用信号发生器产生两路不同(幅度、频率或波形不同)的信号分别接至AD9021的I通道和Q通道,AD9021的输出信号进入FPGA中经过相应处理传送到AD9761的输入端,经过AD9761数模转换处理之后得到两路模拟信号分别从I通道和Q通道输出,然后接至示波器的两个观测通道,观察波形。
整个系统的硬件结构图如图2.1所示。
图2.1系统硬件结构图
设计方案
在设计之前,首先要了解模数转换芯片AD9021和数模转换芯片AD9761的参数和工作原理,之后才能做进一步的设计。
1.AD9021与AD9761的简单介绍
a)模数转换芯片AD9021
AD9201是一个双通道、10-bitCMOS模数转换器(ADC),采样速度为
20MSPS。
图2.2给出了AD9021的功能框图,包括2个10-bit、20MSPS的ADC,2个输入缓存放大器,一个内部参考电压和复用的数字输出缓存器。
图2.2AD9021的功能框图
AD9201内部集成了2个ADC、2个模拟输入缓冲器、一个内部基准和基准缓冲器,以及一个输出复用器(multiplexer)。
2个ADC分别用I通道和Q通道来表示,它们在输入时钟的上升沿同时对各自的输入信号进行采样。
每个ADC都有自己的输出寄存器,寄存器的内容在输入时钟的上升沿更新。
两个ADC寄存器中的结果是通过SELECT信号来进行选择的,从图2.2中可以看出,SELECT为低电平时,选择Q通道输出;SELECT为高电平时,选择I通道输出。
图2.3AD9021时序图
b)数模转换芯片AD9761
AD9761是一种双通道、高速、10-bit的CMOS数模转换器(DAC),特别
适用于包括I路和Q路数字信息处理的宽带通信应用场合(例如扩频通信)。
AD9761集成了两个10-bit、40MSPS的DAC,两个2倍插值滤波器,一个参考电源和数字输入接口电路,如图2.4所示。
该器件支持两个输入通道,每个通道的数据率为20MSPS,经过两倍的插值,使得两个DAC同时输出最高达40MSPS的数据。
图2.4AD9761功能框图
图2.5给出了AD9761的工作时序图。
在DAC的输入数据线DB9~DB0上,I路和Q路数据交替输入。
SELECT为I路和Q路的选择信号,当SELECT为高电平时,输入数据送I路的DAC,当SELECT为低电平时,输入数据送Q路的DAC。
WRITE信号是写输入信号。
DAC的输入寄存器在WRITE的上升沿锁存数据。
CLOCK是时钟信号。
两个DAC的输出都在CLOCK的上升沿更新,同时数字滤波器分别读取各自的输入寄存器。
图2.5中,CLOCK的上升沿比WRITE的上升沿延迟tCINV,但CLOCK和WRITE也可以连接在一起。
图2.5AD9761功能框图
2.FPGA设计
简单介绍完AD9021和AD9671的功能和时序后,就可以进一步进行FPGA设计。
首先要考虑AD9021和AD9761的时钟问题,因为AD9201是一个双通道、10-bitCMOS模数转换器(ADC),采样速度为20MSPS,所以可以采用频率为20Mhz的时钟,AD9021的SELECT的频率也为20MHz,每个ADC都有自己的输出寄存器,寄存器的内容在输入时钟的上升沿更新,两个ADC寄存器中的结果是通过SELECT信号来进行选择的,从图2.3中可以看出,SELECT为低电平时,选择Q通道输出;SELECT为高电平时,选择I通道输出。
对于AD9761,时钟的频率可以选择为40MHz,因为AD9761集成了两个10bit、40MSPS的DAC,该器件支持两个输入通道,这样每个通道的数据率为20MSPS,经过两倍的插值,使得两个DAC同时输出最高达40MSPS的数据,同时AD9761的SELECT的输入也选择为20MHz的时钟。
由上述可知,在FPGA设计中需要用到频率分别为40MHz和20MHz的时钟,而FPGA选择的时钟频率为48MHz,需要对其分频或倍频。
在FPGA中添加一个IP核用于生成40MHz的时钟,IP核的参数设置如图2.6所示。
图2.6时钟IP核的参数设置
然后对生成的40MHz的时钟进行二分频便得到20MHz的时钟,其二分频代码如下。
process(clk40Mhz)
begin
ifclk40Mhz'eventandclk40Mhz='1'then
clk20Mhz<=not(clk20Mhz);
endif;
endprocess;
FPGA中对于各种输入信号设置如下。
ADC_CS<='0';
ADC_SLEEP<='0';
DAC_RST<='0';
ADC_CLOCK<=clk20Mhz;
ADC_SELECT<=clk20Mhz;
DAC_CLOCK<=clk40Mhz;
DAC_WRITE<=clk40Mhz;
DAC<=ADC;
DAC_SELECT<=clk20Mhz;
在硬件上验证设计的代码时,需要通过ChipScope来观测AD9021输出的信号,选择40MHz的时钟信号作为触发信号,要观测的信号如图2.7所示。
图2.7ChipScope观测的内部信号
设计结果
实验二的仿真波形如图2.8所示。
图2.8仿真波形
使用ChipScope观测到AD9021输出信号如图2.9所示。
图2.9ChipScope观测到的波形
实际中,用示波器观测到的波形如图2.10所示。
图2.10示波器观测到的波形
设计总结
这次实验中在使用48MHz时钟生成40MHz时钟时用到了IP核的设计,在利用IP核进行时钟分频或倍频时,得到的时钟较为稳定,不会出现时钟抖动的问题,同时还用到了元件例化的功能。
此外,AD9021和AD9671时钟频率的选择需要多注意,不然可能不会得到预期的结果。
设计三FPGA与DSP间的通信
实验要求
•DSP通过其EMIF接口与FPGA通信,因此一般情况下DSP为主,FPGA为从设备。
这样就要在FPGA内部(通过IPCore)构造一个存储设备或者逻辑接收电路,从而完成与DSP的通信
实验说明
FPGA作为存储器可以直接将其接口与DSP的EMIF连接,逻辑接收电路要通过EMIF相应的接口信号来完成数据的接收与发送,另外EMIF寄存器的设置直接影响通信各方的时序。
DM642DSP通过EMIF与FPGA相连,将FPGA作为DSP的外设。
设计平台中,所使用的EMIF接口信号包括:
外部地址线EA[3:
22]、数据线ED[0:
31]和控制线,硬件电路的连接原理图如图3.1所示。
图3.1DSP与FPGA的连接原理框图
因为DSP与FPGA之间并没有时钟的连接,所以它们的操作是异步的,即FPGA作为DSP的异步外设。
DSP的EMIF使用其内部的时钟来协调接口信号的时序,但FPGA只根据DSP传输过来的信号进行响应,不考虑任何时钟。
从图3.1可知,DM642的EMIF接口的地址线、数据线和控制线1首先通过
74LVT16245(U36)进行第一级缓冲,得到对应的地址线DC_A[3:
22]、数据
线DC_D[0:
31]和控制线2,再经过74LVCH162245(U71)进行第二级缓冲,
得到连接FPGA的地址线XDC_A[3:
22]、数据线XDC_D[0:
31]和控制线3。
由于数据线是双向传输,地址线和控制线是单向传输,所以缓冲器的控制信号也是不同的。
用于地址总线和控制总线的缓冲器(U37、U39、U72、74)的OE#管脚和DIR管脚接固定电位,保证单一的传输方向。
而用于数据总线的缓冲器(U36、U38、U71、73)的OE#管脚和DIR管脚由CPLDEPM7032AETC44(U42)给出的信号控制。
设计方案
因为实验设计的是DSP与FPGA之间的通信,故本次实验分为FPGA设计和DSP设计,具体设计如下。
1.FPGA设计
FPGA设计主要是在FPGA中设计一个作为DSP访问的外部存储器。
首先要弄清楚需要哪几种输入输出信号,这里在FPGA中设计一个具有16个存储单元而且数据宽度为16bit的存储器,16个存储单元需要4根地址线(0000..1111),16位数据宽度需要16根数据线,此外还需要片选信号、读信号和写信号各1位,这样总共占用23根连线。
此外需要注意的是,在FPGA中设计的存储器的“读”信号一定要来自DSP的读控制信号对应的管脚上。
为了在DSP中判断FPGA中的存储器是否能正确写入,在FPGA写代码模块中将每个读出的数据与16位二进制数据1111111100000000相加,然后再观察DSP读出的数据是否作了上述的改变。
FPGA中数据读写的进程代码如下:
process(addr,cs,rd,wr)
begin
ifcs='0'then
ifwr='0'then
caseaddris
when"0000"=>d0<=data;
when"0001"=>d1<=data;
when"0010"=>d2<=data;
when"0011"=>d3<=data;
when"0100"=>d4<=data;
when"0101"=>d5<=data;
when"0110"=>d6<=data;
when"0111"=>d7<=data;
when"1000"=>d8<=data;
when"1001"=>d9<=data;
when"1010"=>da<=data;
when"1011"=>db<=data;
when"1100"=>dc<=data;
when"1101"=>dd<=data;
when"1110"=>de<=data;
when"1111"=>df<=data;
whenothers=>null;
endcase;
elsifrd='0'then
caseaddris
when"0000"=>data<=d0+"1111111100000000";
when"0001"=>data<=d1+"1111111100000000";
when"0010"=>data<=d2+"1111111100000000";
when"0011"=>data<=d3+"1111111100000000";
when"0100"=>data<=d4+"1111111100000000";
when"0101"=>data<=d5+"1111111100000000";
when"0110"=>data<=d6+"1111111100000000";
when"0111"=>data<=d7+"1111111100000000";
when"1000"=>data<=d8+"1111111100000000";
when"1001"=>data<=d9+"1111111100000000";
when"1010"=>data<=da+"1111111100000000";
when"1011"=>data<=db+"1111111100000000";
when"1100"=>data<=dc+"1111111100000000";
when"1101"=>data<=dd+"1111111100000000";
when"1110"=>data<=de+"1111111100000000";
when"1111"=>data<=df+"1111111100000000";
whenothers=>null;
endcase;
else
data<="ZZZZZZZZZZZZZZZZ";
endif;
else
data<="ZZZZZZZZZZZZZZZZ";
endif;
endprocess;
2.DSP设计
DSP通过EMIF接口对FPGA中的存储器进行访问。
从硬件电路的连接关系可知,FPGA处于DSP的CE2空间,其首地址为0xA0000000.通过向改地址写入20位数据(低4位为地址,高16位为数据),可实现DSP向FPGA中存储器写入的操作。
读数据时,先给出地址(低4位),然后再读出。
首先要设置DSP相关寄存器,根据DSP中控制寄存器的地址分配,对相应的控制寄存器作如下定义:
#defineEMIFA_GBLCTL0X01800000//EMIFA全局控制
#defineEMIFA_CE2CTL0X01800010//EMIFACE2空间控制寄存器
#defineEMIFA_CE2SCE0X01800050//EMIFACE2辅助控制寄存器
#defineADDRESS0XA0000000//选择CE2:
0xA0000000
根据DSPEMIFA手册,在程序中可以对以上控制寄存器进行如下配置:
*(volatileu32*)EMIFA_GBLCTL=(u32)0x00010020;//把clk2打开
*(volatileu32*)EMIFA_CE2CTL=(u32)0XFFFFFF13;//16位异步对应通信2
*(volatileu32*)EMIFA_CE2SCE=(u32)0x00000002;
写函数代码如下,每次向存储器中写入一个16bit数据,总共写16次,第一次写入0x00ff,然后每次写入的数据是前一个数据减去0x0010,这样写入存储器中的数据依次为:
0x00ff、0x00ef、0x00df、0x00cf、0x00bf、0x00af、0x009f、0x008f、0x007f、0x006f、0x005f、0x004f、0x003f、0x002