目录
一、前言
在做项目中,经常会用到AD转换模块。前段时间做毕业设计的时候需要用到FPGA驱动AD9240模块实现模拟数据的采集和转换,尽管相对来说AD9240算比较简单的驱动模块,但是也想记录下分析和设计过程。
二、时序原理
首先通过芯片手册可以看到AD9240是14位,最高速率可达10Mbps的模数转换器件。然后就是重要的时序转换图:
可以看出:
在采样时钟第一个周期的上升沿芯片对当前模拟输入进行采样,然后在采样时钟第四个周期的下降沿完成模拟数值的转换和输出,这意味着整个输出的转换采样值滞后采样时钟4个周期。如果需要将模拟值与转换值相对应,这个延迟是需要注意的。
根据时序参数要求,可以知道:
1、最小的Clock Period为100ns,符合最大的10M转换速率
2、由于高速分辨率的A/D对输入采样时钟的质量很敏感,AD9240的输入时钟占空比应该满足45%~55%,对于时钟低于10M的情况,可以偏离这个范围,但必须满足t${CH}$和t$$的要求。
一般对于AD9240的电路设计如上,通过模拟信号单独输入到VINA中,然后CLK由FPGA提供,BIT1~BIT14为转换输出的14为数值。OTR为溢出标志位,代表输入数据是否低于或超过转换范围,一般不需要这个接口信号。
三、代码设计
由此可以设计FPGA驱动代码如下:
module AD9240
(
input clk,
input n_rst,
input adc_otr,//if(数据超过范围):1 else:0
input adc_clk,
input [13:0] AD_data_in,
output reg [15:0] AD_data_out
);
reg [1:0] adc_clk_delayed;
always @(posedge clk or negedge n_rst ) //将采样时钟进行打拍
begin
if(n_rst==1'b0)
adc_clk_delayed <=2'b00;
else
adc_clk_delayed <={adc_clk_delayed[0],adc_clk};
end
wire fallingedge_adc_clk=(adc_clk_delayed==2'b10);
always @(posedge clk or negedge n_rst)
begin
if(n_rst==1'b0)
AD_data_out <=16'd0;
else if(fallingedge_adc_clk==1'b1)
AD_data_out <={2'b00,AD_data_in};//补齐为16bit,以便ram的存储及usb通信
else
AD_data_out <=AD_data_out;
end
endmodule
值得注意的是:
1、输入adc_clk要满足时序参数要求
2、由于一般存储单位不为14bit,所以再得到转换数据后将其不全为16bit得到AD_data_out
四、结果验证
根据芯片手册的数据格式输出可知:
由于这里的参考电压为2.5V,则其输入范围为-2.5V~2.5V,实际电压V的转换式子为:
$V=(ADDATA-8192)/8192*2.5$
最后通过输入不同幅值频率的正弦波,方波等进行验证可判断采样正确与否。