四通道数据采集卡(ADS6445、4 channel、14bit、125MHz)

推荐给大家一款高性能的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。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值