AD7606工作原理以及FPGA控制验证(串行和并行模式)
文章目录
- 一、AD7606介绍
 - 二、AD7606采集原理
 - 
- 2.1 AD7606功能框图
 - 2.2 AD7606管脚说明
 
 - 三、AD7606并行模式时序分析以及实现
 - 
- 3.1 并行模式时序图
 - 3.2 并行模式时序要求
 - 3.3 代码编写
 - 3.4 仿真观察
 
 - 四、AD7606串行模式时序分析以及实现
 - 
- 4.1 串行模式时序图
 - 4.2 串行模式时序要求
 - 4.3 代码编写
 - 4.4 添加仿真模型以及观察
 
 
一、AD7606介绍
AD7606有三种,分别有8个、6个或4个通道,采样深度有16位(即最小采样的电压为5V/(2^16) = 0,00007V,实际上达不到);采用5V单电源供电,可以处理±10V 和±5V 真双极性输入信号;具有内部的2.5V基准电压;同时所有通道均能以高达200kSPS的吞吐速率采样,提供过采样功能以及串行输出和并行输出两种模式;广泛用于低速采集场景。
二、AD7606采集原理
  下图为AD7606-8的芯片封装图:
 
2.1 AD7606功能框图
下图为AD7606-8内部的功能框图:

   ADC工作原理:采样:对模拟值进行采样 -> 保持:将开关保持一段时间以将电容充电到采集电压值 -> 量化 编码:将电压值转化为数字量。
