找回密码
 注册
关于网站域名变更的通知
查看: 243|回复: 2
打印 上一主题 下一主题

FPGA+DSP的高速AD采集处理开发详解

[复制链接]
  • TA的每日心情
    奋斗
    2020-3-25 15:17
  • 签到天数: 1 天

    [LV.1]初来乍到

    跳转到指定楼层
    1#
    发表于 2020-6-17 10:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

    EDA365欢迎您登录!

    您需要 登录 才可以下载或查看,没有帐号?注册

    x
    本帖最后由 Tronlong小分队 于 2020-6-17 10:52 编辑 & J9 ]9 e8 r( m) O8 f2 d7 Y7 u( a

    6 j/ z( K, r. u  L. V% @
    一、案例说明
    • Kintex-7 FPGA使用SRIO IP核作为Initiator,通过AD9613模块采集AD数据。AD9613采样率为250MSPS,双通道12bit,12bit按照16bit发送,因此数据量为16bit * 2 * 250M = 8Gbps;
    • AD数据通过SRIO由Kintex-7发送到C6678 DSP(Target)的0x0C3F0000~0x0C3F7FFF的地址空间,数据量为32KByte,使用SWRITE方式,期间每传16KByte数据后就发送一个DOORBELL信息,让C6678做乒乓处理。Kintex-7通过SRIO与C6678连接,共4个lane,每个lane的通信速率为5Gbps,数据有效带宽为20Gbps * 80% = 16Gbps;
    • 采集到的AD数据可分别通过Xilinx Vivado和TI CCS软件查看波形,并在C6678做FFT处理。
      + s3 Z5 t# k) V8 e# c4 s/ e( }
    此开发案例基于创龙Kintex-7+C6678评估板TL6678F-EasyEVM进行。
    二、案例框图
    三、案例演示
    硬件连接
    8 r( x) L0 D, g( C/ T% x. v$ `( Q
    • 将创龙AD9613高速AD模块TL9613/9706F(此模块集成高速DA,DA芯片为AD9706)通过FMC接口与评估板连接。. i6 v3 G6 |9 S' @: F9 _: o

    ! C3 n* U9 I! n# j" C
    • 信号发生器设置成两路正弦波输出,幅度设置:1.5Vpp以及无直流偏置,频率设置:1MHz。
    • 信号发生器的两路输出分别连接到模块的ADC_CHA、ADC_CHB。
      & [) [% B. Q& }7 k+ i
    3 E: J/ P+ o% o) K
    点击查看:AD采集处理案例视频
    " t+ s% i' K$ }4 T1 j' U
    • FPGA端; Z( P" @# j! h" o4 W
    参考TL6678F-EasyEVM评估板光盘用户手册《基于下载器的程序固化与加载》文档中“Vivado下bit文件加载步骤”章节,将tl_fmc_ad9613_srio_tl6678f_xc7k325t.bit文件烧录到FPGA。烧写bit文件时,指定调试文件tl_fmc_ad9613_srio_tl6678f_xc7k325t.ltx,可以观察到ILA调试信号,查看ADC采样波形。
    ADC两路信号tl_fmc_ad9613_srio_bd_i/xlslice_l_Dout[11:0]
    和tl_fmc_ad9613_srio_bd_i/xlslice_l_Dout[11:0]在ILA内嵌逻辑分析仪中均设置为有符号数、模拟波形显示,如下图所示:
    ILA触发抓取两路ADC采样波形,如下图所示(两路正弦波形):
    2. DSP端
    7 B1 U3 j; k  e4 B5 |+ e
    参考TL6678F-EasyEVM评估板光盘用户手册《CCS工程的生成与加载》文档,在“tl-fmc-ad9613-srio/DSP/src”目录下建立CCS工程并导入到CCS软件中编译生成tl-srio-fft.out文件,通过仿真器加载tl-srio-fft.out文件到DSP端。将tl-srio-fft.out下载到C6678 Core0 ~ Core7核中,在tl-srio-fft.c窗口中红色框标注的地方创建breakpoint,使DSP程序运行后能暂停,如下图所示:
    因为Core0负责系统初始化,为确保其他核跟Core0是同步开始传输,所以Core0核最后运行(Core0核可查看原始波形以及振幅波形,其他核仅可查看原始波形)。运行程序,DSP程序正常暂停,可通过图像波形形式查看数据,使用Graph工具,输入下述配置,查看Channel A波形数据。
    输入下图配置,查看Channel A经过FFT振幅波形。
    若出现波形显示不正常或没有波形产生,请参考以下操作:
    1.请确保已正常加载GEL文件。
    2.请确保Breakpoint设置成功,DSP程序能够暂停。
    3.请硬件断电重启后重新烧写FPGA和DSP程序。
    频率计算:
    FFT变换点数N=512,AD采样率Fs为250MSPS。某点n所表示的频率为:Fn=n*(Fs/N) (n >=0)。当n=0时,Fn为0,因为第一点表示的是直流分量,所以频率为0,幅值也为0,因为该正弦波没有直流分量。
    从上面的FFT振幅波形图中可以看出,Channel A在第6个点处有信号,所以对应的频率为Fn = 6 * (Fs/N) = 6 * 250MHz / 512 = 2.9296875 MHz。对应原始信号3MHz。
    此处存在误差,目前采样点为512个,一个点表示Fs/N= 488.281KHZ,所以如果需要提高精度,用户可以提高采样点。
    通过查看串口输入数据,也可查看处理结果。其中peak point代表振幅图峰值点横坐标;amplitude代表振幅图幅值;input frequency根据振幅图计算的输入频率。
    四、关键代码说明
    • 管脚约束
      ' p) ?+ {! p5 q; |9 x
    例程管脚约束文件位于TL6678F-EasyEVM评估板光盘Vivado工程“src\constraints”目录下。
    2.​​​​​​​​​​​​​​​​​​​​​​​​​​​ FPGA端的代码+ A0 a# S9 {2 Q( [- Z- \: ]
    顶层文件tl_fmc_ad9613_srio.v的主要功能:
    • 端口定义。
      4 g; g! f$ m6 o+ t" ^" X
    • 使用STARTUPE2原语提供的EOS作为系统复位信号,使用STARTUPE2原语提供的内部65MHz时钟CFGMCLK作为系统时钟。$ b7 D' B( K; v$ ^5 P/ p3 |1 F
    ​​​​​​​
    * G- T2 W3 M/ d" I& e  O
    • 配置时钟芯片,输出125MHz的参考时钟为SRIO IP核。$ R" P  d+ S8 d; E. q! N' d! o2 |
    ​​​​​​​
    9 E( `; j2 C6 o2 c" L
    • 调试Block design。
      " C+ Q6 F% ^+ s0 T% ~
    ​​​​​​​1 E. ?$ Q+ I  c
    可以查看生成的RTL原理图:6 O" X1 ~9 ]8 J0 d  M/ _
    - ]! S. h& V- j% f; M
    ​​​​​​​ 3. DSP端代码! ?2 O* N% Z- L( m# B7 W
    (1)main函数初始化srio子系统,hwi中断注册。
    (2)srio_db_isr响应srio doorbell中断,以邮箱方式通知Core0 ~ Core7核同时进行FFT运算。
    (3)tl_srio_fft任务等待邮箱信号,Core0 ~ Core7核同时进行FFT运算。
    (4)tl_fft_amplitude任务等待信号量置位,Core0核进行FFT振幅运算,通过串口打印数据处理结果。
    五、Block Design说明
    Block Design如下:

    & e1 w% D" {( ~- d; x1. Select IO IP核配置说明
    / O. |! ?: y- X. [( z! g; v) n$ [参考TL6678F-EasyEVM评估板光盘tl-fmc-ad9613例程的IP核与模块介绍章节。
    / q3 M0 K2 \' {1 ]+ c" W2. SRIO IP配置说明
    , ]* {8 v5 }& z
    SRIO链路宽度设置为4个lane,通信频率为5Gbps(即每个lane均为5Gbps),参考时钟为125MHz;设置8bit位宽的ID,且ID=0xFF。
    Port I/O Style选择为Initiator/Target模式,其中Condensed I/O接收和发送均使用一个AXI4-Stream通道,Initiator/Target接收和发送采用不同的AXI4-Stream通道。
    I/O Format:I/O端口配置使用HELLO格式包。
    其他参数保持保持默认值即可。
    更详细说明请查阅IP核手册:《pg007_srio_gen2.pdf》。+ r/ x7 G; @5 ?# d9 q% U; Z
    3. data_to_srio RTL模块功能
    8 X7 C* `% q% {/ S: `9 ]8 {# e7 R, ~6 @" s8 K6 c5 q

    3 P9 R5 R% {2 Z. \
    • 连续不停地将AD9613采集的数据写入FPGA FIFO。
    • 控制FIFO读操作,每次从FIFO读取完指定的数据并通过AXI4-stream接口传输到SRIO IP。其中本例程每发送16KByte的数据就发送一个DOORBELL信息,通知DSP(Target)对数据进行处理。& X$ S+ z3 g& e9 P0 N
    ​​​​​​​
    3 k6 V5 x# [; n7 K: [双击block degin中的模块,可配置:
    3 a( V7 }- l( |+ E2 zDoorb Triger Threshold:门铃触发阈值,本例设置为16384Bytes = 16KB,即通过SRIO发送16KB的数据后就发送一个DOORBELL信息。
    4 B% O9 `. P0 C- ]$ ESrioDoorb info1发送完Doorb Triger Threshold个字节的数据之后发送的门铃信息。) j2 Q4 J4 W6 x* N8 @. N1 H
    Srio Doorb info2发送完2倍的Doorb Triger Threshold个数据之后发送的门铃信息。8 p5 o' s5 @6 ]) d. O9 `7 z
    Srio Target AddrSRIO Target的内存地址。(本例设置的为DSP的MSMC地址0x0C3F0000)
    + J- W& K3 U+ }% {$ VSrio Target IdSRIO Target的ID。
    : {: d- a7 N8 `/ c" X2 `
    Srio Local IdSRIO Iitiator的ID。
    代码解释:
    7 p: E5 H! T) E; h, l, T
    • 端口定义0 g- S; T- l+ s. l3 S8 l8 q
    ​​​​​​​​​​​​​​
    0 k, `) a' W+ z. D( `! y% g, Q$ A, t" l
    • FIFO原语。+ w" j& M: D* W) l  h
    配置FIFO大小为36 Byte,读写数据的位宽为64bit(FIFO深度为512)。ALMOST_EMPTY_OFFSET和ALMOST_FULL_OFFSET配置为0x20,即32;即当FIFO写入数据个数大于32个,ALMOST_FULL输出高电平。, i3 J6 v: j  o1 c' @9 k8 Q
    本例FIFO设置位宽为64bit,所以64bit * 32 / 8 = 256 Byte,即当FIFO写入数据大于256 Byte,ALMOST_FULL会输出高电平。! q1 {0 p# R* ?$ L% R1 ]8 E
    因为SRIO的package最大有效数据为256 Byte,为了确保SRIO能传输完整的数据包,所以设置FIFO的门限值为256Byte.
    8 m. k/ d4 X3 |) S) `- u) i+ H0 t7 D! G/ D" e# r2 y2 E$ z
    FIFO原语详细说明请查阅:《ug473_7Series_Memory_Resources.pdf》。+ k& L9 C2 d" y
    • FIFO写控制
        K& _. t% q4 s, C
    • 因为AD9613输出的AD数据为双通道的24bit,所以分别将两个通道的数据补成16bit。然后保存到data_in_store中。
    • 因为FIFO的位宽64bit,而上个步骤将AD的双通道数据补成了32bit,所以每存够两个32bit的AD数据,凑成64bit的data_in_store,再使能fifo_wr_en信号,把64bit的数据写入FIFO。
    • 后写入的数据存在高32位,发送到SRIO Target端(DSP),方便其按顺序处理数据。
      2 u4 W% \+ Q; r# f0 Y& o: r0 F( F! `
    ​​​​​​​
    - O/ E- S8 x8 k6 Y. N其中wr_cnt为一个1bit,计数只有0和1两个值。
    6 Z0 e1 O9 j- D
    • 读取FIFO数据并打包HELLO格式发送数据。
      0 [4 q0 O# i+ x, x8 a
    . j! u, g5 ^) m" Q8 h& T* Q; S8 O

    1 M" S# E% Q3 I- J" u: q% Z
    HELLO包头拼接:
    • 发送门铃
      2 E! D1 g6 G7 d# Y
    ​​​​​​​. X. e( {( W* ^* q7 K7 \' M& [
    • 状态切换+ U8 q0 ]$ ?2 n" t: p# T
    ​​​​​​​5 C- F, a9 G. r+ j$ l* f
    本例设置的TOTAL_DATA_SIZE为32KByte,即每发送16KByte的数据包之后发送一个门铃信息。
    六、资料下载
    点击可获得本案例源码及TL6678F-EasyEVM评估板详细资料

    % ]$ a! ?  J4 M$ J  O( G+ V7 ]- g% m' l+ d: c

    该用户从未签到

    2#
    发表于 2020-6-17 14:25 | 只看该作者
    很实用的分享

    该用户从未签到

    3#
    发表于 2020-6-17 16:23 | 只看该作者
    谢谢分享,学习了
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-10-13 09:56 , Processed in 0.125000 second(s), 23 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表