AD9361纯逻辑FPGA驱动,单音信号收发例程,可动态配置9361,verilog代码,Vi...

张开发
2026/4/7 5:51:56 15 分钟阅读

分享文章

AD9361纯逻辑FPGA驱动,单音信号收发例程,可动态配置9361,verilog代码,Vi...
AD9361纯逻辑FPGA驱动单音信号收发例程可动态配置9361verilog代码Vivado 2019.1工程。搞AD9361纯FPGA驱动这事说难不难但没点骚操作还真容易踩坑。咱今天不整那些虚的理论直接撸起袖子干代码。先看收发链路的核心结构——这玩意儿就是个数据泵得在FPGA里用Verilog硬怼出来。收发通道的数据接口得跟紧AD9361的时钟节奏上代码always (posedge rx_clk or posedge reset) begin if(reset) begin rx_data_buffer 12d0; end else begin rx_data_buffer {rx_data_Q, rx_data_I}; // I/Q拼成24bit end end这里有个骚操作把12bit的I/Q信号拼成24bit总线后面接FIFO的时候能省一半带宽。注意rx_clk是从AD9361过来的随路时钟时序不对齐分分钟丢数据。动态配置这块必须上状态机不然SPI时序搞死人。看这个配置状态机的骨架parameter IDLE 3d0; parameter WRITE_CMD 3d1; parameter WAIT_ACK 3d2; always (posedge spi_clk) begin case(state) IDLE: if(config_en) begin spi_csn 1b0; spi_mosi cmd_buffer[23]; bit_cnt 5d23; state WRITE_CMD; end WRITE_CMD: if(bit_cnt 0) begin spi_mosi cmd_buffer[bit_cnt-1]; bit_cnt bit_cnt - 1; end else begin state WAIT_ACK; end // ...其他状态 endcase end注意cmd_buffer里塞的是[读写标志7位地址16位数据]的组合包。调试时用ILA抓这个信号能看到配置参数像坐过山车一样在变化。AD9361纯逻辑FPGA驱动单音信号收发例程可动态配置9361verilog代码Vivado 2019.1工程。单音发生器模块是验证收发的关键直接上DDS相位累加reg [31:0] phase_acc; always (posedge tx_clk) begin phase_acc phase_acc freq_ctrl_word; tx_data_I $signed(2047 * $sin(phase_acc[31:24] * 2 * $PI / 256)); tx_data_Q $signed(2047 * $cos(phase_acc[31:24] * 2 * $PI / 256)); end这里用相位截断法省资源实际测试发现相位噪声完全在可接受范围。freqctrlword直接关联到前面SPI配置的频率寄存器改个数值就能切频率。工程里最坑的是Vivado的时钟约束必须给AD9361的data clock加上creategeneratedclock约束不然时序报告全飘红。记得在XDC文件里补上create_generated_clock -name rx_clk \ -source [get_pins ad9361_if/inst/clk] \ -divide_by 1 \ [get_ports rx_clk]实测发现不这么搞的话数据有效窗口会偏移超过1ns直接导致收不到有效数据。调通之后上SignalTap抓波形能看到I/Q数据像心电图一样规律跳动。这时候拿频谱仪对着射频口能扫到干净的单音信号——这时候千万别激动先检查是不是本振泄露把数字直流校正寄存器配置好再说。

更多文章