RFSoC4x2 DDR编程生成DAC采样:代码合理性及功能验证咨询
FPGA编程问题:DAC驱动代码逻辑合理性咨询
我正在开发一个通过向DDR写入采样数据来驱动DAC输出信号的程序:先在Vivado中完成Block Diagram设计(附XSA、TCL、BD的PDF文件),生成XSA文件后在Vitis中使用,找到一段标称可生成1.5GHz DAC输出的代码。现咨询:这段代码逻辑是否合理?能否正确向DDR写入采样数据以让DAC输出对应电压?希望得到关于该代码的反馈。我已学习代码逻辑,预期它能实现软件控制DAC输出电压。
代码内容
#include "xparameters.h" #include "xil_printf.h" #include "xaxidma.h" #include "xil_cache.h" #include <stdint.h> #include <math.h> /* AXI DMA device ID from xparameters.h */ #define DMA_DEV_ID XPAR_AXIDMA_0_DEVICE_ID /* Baseband sample rate into the DAC DUC: 400e6 * 8 = 3.2e9 samples/s */ #define FS_BB_HZ 3200000000.0f /* Desired RF tone (Zone-1) */ #define TONE_HZ 1500000000.0f /* 1.5 GHz */ /* Number of 16-bit samples in the repeating buffer (multiple of 8) */ #define N_SAMPLES 4096 /* Amplitude as fraction of full-scale (0.0..0.95). Start ~0.5 */ #define AMP_FS 0.5f static int16_t TxBuf[N_SAMPLES] __attribute__((aligned(64))); static XAxiDma AxiDma; static void make_tone(void) { /* Choose an integer FFT bin so the buffer repeats seamlessly. For Fs=3.2e9 and N=4096, bin spacing is 781250 Hz; 1.5 GHz => k=1920. */ const float k = roundf(TONE_HZ * (float)N_SAMPLES / FS_BB_HZ); const float w = 2.0f * (float)M_PI * k / (float)N_SAMPLES; const float A = AMP_FS * 32767.0f; for (int n = 0; n < N_SAMPLES; ++n) TxBuf[n] = (int16_t)lrintf(A * sinf(w * n)); } int main(void) { xil_printf("\r\n[RFSoC DAC] 1.5 GHz tone via AXI-DMA (MM2S)\r\n"); XAxiDma_Config *cfg = XAxiDma_LookupConfig(DMA_DEV_ID); if (!cfg) { xil_printf("DMA cfg not found\r\n"); return -1; } if (XAxiDma_CfgInitialize(&AxiDma, cfg) != XST_SUCCESS) { xil_printf("DMA init failed\r\n"); return -1; } if (XAxiDma_HasSg(&AxiDma)) { xil_printf("This app expects SIMPLE mode DMA\r\n"); return -1; } make_tone(); const int bytes = N_SAMPLES * (int)sizeof(TxBuf[0]); /* multiple of 16 bytes */ while (1) { Xil_DCacheFlushRange((INTPTR)TxBuf, bytes); if (XAxiDma_SimpleTransfer(&AxiDma, (UINTPTR)TxBuf, bytes, XAXIDMA_DMA_TO_DEVICE) != XST_SUCCESS) { xil_printf("DMA submit failed\r\n"); return -1; } while (XAxiDma_Busy(&AxiDma, XAXIDMA_DMA_TO_DEVICE)) { } } return 0; }
代码逻辑分析
合理设计点
- 无缝波形生成:
make_tone函数通过计算整数FFT索引k,确保生成的正弦波缓冲区首尾相位连续,循环输出时不会产生信号杂散。计算逻辑k = roundf(TONE_HZ * N_SAMPLES / FS_BB_HZ)保证1.5GHz信号是3.2GHz基带采样率的整数分频倍数,完全匹配循环输出的要求。 - DMA流程规范:
- 正确完成DMA的配置查找与初始化流程,且校验了DMA工作在Simple模式,符合代码的设计预期。
- 调用
Xil_DCacheFlushRange刷新数据缓存,确保DMA能读取到最新的波形数据,避免缓存一致性问题。 - 循环发起DMA传输并等待完成,保证持续向DAC提供数据。
- 内存对齐优化:
TxBuf做64字节对齐,符合AXI总线突发传输的对齐要求,能提升DMA传输效率,避免因对齐错误导致的传输异常。
需验证/优化的点
- 硬件通路匹配:代码依赖AXI DMA(MM2S方向)到DAC的硬件连接,需确认Block Diagram中:
- DMA的MM2S端口是否正确连接到DAC IP核的数据源接口。
- DAC IP核的插值倍数、采样率配置是否与代码中
FS_BB_HZ = 3.2e9的注释(400MHz×8插值)一致。
- 传输连续性:当前代码等待单次DMA完成后再发起下一次,在3.2GHz高采样率下可能出现传输间隙,导致DAC输出断流。可考虑启用DMA循环模式(硬件支持的话),或采用双缓冲区交替传输来保证连续性。
- 数据格式匹配:代码生成16位有符号整数,需确认DAC IP核预期的数据格式(如补码格式、位宽是否匹配),否则会导致输出电压异常。
- 时钟同步:需确保DMA、DAC、DDR的时钟域同步,且时钟频率满足3.2GHz基带采样率的要求,否则会出现数据丢失或采样率错误。
结论
代码本身的核心逻辑是合理的,波形生成和DMA传输流程符合AXI DMA驱动DAC的基本规范。但能否正确输出1.5GHz信号,还需结合硬件设计的正确性(Block Diagram连接与配置)、时钟同步、数据格式匹配等因素综合验证。
内容的提问来源于stack exchange,提问作者user451625
相关产品推荐
相关产品推荐

