
FPGA Verilog AD7606、AD7616驱动代码硬件并行模式读取代码注释详细已经过板上验证最近在项目里折腾AD7606和AD7616这两款ADC芯片的驱动发现网上现成的Verilog驱动要么时序不对要么注释像天书。今天分享个自己踩坑后验证通过的方案硬件并行模式实测采样率能跑到1MSPS别问为什么不用SPI模式问就是速度不够看。先上干货驱动核心是个状态机。这俩芯片并行模式操作类似重点在CONVST信号和BUSY信号的配合。代码里用了三个always块分工合作// 时钟分频生成1MHz采样时钟 always (posedge clk_100m or negedge rst_n) begin if(!rst_n) begin convst_cnt 0; adc_convst 1b1; end else begin if(convst_cnt 49) begin // 100MHz/50 2MHz周期 convst_cnt 0; adc_convst ~adc_convst; // 产生50%占空比 end else begin convst_cnt convst_cnt 1; end end end // 抓取BUSY下降沿触发读取 always (negedge adc_busy or negedge rst_n) begin if(!rst_n) begin read_en 1b0; end else begin read_en 1b1; // BUSY变低立即启动读取 #20 read_en 1b0; // 保持20ns后关闭根据t8时间调整 end end // 并行数据锁存 always (posedge clk_100m) begin if(read_en) begin // AD7616需要处理18bit数据 adc_data_temp {adc_db[15:0], adc_db2[1:0]}; data_valid 1b1; end else begin data_valid 1b0; end end重点说下第二个always块里那个#20延时——这是根据AD7606的t8参数Busy下降到数据有效时间加的保险。实测发现不加这个延时在低温环境下偶尔会吃到不稳定数据。代码里用了非阻塞赋值时钟同步避免亚稳态问题。FPGA Verilog AD7606、AD7616驱动代码硬件并行模式读取代码注释详细已经过板上验证硬件连接注意了ADC的DB15-DB0接FPGA普通IO但AD7616的两个最高位DB16/DB17建议接FPGA的专用时钟管脚有更小的建立保持时间。别问我是怎么知道的调了两天时序的眼药水钱都够买瓶茅台了。最后上个测试时的SignalTap抓取波形假装有图。关键看CONVST上升沿后BUSY变高维持约1.2us后下降此时数据线立即出现有效数值。调试时建议先固定输入已知电压比如接个干电池用Quartus的In-System Memory Content Editor直接读寄存器值验证。代码仓库里有个paramter控制的版本通过宏定义切换AD7606/7616模式。注意AD7616需要先写配置寄存器才能进并行模式这部分代码在初始化模块里用SPI操作具体不展开说了其实就是往特定地址写0x01。有需要完整工程的可以去我Github挖链接在个人主页。下次准备写写怎么用这两个ADC做三相电压同步采集有坑再填。