標籤:提取 das 程式 細節 最佳化 條件 target 狀態 case
隨記
最近由於工程原因用到ADC的採樣,選用了ADI公司的AD9212晶片,八通道10位ADC。在進行ADC的採樣時,看到的想到的幾種方法,在這裡做個筆記記錄一下。
AD9212簡介
詳細說明可以在ADI官網上進行搜尋查看,具體的一些效能細節這裡就不進行詳細的介紹了。
ADC晶片在某一時刻採集到電壓資料後會在一個刻度內將資料串列的輸出,若使用FPGA對資料進行接收,所需要做的操作就只是一個串並轉換,還是比較簡單的對吧。在這裡由於AD9212的資料轉送是使用的LVDS輸出,也可以使用Altera官方(對,我們用的是A家的晶片)的LVDS_RX的IP核進行接收。下面我們把AD9212的一個時序圖放上來作為鎮文之圖。
可以看出DCO作為資料傳出的時鐘是上下邊沿觸發的,在每個邊沿資料D有效。FCO作為幀定界的訊號且與資料D同步,一個刻度內10位的有效資料D,且高位在前。主要資訊就這些了,訊號FCO、DCO、D接入FPGA。
方法1——利用官方LVDS_RX的IP核
簡單的說下思路,由於程式均為並行,以下步驟也已並列形式給出。
- 將D和FCO訊號引入LVDS_RX中,兩位兩位的讀取,讀取時鐘為DCO。
- 使用一個11位的Buffer寄存器,在每個上升沿的同時不斷的將LVDS_RX讀取到的資料以移位的形式添加到最後。(注意這裡是使用了11位Buffer,比資料長度多1,其用途可參考下方運行輔助理解)
- 在每個DCO的上升沿對LVDS_RX接收到的FCO進行打一拍處理
- 在每個DCO的上升沿對當前時刻接收到的2位FCO資料和前一個上升沿的資料(上述中打一拍)進行比較判定,若前一時刻為00,當前為11,則11位Buffer的[9:0]位接收到的資料;若前一時刻為01,則11位中Buffer的[10:1]為採集資料;其餘條件Buffer保持。
這裡最後一個處理中之所以有兩種情況是因為LVDS_RX在讀的過程中無法確保其開始位置,故這裡將兩種方法都進行考慮後進行綜合。描述了LVDS_RX在讀取時的兩種可能的狀態。
方法2——根據時序自行處理
同樣簡單的說一下思路,該方法對於10-bits ADC需要使用到一個12-bits的Buffer用於資料的緩衝。
- DCO上升沿進行採樣,資料依次存入Buffer[11,9,7,5,3,1]中。
- DCO下降沿進行採樣,資料依次存於Buffer[10,8,6,4,2,0]中。
- 類似於上述方法對FCO一樣雙邊沿採樣存於一個Reg[3:0]中。
- 在Reg[3:0]==0011時,標誌位置1。
- 在DCO的上升沿在標誌位置於1的時候將Buffer中的[11:2]提取出來成為ADC採集到的資料。
- 根據需要添加FIFO進行資料同步。
這一部分後續再時序上可能不如方法1,後期可以通過時序約束進行最佳化,暫時還未涉及,後續學習後再來添加補充。
希望對閱讀的你有著協助,歡迎探討。如果有什麼覺得不對的,一定不要客氣的留言回複大力拍磚~
[原創]AD9212採樣方法