FPGA驅動adc128s052的若干細節問題
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.