FPGA驅動adc128s052的幾個問題

天若手提滑铲發表於2024-07-19

FPGA驅動adc128s052的若干細節問題

usbblaster最好是直接與電腦USB口連線, 使用擴充塢會出現奇怪驅動問題.

adc資料手冊說明

附上adc128s052時序手冊
image
ADC晶片cs引腳持續拉低,則每次採完16bit後繼續新的16bit
注意 : adc128s052資料手冊訊號針對於晶片本身,而非外部介面,即adc晶片DIN晶片引腳需要外接控制板輸出引腳, DOUT引腳接控制板din引腳,adc晶片時序也僅針對晶片工作本身!!!

設計原理圖

由於之前遺留問題, 故特設計次板用於adc驗證, 圖中可知, IN0與IN7均為地電平, 因此通道資料為16'h0000
image

ADC採集資料通道資料通道不對齊

signaltap 波形抓取影像

此為通道資料與通道不對齊情況

image

依據測試板設計結構, 通道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訊號來臨的時候進行資料讀取即可得到正確的通道數以及對那個的通道資料
image

程式碼設計部分

整體思路還是使用計數器驅動時鐘訊號, 剩下的就是根據晶片時序圖進行編寫程式碼.
code url : click here.

相關文章