实验15.1 高速ADC实验
实验设计目标
- 编写程序,使用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是该芯片的工作时序图。
图5.1 AD芯片工作时序图
可以看出,THS1030的工作比较简单,时钟输入后,数据经过流水线延时后即输出。我们只需要在驱动时钟的上升沿去读取ADC的输出数据就可以了。
对于所使用的ADDA开发板上的THS1030应用电路:
设定的输入范围为±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不同,所以产生的波形幅度会有所不同。
图5.3 HSAD采样系统示意图
- CLK:50MHz的基准时钟信号输入。
- RSTn:系统复位输入信号,低电平有效。
- AD_Data:AD数据输入信号。与AD芯片的DATA OUT引脚相连。
- AD_Clk:FPGA内部分频产生的时钟信号,输出给ADC的时钟输入引脚。
- DA_Data:DA的数字信号输入,因为DA只有8位,故取AD_Data的高8位送给DA_Data。
程序设计
图5.5是截取自底层模块HSAD的部分代码:
图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。
- 图3.8是使用口袋仪器EPI-204系列产生的正弦信号的波形及参数说明。
图3.8 AD转换前的正弦信号
AD的数据传到R-2R DA模块上,给口袋仪器显示。
图3.9 R-2R DAC输出的波形 - 图3.10是使用Chip Watcher观察到的经AD转换后的数据。通过式3.5换算,输入信号正好是±500mV的正弦波(可通过最大值633,最小值373换算)。
图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 (运放提供两倍放大)
实验过程
图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即可。下面介绍一下顶层模块各主要引脚的功能:
图3.2.2 ADDA顶层文件原理图
- CLK:50MHz的基准时钟信号输入。
- RSTn:系统复位输入信号,低电平有效,硬件。
- ADC_DATA[9:0]:ADC的输出数据
- DAC_DATA[9:0]:输出给DAC的数据
- ADC_CLK:CLK经过PLL模块后产生的ADC驱动时钟,40MHz;
- DAC_CLK:CLK经过PLL模块后产生的DAC驱动时钟,40MHz;
- SW1:选择DAC的数据源于ADC数据(SW1为高)或DDS模块(SW1为低);
程序设计
图3.2.3是截取自顶层模块ADDA的代码,理解了此段程序则可以相应理解该模块的所有程序:
○ 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; }实验结果
硬件连接图:
- AD输入接口袋仪器的信号源输出,DA输出接口袋仪器的示波器输入,DA数据来源选择来自ADC的输出;可以看到输入10K,1Vpp,输出也是10K,1Vpp.
- DA输出接AD输入同时送给口袋仪器的示波器观察,DA数据来源选择来自DDS;
思考
- 修改PLL模块,产生不同的ADC和DAC驱动时钟,观察在不同DAC时钟频率下DDS模块输出频率的改变;
- 修改KW值,产生不同频率的正弦信号。
END
文章来源:https://www.yuque.com/yingmuketang/01/ci9w4q
推荐内容
- 【安路 EG4S20 版本】基础板卡信息及使用教程:芯片和板卡简介
- 【安路 EG4S20 版本】基础板卡信息及使用教程:第一工程
- 【安路 EG4S20 版本】基础板卡信息及使用教程:使用ChipWatcher
- 【安路 EG4S20 版本】基础板卡信息及使用教程:使用Modelsim
- 【安路 EG4S20 版本】基础实验设计与实现:实验1 流水灯
- 【安路 EG4S20 版本】基础实验设计与实现:实验2 集成逻辑门及其基本应用
- 【安路 EG4S20 版本】基础实验设计与实现:实验3 译码器 编码器
- 【安路 EG4S20 版本】基础实验设计与实现:实验4 数据选择器
- 【安路 EG4S20 版本】基础实验设计与实现:实验5 触发器
- 【安路 EG4S20 版本】基础实验设计与实现:实验6 加法计数器
- 【安路 EG4S20 版本】基础实验设计与实现:实验7 抢答器
- 【安路 EG4S20 版本】基础实验设计与实现:实验8 功能数字钟
- 【安路 EG4S20 版本】基础实验设计与实现:实验9 矩阵键盘
- 【安路 EG4S20 版本】基础实验设计与实现:实验10 二进制转BCD码
- 【安路 EG4S20 版本】综合性实验设计与实现:实验11 PWM
- 【安路 EG4S20 版本】综合性实验设计与实现:实验12 DA及DDS
- 【安路 EG4S20 版本】综合性实验设计与实现:实验13 FPGA内部AD多通道采样实验
- 【安路 EG4S20 版本】综合性实验设计与实现:实验14 UART串行通信
更多内容请关注走进FPGA专栏