基于FPGA的数据同步采集处理框架:包含ADC7606芯片数据采集模块、多通道数据处理模块、D...
基于fpga的数据同步采集处理包含adc7606芯片的数据采集模块多通道数据处理模块ddr3缓存模块使用SRIO通信模块,以及各个模块的仿真文件提供学习整个框架。 包含单独的ddr3仿真srio通信协议仿真以及adc芯片的仿真。 各模块的配套资料。搞FPGA数据采集系统就像搭乐高每个模块都是关键零件。今天咱们聊聊基于ADC7606的同步采集系统这个框架里藏着不少有意思的实战技巧。整套系统分成四大金刚数据采集、实时处理、高速缓存、SRIO通信每个环节都有独特的代码设计门道。ADC7606驱动这玩意儿SPI时序得玩得溜。看这段Verilog代码片段always (posedge clk_20m) begin case(spi_state) IDLE: if(convst_trig) begin cs_n 1b0; spi_counter 0; spi_state CLK_LOW; end CLK_LOW: begin sclk 1b0; spi_state CLK_HIGH; end CLK_HIGH: begin sclk 1b1; sampled_data[15-spi_counter] sdo; if(spi_counter 15) begin cs_n 1b1; spi_state IDLE; end else begin spi_counter spi_counter 1; spi_state CLK_LOW; end end endcase end这个状态机像流水线工人convst_trig信号一来就启动采集。注意sclk的下降沿采样设计ADC7606的时序要求严格得像军训时钟相位错位1/4周期都会导致数据错位。仿真时建议用Modelsim抓取sdo信号波形重点看第16个时钟周期的数据锁存是否准确。DDR3缓存模块最怕的就是突发传输掉链子。咱们用Xilinx MIG生成的控制器核心操作像这样assign app_cmd (wr_flag) ? 3b000 : 3b001; //写命令000读命令001 assign app_en (state WRITE_CMD) || (state READ_CMD); always (posedge ui_clk) begin if(app_rdy app_en) begin case(state) WRITE_CMD: begin app_addr wr_addr; app_wdf_data wr_data; app_wdf_wren 1b1; state WRITE_DATA; } //...其他状态跳转 endcase end end这个状态机控制着DDR3的读写节奏。调试时发现过坑——apprdy信号必须持续到命令被接收否则会丢数据。建议仿真时故意拉低apprdy观察重试机制是否正常。记得在Vivado里设置正确的时序约束特别是UI_CLK到DDR3时钟的相位关系。SRIO通信模块玩的是高速数据流。关键代码在数据包组装void srio_packet_gen(uint32_t dest_id, uint8_t* payload) { srio_header_t header; header.ftype 5; //NWRITE_R操作 header.tt 1; //地址指定传输 header.size 0x2; //256字节 header.src_id LOCAL_DEVICE_ID; header.dest_id dest_id; memcpy(tx_buffer, header, 8); memcpy(tx_buffer8, target_addr, 8); memcpy(tx_buffer16, payload, 256); srio_dma_start(tx_buffer, 272); }这个C函数在MicroBlaze里运行负责组包。注意地址字段必须8字节对齐否则会导致SRIO核报AMBA错误。仿真时用ChipScope抓取srio_txdata信号重点看sof/eof标志位的位置是否正确。基于fpga的数据同步采集处理包含adc7606芯片的数据采集模块多通道数据处理模块ddr3缓存模块使用SRIO通信模块,以及各个模块的仿真文件提供学习整个框架。 包含单独的ddr3仿真srio通信协议仿真以及adc芯片的仿真。 各模块的配套资料。多通道数据对齐有讲究用双时钟FIFO解决跨时钟域问题xpm_fifo_async #( .FIFO_WRITE_DEPTH(1024), .WR_DATA_COUNT_WIDTH(10), .READ_MODE(fwft) ) adc_fifo ( .wr_clk(adc_clk), .wr_en(adc_wr_en), .din(adc_data), .rd_clk(proc_clk), .dout(fifo_out), .empty(fifo_empty) );这个XPM模板生成的FIFO要特别注意写满保护。实际调试时发现当ADC采样率是100MSPS而处理时钟是150MHz时FIFO深度设512会溢出后来改到1024才稳定。建议在仿真脚本里制造背压场景测试FIFO的极限吞吐量。配套资料里有几个黄金仿真案例ddr3tb.v里模拟了突发写读回验证srioloopbacktest.sv实现环回测试adc7606model.v用$random生成模拟数据。跑仿真时记得调整各时钟域的频率偏移比如给DDR3模型加±100ps的时钟抖动更接近真实环境。整个工程最妙的是模块间的握手协议——用valid/ready信号实现流控像接力赛传递数据。但要注意全局复位时各模块的初始化顺序曾经因为DDR3校准未完成就启动SRIO传输导致系统卡死。后来加了个状态机等MIG的initcalibcomplete信号置位后才放开数据流。建议学习者从仿真文件入手先单独跑通每个子模块的测试再逐级联调。遇到数据错位别慌用SignalTap抓取跨时钟域交界处的信号往往能发现同步寄存器没打够。这套框架的弹性不错把ADC7606换成AD9680之类的芯片改改驱动就能适配新需求。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2420240.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!