一、案例说明
此开发案例基于创龙Kintex-7+C6678评估板TL6678F-EasyEVM进行。
二、案例框图
三、案例演示
硬件连接:
参考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端
参考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根据振幅图计算的输入频率。
四、关键代码说明
例程管脚约束文件位于TL6678F-EasyEVM评估板光盘Vivado工程“src\constraints”目录下。
2. FPGA端的代码
顶层文件tl_fmc_ad9613_srio.v的主要功能:
可以查看生成的RTL原理图:
3. DSP端的代码
(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如下:
1. Select IO IP核配置说明
参考TL6678F-EasyEVM评估板光盘tl-fmc-ad9613例程的IP核与模块介绍章节。
2. SRIO IP配置说明
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》。
3. data_to_srio RTL模块功能
双击block degin中的模块,可配置:
Doorb Triger Threshold: 门铃触发阈值,本例设置为16384Bytes = 16KB,即通过SRIO发送16KB的数据后就发送一个DOORBELL信息。
Srio Doorb info1:发送完Doorb Triger Threshold个字节的数据之后发送的门铃信息。
Srio Doorb info2:发送完2倍的Doorb Triger Threshold个数据之后发送的门铃信息。
Srio Target Addr:SRIO Target的内存地址。(本例设置的为DSP的MSMC地址0x0C3F0000)
Srio Target Id:SRIO Target的ID。
Srio Local Id:SRIO Iitiator的ID。
代码解释:
配置FIFO大小为36 Byte,读写数据的位宽为64bit(FIFO深度为512)。ALMOST_EMPTY_OFFSET和ALMOST_FULL_OFFSET配置为0x20,即32;即当FIFO写入数据个数大于32个,ALMOST_FULL输出高电平。
本例FIFO设置位宽为64bit,所以64bit * 32 / 8 = 256 Byte,即当FIFO写入数据大于256 Byte,ALMOST_FULL会输出高电平。
因为SRIO的package最大有效数据为256 Byte,为了确保SRIO能传输完整的数据包,所以设置FIFO的门限值为256Byte.
FIFO原语详细说明请查阅:《ug473_7Series_Memory_Resources.pdf》。
其中wr_cnt为一个1bit,计数只有0和1两个值。
HELLO包头拼接:
本例设置的TOTAL_DATA_SIZE为32KByte,即每发送16KByte的数据包之后发送一个门铃信息。