下冰雹 · 2022年03月07日

【安路 EG4S20 版本】综合性实验设计与实现:实验15 高速ADC和DAC实验

实验15.1 高速ADC实验

实验设计目标

  1. 编写程序,使用FPGA驱动ADDA开发板上的ADC工作。

实验设计思路

本实验设计使用FPGA驱动10位并行AD芯片工作,将正弦模拟信号转化为数字信号,并由FPGA内部逻辑分析仪观察得到的数字信号的波形。与实验二类似,AD实验的关键在于编写AD芯片的驱动程序和正确接收AD采集器输出的并行数字信号。
本次使用的是并行AD是TI的THS1030。THS1030是10位并行AD转换芯片,工作频率最高30MHz,拥有10个数据输出引脚(AD_DATA[9:0]),一个时钟输入引脚(AD_CLK),和模拟信号输入。(ADDA板也可以选择MS9280版本,和THS1030性能相同,管脚兼容)
图3.1是该芯片的工作时序图。
image.png
图5.1 AD芯片工作时序图
可以看出,THS1030的工作比较简单,时钟输入后,数据经过流水线延时后即输出。我们只需要在驱动时钟的上升沿去读取ADC的输出数据就可以了。
对于所使用的ADDA开发板上的THS1030应用电路:
image.png
设定的输入范围为±2V,对应ADC的满量程输入为0-2V,因此输入电压Vin与输出码值Code之间的关系为:
Vin = 2 Code 2mV - 2V; 式(3.5)

功能模块图与输入输出引脚说明

在理解了上述AD采集过程及转换规律后,设计AD采样系统如图5.3所示,AD接收模块用于驱动AD芯片完成上述采集过程。AD转换得到的数字信号送给Chip Watcher观察,验证电压公式,并送给R-2R DAC转换为模拟信号。R-2R DA电路参考电压与THS1030不同,所以产生的波形幅度会有所不同。
image.png
图5.3 HSAD采样系统示意图

  1. CLK:50MHz的基准时钟信号输入。
  2. RSTn:系统复位输入信号,低电平有效。
  3. AD_Data:AD数据输入信号。与AD芯片的DATA OUT引脚相连。
  4. AD_Clk:FPGA内部分频产生的时钟信号,输出给ADC的时钟输入引脚。
  5. DA_Data:DA的数字信号输入,因为DA只有8位,故取AD_Data的高8位送给DA_Data。

程序设计

图5.5是截取自底层模块HSAD的部分代码:
image.png
图5.5 HSAD代码
○ 16-33:将输入50MHz时钟分频到500KHz驱动ADC采样时钟
○ 36:将ADC采集到的数值的高8位输出给板载R-2R DAC

FPGA管脚配置

以下是Anlogic FPGA的IO Constraint,CLK信号与开发板上的50MHz的晶振相连;RSTn信号接SW0;DA_A[7:0]分别送到R-2R电阻网络中。
set_pin_assignment { AD_Clk } { LOCATION = R5; IOSTANDARD = LVCMOS33; SLEWRATE = FAST; }
set_pin_assignment { AD_Data[0] } { LOCATION = N5; IOSTANDARD = LVCMOS33; }
set_pin_assignment { AD_Data[1] } { LOCATION = T12; IOSTANDARD = LVCMOS33; }
set_pin_assignment { AD_Data[2] } { LOCATION = R12; IOSTANDARD = LVCMOS33; }
set_pin_assignment { AD_Data[3] } { LOCATION = T9; IOSTANDARD = LVCMOS33; }
set_pin_assignment { AD_Data[4] } { LOCATION = R9; IOSTANDARD = LVCMOS33; }
set_pin_assignment { AD_Data[5] } { LOCATION = T7; IOSTANDARD = LVCMOS33; }
set_pin_assignment { AD_Data[6] } { LOCATION = T8; IOSTANDARD = LVCMOS33; }
set_pin_assignment { AD_Data[7] } { LOCATION = T5; IOSTANDARD = LVCMOS33; }
set_pin_assignment { AD_Data[8] } { LOCATION = T6; IOSTANDARD = LVCMOS33; }
set_pin_assignment { AD_Data[9] } { LOCATION = T4; IOSTANDARD = LVCMOS33; }
set_pin_assignment { CLK } { LOCATION = R7; IOSTANDARD = LVCMOS33; }
set_pin_assignment { RSTn } { LOCATION = A9; IOSTANDARD = LVCMOS33; }
set_pin_assignment { DA_Data[0] } { LOCATION = B14; IOSTANDARD = LVCMOS33; }
set_pin_assignment { DA_Data[1] } { LOCATION = B15; IOSTANDARD = LVCMOS33; }
set_pin_assignment { DA_Data[2] } { LOCATION = B16; IOSTANDARD = LVCMOS33; }
set_pin_assignment { DA_Data[3] } { LOCATION = C15; IOSTANDARD = LVCMOS33; }
set_pin_assignment { DA_Data[4] } { LOCATION = C16; IOSTANDARD = LVCMOS33; }
set_pin_assignment { DA_Data[5] } { LOCATION = E13; IOSTANDARD = LVCMOS33; }
set_pin_assignment { DA_Data[6] } { LOCATION = E16; IOSTANDARD = LVCMOS33; }
set_pin_assignment { DA_Data[7] } { LOCATION = F16; IOSTANDARD = LVCMOS33; }

