推荐给大家一款高性能的AD转换芯片,来自德州仪器的AZ6445(ADS6445),具有4个通道,每个通道都是14bit、125MHz的采样速率,数据传输采用LVDS接口,很适合高速传输数据。
首先来看一下ADS6445的器件手册,下图是ADS6445的器件结构图:
从上面的结构图可以看出4个通道的输入都是差分的输入信号,往往我们需要采集的信号都是单端的信号,所以将单端转差分,使用变压器或者单端转差分的运放都是可以的。这里我们采用的是单端转差分的运放。当然在器件手册里面这些信息都会给我们提供,我们就可以照图施工了。官方器件手册给的是THS4509,这里我使用的是ADI公司的AD8138芯片,使用哪一个都是可以的。下图为TI给出的参考电路:
时钟的输入也是差分的,在器件手册的相应部分也可以找到,使用变压器或者FPGA直接施加差分时钟信号都是可以的,这里我们使用的是使用FPGA来施加时钟信号。下图为时钟输入端的电路图,直接采用两个电容就可以了:
ADS6445的数据输出都是通过LVDS接口输出的,如下图所示为器件的输出数据的时序关系图:
具体该选择哪一种模式下工作,我们可以来配置芯片的寄存器,配置芯片的寄存器,ADS6445给出了两种方案,一种是并行配置方式,另一种是采用SPI 的串行配置方式。分别对应了芯片管脚上的CFG…和SCLK、SDATA…这里我们采用的是SPI的方式对每一个寄存器进行配置。配置寄存器的时序也非常简单,参照器件手册给出的时序就可以了,每一个寄存器对应的功能如下图所示:
通过以上的几个环节,我们就大致知道了芯片的外围电路如何设计以及程序如何编写了。接下来就分别来看一下器件的外围电路和程序的设计。
(1)器件外围电路:
器件的外围电路这里很简单,输入的差分时钟直接由FPGA来产生就可以了,输入的差分数据使用AD8138这个单端转差分的运放,具体的电路图如下图所示:
实际做好的板子:
电路板焊接好了之后就是测试模拟信号输入之后,前端的单端转差分的运放是否可以将输入的信号转化到ADS6445芯片可以接受的范围之内,经过测试使用AD8138是可以的。
(2)程序编写:
接下来就是对ADS6445进行编程。首先需要确定ADS6445的工作模式,所以需要配置寄存器,就是通过程序以SPI的接口时序往芯片里面的寄存器写数据,程序如下:
always@(posedge SPI_20M or negedge rst_n)begin
if(!rst_n)begin
SCLK <= 1'b1;
SEN <= 1'b1;
SDATA <= 1'b1;
spi_data <= 'd0;
end
else if(state_en)begin
case(state_cnt)
0:begin
SCLK <= 1'b1;
SEN <= 1'b1;
SDATA <= 1'b1;
spi_data <= spi_data;
end
1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31:begin
SCLK <= 1'b1;
SEN <= 1'b0;
SDATA <= spi_data[15];
spi_data <= spi_data;
end
2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32:begin
SCLK <= 1'b0;
SEN <= 1'b0;
SDATA <= SDATA;
spi_data <= spi_data << 1;
end
33:begin
SCLK <= 1'b1;
SEN <= 1'b1;
SDATA <= 1'b1;
case(data_state)
0:spi_data <= 16'b01000_0000_00000_00;//Register B 增益设置
1:spi_data <= 16'b01010_010_111_00000;//Register C 偏移二进制,正常模式_000_/测试模式_111_
2:spi_data <= 16'b01101_100_0001_0101;//Register F 串行模式,字节,高位在前_2Vpp,上升沿_16X,DDR_2线
default:spi_data <= spi_data;
endcase
end
default:begin
SCLK <= 1'b1;
SEN <= 1'b1;
SDATA <= 1'b1;
spi_data <= spi_data;
end
endcase
end
else begin
SCLK <= 1'b1;
SEN <= 1'b1;
SDATA <= 1'b1;
end
end
配置好寄存器之后就可以根据芯片的输出管脚来抓取数据了,其中DCO、FCO以及每一路的LVDS引脚都需要进行使用,这里面需要使用FPGA里面的IO资源来操控这些引脚,主要是使用了SELECT IO里面的ISEDERSE原语来将每个通道的数据输出,其中ISEDERSE原语需要两个时钟,第一个时钟需要和DCO同频同相,第二个时钟需要和FCO同频,并借助FCO的上升沿和数据其实对齐来抓起每一个完整的数据字段。具体的程序很长,这里面值截取一段ISERDESE的原语来作为展示,大家可以自己动手尝试:
ISERDESE2 #(
.DATA_RATE("DDR"), // DDR, SDR
.DATA_WIDTH(8), // Parallel data width (2-8,10,14)
.DYN_CLKDIV_INV_EN("FALSE"), // Enable DYNCLKDIVINVSEL inversion (FALSE, TRUE)
.DYN_CLK_INV_EN("FALSE"), // Enable DYNCLKINVSEL inversion (FALSE, TRUE)
.INIT_Q1(1'b0),
.INIT_Q2(1'b0),
.INIT_Q3(1'b0),
.INIT_Q4(1'b0),
.INTERFACE_TYPE("NETWORKING"),// MEMORY, MEMORY_DDR3, MEMORY_QDR, NETWORKING, OVERSAMPLE
.IOBDELAY("NONE"), // NONE, BOTH, IBUF, IFD
.NUM_CE(2), // Number of clock enables (1,2)
.OFB_USED("FALSE"), // Select OFB path (FALSE, TRUE)
.SERDES_MODE("MASTER"), // MASTER, SLAVE
.SRVAL_Q1(1'b0),
.SRVAL_Q2(1'b0),
.SRVAL_Q3(1'b0),
.SRVAL_Q4(1'b0)
)
ISERDESE2_DA1 (
.O(), // 1-bit output: Combinatorial output
.Q1(WA_data1[0]), // Q1 - Q8: 1-bit (each) output: Registered data outputs
.Q2(WA_data1[1]),
.Q3(WA_data1[2]),
.Q4(WA_data1[3]),
.Q5(WA_data1[4]),
.Q6(WA_data1[5]),
.Q7(WA_data1[6]),
.Q8(WA_data1[7]),
.SHIFTOUT1(),
.SHIFTOUT2(),
.BITSLIP(R_bit_slip),
.CE1(1'b1),
.CE2(1'b1),
.CLKDIVP(1'b0), // 1-bit input: TBD
.CLK(W_dc_clk), // 1-bit input: High-speed clock
.CLKB(~W_dc_clk), // 1-bit input: High-speed secondary clock
.CLKDIV(W_fc_clk), // 1-bit input: Divided clock
.OCLK(1'b0), // 1-bit input: High speed output clock used when INTERFACE_TYPE="MEMORY"
.DYNCLKDIVSEL(1'b0), // 1-bit input: Dynamic CLKDIV inversion
.DYNCLKSEL(1'b0), // 1-bit input: Dynamic CLK/CLKB inversion
.D(WA_LVDS1), // 1-bit input: Data input
.DDLY(1'b0), // 1-bit input: Serial data from IDELAYE2
.OFB(1'b0), // 1-bit input: Data feedback from OSERDESE2
.OCLKB(1'b0), // 1-bit input: High speed negative edge output clock
.RST(~rst_n), // 1-bit input: Active high asynchronous reset
.SHIFTIN1(1'b0),
.SHIFTIN2(1'b0)
);
最终的实现效果如下图所示,由于输入信号接线紧张,信号发生器只能输出两路,所以只能两个两个来测,如下图为1和4通道,2和3不接信号:
如下图为2和3通道,1和4通道不接数据输入:
通过以上的过程就完成了对一款四通道的AD芯片的使用,频率可以达到125MHz,足以满足很多场合的应用了。
如果有同学这款芯片的使用感兴趣,或者正好有项目需要。电路板资料和程序资料,也有做好的板子,可以联系QQ:2859340499。