通信与电子系统综合设计实验报告6系.docx

上传人:b****8 文档编号:9571885 上传时间:2023-02-05 格式:DOCX 页数:23 大小:449.68KB
下载 相关 举报
通信与电子系统综合设计实验报告6系.docx_第1页
第1页 / 共23页
通信与电子系统综合设计实验报告6系.docx_第2页
第2页 / 共23页
通信与电子系统综合设计实验报告6系.docx_第3页
第3页 / 共23页
通信与电子系统综合设计实验报告6系.docx_第4页
第4页 / 共23页
通信与电子系统综合设计实验报告6系.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

通信与电子系统综合设计实验报告6系.docx

《通信与电子系统综合设计实验报告6系.docx》由会员分享,可在线阅读,更多相关《通信与电子系统综合设计实验报告6系.docx(23页珍藏版)》请在冰豆网上搜索。

通信与电子系统综合设计实验报告6系.docx

通信与电子系统综合设计实验报告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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > IT计算机 > 计算机软件及应用

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1