实验结果

在验证实验时,ADDA开发板、EG4开发板和口袋仪器三者需要“共地”,使用口袋仪器的“信号源HSS或S1”向AD芯片送入正弦信号,板载R-2R DAC输出接口袋仪器的模拟输入端AIN1,口袋仪器的GND接ADDA开发板上的GND。
image.pngimage.png

  1. 图3.8是使用口袋仪器EPI-204系列产生的正弦信号的波形及参数说明。
    image.png
    图3.8 AD转换前的正弦信号
    AD的数据传到R-2R DA模块上,给口袋仪器显示。
    image.png
    图3.9 R-2R DAC输出的波形
  2. 图3.10是使用Chip Watcher观察到的经AD转换后的数据。通过式3.5换算,输入信号正好是±500mV的正弦波(可通过最大值633,最小值373换算)。
    image.png
    image.png
    图3.10 Chip Watcher数据观察

实验15.2 THS5651A波形产生实验

实验设计目标

在完成了实验3.1的基础上,使用ADDA集成板上的THS5651A与THS1030联动,完成DAC波形发生和ADC采集实验。

实验设计思路

DAC电路计算
对于ADDA开发板上的THS5651A电路来说,通过R27和内部VREF设定的DAC输出差分电流是IOUTA = 0mA-5mA,IOUTB = 5mA-0mA(这里IOUTA和IOUTB是差分对),具体的输出电流值由输入DAC的码值DA_Data[9:0](也即是下文中的Code)确定。IOUTA和IOUTB通过外部运放电路转化为单端电压。计算过程如下:
VOUTA = IOUTA RLOAD = Code/1024 5mA 200Ω = 1V Code/1024;
VOUTB = IOUTB RLOAD = (1024-Code)/1024 5mA 200Ω = 1V (1-Code/1024);
DAC_OUT = VOUTA - VOUTB = (2Code/1024 - 1) 1V * 2 (运放提供两倍放大)
image.png

实验过程

image.png
图3.2.1 实验整体框图
在此实验中,50MHz输入时钟通过PLL生成了ADC时钟和DAC时钟。ADC的采样时钟为40MHz(注意THS1030数据手册中额定的最高采样时钟为30MHz,如果波形出现毛刺,请降低采样频率试试),DAC的刷新时钟也为40MHz,在ADC和DAC的数据之间使用了一个FIFO来缓冲,避免跨时钟产生的数据毛刺。DAC的数据可以选择来自ADC采样的数值,也可以来自DDS IP核的输出。

功能模块图与输入输出引脚说明

该工程包含顶层模块ADDA与相位累加器模块、IP核PLL,FIFO,ROM等。图3.2.2是顶层原理图,整个工程的模块功能图参考图3.2.1即可。下面介绍一下顶层模块各主要引脚的功能:
image.png
图3.2.2 ADDA顶层文件原理图

  1. CLK:50MHz的基准时钟信号输入。
  2. RSTn:系统复位输入信号,低电平有效,硬件。
  3. ADC_DATA[9:0]:ADC的输出数据
  4. DAC_DATA[9:0]:输出给DAC的数据
  5. ADC_CLK:CLK经过PLL模块后产生的ADC驱动时钟,40MHz;
  6. DAC_CLK:CLK经过PLL模块后产生的DAC驱动时钟,40MHz;
  7. SW1:选择DAC的数据源于ADC数据(SW1为高)或DDS模块(SW1为低);