2.2 AD7606管脚说明
7606的管脚很多,我们选一些重要的管脚来说明:
OS[2:0]过采样模式选择
三、AD7606并行模式时序分析以及实现
3.1 并行模式时序图

 
3.2 并行模式时序要求
3.3 代码编写
输入可以用一个开始信号控制启动转换:
module ad7606_ctrl_par( input i_clk  , // 输入系统时钟,50m input i_rst  , input i_start , // 7606开始转换控制信号   input  [15:0] i_ad_data , // ad7606 采样数据 input i_ad_busy , // ad7606 忙标志位  input i_first_data , // ad7606 第一个数据标志位  output [ 2:0] o_ad_os , // ad7606 过采样倍率选择 output o_ad_cs , // ad7606 AD cs output o_ad_rd , // ad7606 AD data read output o_ad_reset , // ad7606 AD reset output o_ad_convstA , // ad7606 AD convert startA output o_ad_convstB , // ad7606 AD convert startB  output [15:0] o_ad_ch1 , // AD第1通道的数据 output o_ad_ch1_valid , // AD第1通道的数据有效信号 output [15:0] o_ad_ch2 , // AD第2通道的数据 output o_ad_ch2_valid , // AD第2通道的数据有效信号 output [15:0] o_ad_ch3 , // AD第3通道的数据 output o_ad_ch3_valid , // AD第3通道的数据有效信号 output [15:0] o_ad_ch4 , // AD第4通道的数据 output o_ad_ch4_valid , // AD第4通道的数据有效信号 output [15:0] o_ad_ch5 , // AD第5通道的数据 output o_ad_ch5_valid , // AD第5通道的数据有效信号 output [15:0] o_ad_ch6 , // AD第6通道的数据 output o_ad_ch6_valid , // AD第6通道的数据有效信号 output [15:0] o_ad_ch7 , // AD第7通道的数据 output o_ad_ch7_valid , // AD第7通道的数据有效信号 output [15:0] o_ad_ch8 , // AD第8通道的数据 output o_ad_ch8_valid // AD第8通道的数据有效信号);
整个操作可以用一个状态机来控制,状态定义如下:
/***************parameter*************/localparam  RESET = 4\'d0 ; //复位状态localparam  AD_CONSVT = 4\'d1 ; //开启转换localparam  BUSY = 4\'d2 ; //等待busylocalparam  READ_CH1 = 4\'d3 ; //读通道1数据localparam  READ_CH2 = 4\'d4 ; //读通道2数据localparam  READ_CH3 = 4\'d5 ; //读通道3数据localparam  READ_CH4 = 4\'d6 ; //读通道4数据localparam  READ_CH5 = 4\'d7 ; //读通道5数据localparam  READ_CH6 = 4\'d8 ; //读通道6数据localparam  READ_CH7 = 4\'d9 ; //读通道7数据localparam  READ_CH8 = 4\'d10; //读通道8数据localparam  READ_DONE = 4\'d11; //读完成
整个控制代码比较简单,这里就不全放出来了,直接看仿真:
3.4 仿真观察
仿真给出时钟复位即可,busy信号一直给0,data固定为d‘11,我们来看各信号的时序是否满足手册要求,仿真代码如下:
`timescale 1ns / 1psmodule tb_ad7606_ctrl_par();reg i_clk;reg i_rst;initial begin i_clk =0; i_rst = 1; #250; i_rst = 0;endalways #10 i_clk = ~i_clk;ad7606_ctrl_par u_ad7606_ctrl_par( .i_clk  ( i_clk ), .i_rst  ( i_rst ), .i_start ( 1\'b1 ), .i_ad_data ( 16\'d11 ), .i_ad_busy ( 1\'b0 ), .i_first_data ( ), .o_ad_os ( ), .o_ad_cs ( ), .o_ad_rd ( ), .o_ad_reset ( ), .o_ad_convstA ( ), .o_ad_convstB ( ), .o_ad_ch1 ( ), .o_ad_ch1_valid ( ), .o_ad_ch2 ( ), .o_ad_ch2_valid ( ), .o_ad_ch3 ( ), .o_ad_ch3_valid ( ), .o_ad_ch4 ( ), .o_ad_ch4_valid ( ), .o_ad_ch5 ( ), .o_ad_ch5_valid ( ), .o_ad_ch6 ( ), .o_ad_ch6_valid ( ), .o_ad_ch7 ( ), .o_ad_ch7_valid ( ), .o_ad_ch8 ( ), .o_ad_ch8_valid ( ));endmodule

放大局部来看

- 复位持续了120ns,最低时序要求是复位50ns,复位信号满足时序要求
 - CONVST下降沿到CONVST上升沿之间为80ns,最低时序要求是25ns,满足时序要求
 

- CONVST高电平到CS低电平,手册写的转换时间tCONV最低3.45us、最长4.15us。我们这里取4.16us,满足最长转换时序。
 

- RD一个周期的时间为80ns,高低电平时间为40ns,满足时序要求最高的32ns
 - 上一个CONVST上升沿在450ns,下一个上升沿在5470ns,一个tCYCLE时间为5.02us,满足手册要求的最长tCYCLE5us。
 
因此,所有输出信号都满足了手册的时序要求,AD7606并行模式仿真验证成功,后续有AD7606模块后再下板验证。
四、AD7606串行模式时序分析以及实现
4.1 串行模式时序图

  串行我们使用转换期间读取模式
 
   等busy信号拉低后,就可以拉低CS信号,然后提供SCLK给AD7606,数据按照每bit的传输,用户在SCLK上升沿采样,传输第一个通道的位数据时FRSTDATA会拉高。
4.2 串行模式时序要求
  CS信号,CONVST信号和并行一致,剩下的时序如下所示:
 
4.3 代码编写
顶层我们设置三个参数变量,分别为系统时钟,SPI时钟,和采样周期,这样就能通过这些变量来计算出我们需要的分频计数值。
module ad7606_ctrl_ser#( parameter SYS_CLK_FREQ = 100_000_000, //系统时钟频率 SPI_CLK_FREQ = 20_000_000, //SPI时钟频率 AD_CAP_FREQ = 200_000 //AD7606采样频率最大200K)( input i_clk  , // 输入系统时钟,100m input i_rst  , input i_start , // 7606开始转换控制信号   input i_ad_data_A , // ad7606 1,2,3,4通道采样数据 input i_ad_data_B , // ad7606 5,6,7,8通道采样数据 input i_ad_busy , // ad7606 忙标志位  output [ 2:0] o_ad_os , // ad7606 过采样倍率选择 output o_ad_cs , // ad7606 AD cs output o_ad_sclk , // ad7606 AD data read output o_ad_reset , // ad7606 AD reset output o_ad_convstA , // ad7606 AD convert startA output o_ad_convstB , // ad7606 AD convert startB  output [15:0] o_ad_ch1 , // AD第1通道的数据 output [15:0] o_ad_ch2 , // AD第2通道的数据 output [15:0] o_ad_ch3 , // AD第3通道的数据 output [15:0] o_ad_ch4 , // AD第4通道的数据 output [15:0] o_ad_ch5 , // AD第5通道的数据 output [15:0] o_ad_ch6 , // AD第6通道的数据 output [15:0] o_ad_ch7 , // AD第7通道的数据 output [15:0] o_ad_ch8 , // AD第8通道的数据 output o_ad_cap_done // AD所有通道采集数据完成信号);
状态机和分频系数定义如下,由于是串行输入,所以设置一个READ状态即可
 /***************parameter*************/localparam  T5US_DIV = SYS_CLK_FREQ / 200_000 -1 ; //200Kbps采样率,因此采样周期为5uslocalparam  SPI_DIV = SYS_CLK_FREQ / 20_000_000 -1 ; //SPI时钟分频系数localparam  SPI_DIV1 = SPI_DIV/2; //半周期分频localparam  RESET = 4\'d0 ; //复位状态localparam  AD_CONSVT = 4\'d1 ; //开启转换localparam  BUSY = 4\'d2 ; //等待busylocalparam  READ = 4\'d3 ; //读数据localparam  READ_DONE = 4\'d4 ; //读完成
设置两个64bit寄存器来存放几个通道的串行数据,然后再分别分配各各个通道:
reg [63:0] ad_dataA ;reg [63:0] ad_dataB ;assign o_ad_ch1 = ad_dataA[63:48] ;assign o_ad_ch2 = ad_dataA[47:32] ;assign o_ad_ch3 = ad_dataA[31:16] ;assign o_ad_ch4 = ad_dataA[15: 0] ;assign o_ad_ch5 = ad_dataB[63:48] ;assign o_ad_ch6 = ad_dataB[47:32] ;assign o_ad_ch7 = ad_dataB[31:16] ;assign o_ad_ch8 = ad_dataB[15: 0] ;
4.4 添加仿真模型以及观察
仿真代码如下:
`timescale 1ns / 1psmodule tb_ad7606_ctrl_ser();reg i_clk ;reg i_rst ;wire i_ad_data_A ;wire i_ad_data_B ;wire i_ad_busy ;wire o_ad_convstA ;wire o_ad_convstB ;wire o_ad_cs ;wire o_ad_sclk ;wire o_ad_reset ;initial begin i_clk =0; i_rst =1; #250; i_rst = 0;endalways #5 i_clk = ~i_clk;ad7606_ctrl_ser#( .SYS_CLK_FREQ( 100_000_000 ), .SPI_CLK_FREQ( 20_000_000 ), .AD_CAP_FREQ ( 200_000 ))u_ad7606_ctrl_ser( .i_clk  ( i_clk  ), .i_rst  ( i_rst  ), .i_start  ( 1\'b1), .i_ad_data_A  ( i_ad_data_A  ), .i_ad_data_B  ( i_ad_data_B  ), .i_ad_busy  ( i_ad_busy  ), .o_ad_os  ( ), .o_ad_cs  ( o_ad_cs  ), .o_ad_sclk  ( o_ad_sclk  ), .o_ad_reset ( o_ad_reset ), .o_ad_convstA  ( o_ad_convstA  ), .o_ad_convstB  ( o_ad_convstB  ), .o_ad_ch1  (  ), .o_ad_ch2  (  ), .o_ad_ch3  (  ), .o_ad_ch4  (  ), .o_ad_ch5  (  ), .o_ad_ch6  (  ), .o_ad_ch7  (  ), .o_ad_ch8  (  ), .o_ad_cap_done (  ));ad7606 ad7606_inst(.ad_busy (i_ad_busy ), //ad7606 忙标志位 输出 .ad_cs (o_ad_cs ), //ad7606 CS信号输入,低电平SPI数据线输出AD7606寄存器数据  .ad_sclk (o_ad_sclk ), //ad7606 SCLK时钟输入  .ad_reset (o_ad_reset ), //ADC复位输入 .ad_convsta (o_ad_convstA ), //ad7606 A组通道转换 .ad_convstb (o_ad_convstB ), //ad7606 B组通道转换 .ad_range (1\'b0  ), //ad7606 模拟输入范围,设置1范围:±10V,设置0范围±5V.ad_out_a (i_ad_data_A ), //A组通道采集有效数据输出 .ad_out_b (i_ad_data_B ) //B组通道采集有效数据输出); endmodule
  采样周期5.07us,满足AD7606最大的5us
 

   采样出来的仿真模型也是正确的,至此AD7606的串行和并行验证都完成。


