FPGA驱动adc128s052的若干细节问题
usbblaster最好是直接与电脑USB口连接, 使用拓展坞会出现奇怪驱动问题.
adc数据手册说明
附上adc128s052时序手册
ADC芯片cs引脚持续拉低,则每次采完16bit后继续新的16bit
注意 : adc128s052数据手册信号针对于芯片本身,而非外部接口,即adc芯片DIN芯片引脚需要外接控制板输出引脚, DOUT引脚接控制板din引脚,adc芯片时序也仅针对芯片工作本身!!!
设计原理图
由于之前遗留问题, 故特设计次板用于adc验证, 图中可知, IN0与IN7均为地电平, 因此通道数据为16'h0000
ADC采集数据通道数据通道不对齐
signaltap 波形抓取图像
此为通道数据与通道不对齐情况
依据测试板设计结构, 通道0与通道7接gnd, 因此adc采取数据为零. 但是在代码编写过程中, adc采集数据与通道数据发生不一致
代码分析
原设计代码如下
assign done = (cnt == CNT_MAX) ? 1'b1 : 1'b0;
// done为第16个上升沿时钟
always@(posedge clk or negedge rst_n) begin
if(!rst_n) begin
data <= 16'h5a5a;
cnt_channel <= 'd0;
end else if(done) begin
data <= t_data;
cnt_channel <= cnt_channel + 1'b1;
end else begin
data <= data;
cnt_channel <= cnt_channel;
end
end
在代码中, 当完成信号来临时, 将数据更新到data之中, 在此时通道数也进行加1, 正是因为这个操作导致了通道数与通道数据不对齐.即数据更新与通道更新同步进行,但是此时的数据是上一个通道的数据,例 : 当通道0数据采集完后, 数据更新到寄存器, 但是此时,通道数却变成了1.
通道数据与通道不对齐修正
既然是由于数据与通道同步更新导致不对齐问题, 那么就利用adc时序中,DIN在前俩bit不用赋值来进行修改 : 现在将通道数自加的操作向后延时, 代码如下
always@(posedge clk or negedge rst_n) begin
if(!rst_n)
channel_d <= 2'd0;
else
channel_d <= {channel_d[0], done};
end
always@(posedge clk or negedge rst_n) begin
if(!rst_n)
cnt_channel <= 'd0;
else if(channel_d[1])
cnt_channel <= cnt_channel + 1'b1;
else
cnt_channel <= cnt_channel;
end
先将done信号进行二级打拍处理, 利用延时标志信号进行通道数自加的标准,以此完成了不对齐问题
现在只需要在done信号来临的时候进行数据读取即可得到正确的通道数以及对那个的通道数据
代码设计部分
整体思路还是使用计数器驱动时钟信号, 剩下的就是根据芯片时序图进行编写代码.
code url : click here.