程序设计

  1. 图3.2.3是截取自顶层模块ADDA的代码,理解了此段程序则可以相应理解该模块的所有程序:
    image.png
    ○ 11 - 17:CLK经过PLL锁相环产生40MHz的ADC时钟和40MHz的DAC时钟;
    ○ 21 - 31:数据缓冲FIFO,写时钟是ADC时钟,读时钟是DAC时钟,ADC的数据在ADC时钟的驱动下进入FIFO,ADC2DAC的数据在DAC时钟的驱动下输出FIFO;
    ○ 34 - 48:DDS核,用于产生一个数字正弦信号,输出频率由KW确定;计算公式为:fout = Fs * KW/2^28;这里Fs即PLL输出的DAC_CLK,40MHz;
    ○ 51:通过SW1选择输出给DAC的数据来源;
    FPGA管脚配置
    set_pin_assignment { ADC_CLK } { LOCATION = R5; IOSTANDARD = LVCMOS33; SLEWRATE = FAST; }
    set_pin_assignment { ADC_DATA[0] } { LOCATION = N5; IOSTANDARD = LVCMOS33; }
    set_pin_assignment { ADC_DATA[1] } { LOCATION = T12; IOSTANDARD = LVCMOS33; }
    set_pin_assignment { ADC_DATA[2] } { LOCATION = R12; IOSTANDARD = LVCMOS33; }
    set_pin_assignment { ADC_DATA[3] } { LOCATION = T9; IOSTANDARD = LVCMOS33; }
    set_pin_assignment { ADC_DATA[4] } { LOCATION = R9; IOSTANDARD = LVCMOS33; }
    set_pin_assignment { ADC_DATA[5] } { LOCATION = T7; IOSTANDARD = LVCMOS33; }
    set_pin_assignment { ADC_DATA[6] } { LOCATION = T8; IOSTANDARD = LVCMOS33; }
    set_pin_assignment { ADC_DATA[7] } { LOCATION = T5; IOSTANDARD = LVCMOS33; }
    set_pin_assignment { ADC_DATA[8] } { LOCATION = T6; IOSTANDARD = LVCMOS33; }
    set_pin_assignment { ADC_DATA[9] } { LOCATION = T4; IOSTANDARD = LVCMOS33; }
    set_pin_assignment { CLK } { LOCATION = R7; IOSTANDARD = LVCMOS33; }
    set_pin_assignment { DAC_CLK } { LOCATION = T15; IOSTANDARD = LVCMOS33; SLEWRATE = FAST; }
    set_pin_assignment { DAC_DATA[0] } { LOCATION = T13; IOSTANDARD = LVCMOS33; SLEWRATE = FAST; }
    set_pin_assignment { DAC_DATA[1] } { LOCATION = M6; IOSTANDARD = LVCMOS33; SLEWRATE = FAST; }
    set_pin_assignment { DAC_DATA[2] } { LOCATION = P5; IOSTANDARD = LVCMOS33; SLEWRATE = FAST; }
    set_pin_assignment { DAC_DATA[3] } { LOCATION = P6; IOSTANDARD = LVCMOS33; SLEWRATE = FAST; }
    set_pin_assignment { DAC_DATA[4] } { LOCATION = N6; IOSTANDARD = LVCMOS33; SLEWRATE = FAST; }
    set_pin_assignment { DAC_DATA[5] } { LOCATION = M7; IOSTANDARD = LVCMOS33; SLEWRATE = FAST; }
    set_pin_assignment { DAC_DATA[6] } { LOCATION = L7; IOSTANDARD = LVCMOS33; SLEWRATE = FAST; }
    set_pin_assignment { DAC_DATA[7] } { LOCATION = R14; IOSTANDARD = LVCMOS33; SLEWRATE = FAST; }
    set_pin_assignment { DAC_DATA[8] } { LOCATION = T14; IOSTANDARD = LVCMOS33; SLEWRATE = FAST; }
    set_pin_assignment { DAC_DATA[9] } { LOCATION = R15; IOSTANDARD = LVCMOS33; SLEWRATE = FAST; }
    set_pin_assignment { RSTn } { LOCATION = A9; IOSTANDARD = LVCMOS33; }
    set_pin_assignment { SW1 } { LOCATION = A10; IOSTANDARD = LVCMOS33; }

    实验结果

    硬件连接图:
    image.png

  2. AD输入接口袋仪器的信号源输出,DA输出接口袋仪器的示波器输入,DA数据来源选择来自ADC的输出;可以看到输入10K,1Vpp,输出也是10K,1Vpp.
    image.png
  3. DA输出接AD输入同时送给口袋仪器的示波器观察,DA数据来源选择来自DDS;
    image.png

思考

  1. 修改PLL模块,产生不同的ADC和DAC驱动时钟,观察在不同DAC时钟频率下DDS模块输出频率的改变;
  2. 修改KW值,产生不同频率的正弦信号。

END

文章来源:https://www.yuque.com/yingmuketang/01/ci9w4q

推荐内容

更多内容请关注走进FPGA专栏
推荐阅读
关注数
1615
内容数
27
本专栏将以【安路EG4S开发板】为例,从基础板卡信息及使用教程,基础实验设计与实现及综合性实验设计与实现带大家学习FPGA。
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息