新聞中心

EEPW首頁 > 電源與新能源 > 設(shè)計應(yīng)用 > 基于Spartan-6的高速數(shù)據(jù)采集、處理和實時傳輸研究

基于Spartan-6的高速數(shù)據(jù)采集、處理和實時傳輸研究

作者: 時間:2016-12-06 來源:網(wǎng)絡(luò) 收藏

擇一種最佳的設(shè)計方案。表 1為不同抽取倍數(shù)下的帶寬和混疊衰減規(guī)格:

本文引用地址:http://m.butianyuan.cn/article/201612/326826.htm

  最后確定選擇CIC2濾波器抽取倍數(shù)為15,CIC5抽取倍數(shù)為2,RCF抽取倍數(shù)為2就可以滿足系統(tǒng)設(shè)計的要求。

  3.2.3 可變系數(shù)RCF濾波器參數(shù)設(shè)置

  根據(jù)2.2.1節(jié)設(shè)計得到的RCF抽取倍數(shù)為30,可以根據(jù)式來計算得到抽取濾波器的抽頭數(shù)為150。

  

  其中,為60MHz,為15,為CIC5濾波器抽取降速后的頻率也即2MHz,當(dāng)輸入通道模式時單通道實模式時為1。對可變系數(shù)的RCF濾波器進行編程設(shè)置時需要先向地址0x30C寫入整數(shù) 149(=59)。然后濾波器的響應(yīng)逐一寫入到地址0x000~0xFF中。這樣就完成了RCF寄存器的編程設(shè)置。

  3.2.4 AD6620工作模式寄存器編程

  對頻率變換單元、固定系數(shù)的CIC2和CIC5以及RCF濾波器變化進行編程設(shè)置后,要使AD6620正常工作還需要對其工作方式和相關(guān)寄存器進行配置。AD6620的工作方式主要由地址0x300H的寄存器中低四位決定,其中,bit0=1時系統(tǒng)處于軟復(fù)位狀態(tài),bit0=0則處于正常狀態(tài);bit1=1時系統(tǒng)處于雙通道實數(shù)輸入模式;bit2=1時系統(tǒng)處于單通道復(fù)數(shù)輸入模式;如果bit0~bit2都是0,那么系統(tǒng)處于單通道實數(shù)輸入模式;bit3=1/0為時鐘主從工作模式。因此,當(dāng)各寄存器配置完成后需要將寄存器bit0拉低,也即置為0狀態(tài)使其脫離軟復(fù)位狀態(tài),進入正常工作模式。另外,在本文中AD6620讀寫內(nèi)部寄存器是采用的異步讀寫時序,數(shù)據(jù)輸出是并行16位輸出模式。  總的來說,采用FPGA實現(xiàn)AD6620初始化的過程如下:

  1)首先判斷AD6620有沒有經(jīng)過硬件復(fù)位,如果沒有經(jīng)過硬件復(fù)位而又要實現(xiàn)系統(tǒng)復(fù)位,那么可以通過程序去編程地址0x300H的寄存器的bit0位置為1,使得AD6620處于軟件復(fù)位狀態(tài),這樣就可以對非動態(tài)的寄存器進行相關(guān)編程;

  2)對NCO單元、CIC2、CIC5濾波器的抽取倍數(shù)和系數(shù)進行編程,將相應(yīng)的控制系數(shù)寫入相對應(yīng)的地址寄存器中;

  3)對RCF濾波器系數(shù)進行編程,分別向地址0x000H~0xFF中寫入這150個抽頭系數(shù),剩下的寫入0。

  4)對AD6620所有配置工作完成后,必須向地址0x300H的bit0寫入0,使其脫離軟復(fù)位狀態(tài),這樣AD6620才可以在所配置工作方式下對輸入的數(shù)據(jù)進行處理?! ?/p>

  4.實時數(shù)據(jù)傳輸模塊

  基于USB2.0的數(shù)據(jù)傳輸設(shè)計主要包括以下幾個部分:(1)基于EZ-USB FX2的硬件電路設(shè)計(2)EZ-USB FX2系列器件CY7C68013A的固件程序(設(shè)置CY7C68013A工作模式、傳輸方式等,需要對其內(nèi)部寄存器進行相關(guān)配置),主要通過Keil C51軟件進行開發(fā)。

  4.1 實時數(shù)據(jù)傳輸部分的硬件設(shè)計

  實時數(shù)據(jù)傳輸部分(USB2.0的數(shù)據(jù)傳輸)的硬件設(shè)計方案如圖10所示,USB模塊與FPGA間的連線如圖11所示。

  在高速數(shù)據(jù)傳輸部分采用了Cypress公司的EZ-USB FX2 CY7C68013A芯片,采用單片USB 2.0外設(shè)可以避免用FPGA直接實現(xiàn)USB通信協(xié)議時可靠性低的問題。在數(shù)據(jù)采集、傳輸以及測試過程中,CY7C68013A作為從機,負責(zé)將FPGA發(fā)送給它的基帶數(shù)據(jù),利用其16位SLAVE FIFO(關(guān)于SLAVE FIFO的傳輸示意圖如圖所示)將數(shù)據(jù)緩沖發(fā)送給上位機。在SLAVE FIFO數(shù)據(jù)傳輸中,上位機應(yīng)用程序、固件程序和FPGA程序都非常關(guān)鍵,要配合好才能完成數(shù)據(jù)的高速數(shù)據(jù)傳輸。在這個系統(tǒng)中,F(xiàn)PGA起著主控制器作用,CY7C68013A則相當(dāng)于一個從設(shè)備。具體的工作流程是:FPGA把接收過來的16位數(shù)字基帶信號發(fā)送給CY7C68013A,CY7C68013A以SLAVE FIFO的方式將這些數(shù)據(jù)緩沖,并以批量數(shù)據(jù)傳輸?shù)姆绞桨l(fā)送給上位機,上位機接收到這些數(shù)據(jù)后加以存儲和顯示。

  4.2 CY7C68013A的固件程序設(shè)計

  固件程序是指運行在設(shè)備CPU中的程序,只有在該程序運行時,外設(shè)才能稱之為具有給定功能的外部設(shè)備。固件程序負責(zé)初始化單元,重新設(shè)置設(shè)備。主要包括設(shè)備描述符信息、設(shè)備功能代碼。設(shè)備描述信息描述USB設(shè)備的一半特性和配置,如設(shè)備類別、接口配置、VID和PID等。主機在設(shè)備列舉時要獲取USB設(shè)備的描述符,從而獲得設(shè)備的配置信息和相關(guān)驅(qū)動信息。用戶可以通過修改固件中的描述符來改變設(shè)備的特性。設(shè)備功能代碼有設(shè)備的功能需求決定。通信控制功能代碼執(zhí)行主機請求分析處理和數(shù)據(jù)交換處理功能。

  采用ARM公司的Keil C51 uVision4.02開發(fā)CY7C68013A的固件程序。為了簡化固件編程,CYPRESS提供了固件編程框架,在此基礎(chǔ)上添加我們所需要的配置代碼即可完成軟件編程?! ?/p>

  復(fù)位上電時,固件先初始化一些全局變量,然后調(diào)用初始化函數(shù)ID_Init(),初始化設(shè)備一直到?jīng)]有配置的狀態(tài)和打開中斷,循環(huán)1s后枚舉,直到端點0接收到SETUP包退出循環(huán),進入循環(huán)語句while,執(zhí)行任務(wù)函數(shù),函數(shù)包括:

  (a)TD_POLL()用戶任務(wù)調(diào)度函數(shù);

  (b)如果發(fā)現(xiàn)USB設(shè)備請求,則執(zhí)行對應(yīng)的USB請求;

  (c)如果發(fā)現(xiàn)USB空閑置位,則調(diào)用TD_Suspend()這個掛起函數(shù),調(diào)用成功后則內(nèi)核掛起,直到出現(xiàn)USB遠程喚醒信號,調(diào)用TD_Resume(),內(nèi)核喚醒后重新進入while循環(huán)。

  固件框架程序需要以下幾個文件:

  (1)FX2.h:庫函數(shù)申明,以及變量、宏定義、數(shù)據(jù)類型定義;

  (2)Fxregs.h:FX2LP寄存器頭文件;

  (3)Fw.c:固件框架源文件;

  (4)Periph.c:用戶調(diào)度函數(shù)、用戶可以修改,在不同的應(yīng)用中文件名不一樣;

  (5)Dscr.a51:USB描述符列表,用戶可以修改;

  (6)Ezusb.lib:EZUSB庫文件;

  (7)USBJmpTb.OBJ:中斷跳轉(zhuǎn)函數(shù)目標(biāo)文件

  這種情況下,需要在固件程序中,進行相應(yīng)的修改。在SLAVE FIFO中,特別是自動傳輸(CY7C68013A單片機不干預(yù)數(shù)據(jù)傳輸),固件程序主要完成各個端口的初始化。因此我們要修改兩個地方:(1)USB設(shè)備描述符列表Dscr.a51,根據(jù)實際情況修改里面的端口數(shù)和傳輸方式等;(2)初始化函數(shù)void TD_Init(void)。在SLAVE FIFO這種方式下,設(shè)置EP2為4緩沖的輸出端口,EP6為4緩沖的輸入端口。

  5. 上位機軟件設(shè)計

  上位機應(yīng)用程序是系統(tǒng)與用戶之間交流的接口,它通過通用驅(qū)動程序完成對外設(shè)的控制和通信。主機端應(yīng)用程序負責(zé)向FX2的FIFO發(fā)送或者接收數(shù)據(jù)。本報告中采用的固件架構(gòu)是EZ-USB FX2/FX2LP(CY7C68013, 驅(qū)動程序是Cyusb.sys。用Visual Studio2008軟件進行上位機開發(fā),利用C++/MFC來開發(fā)基于對話框的應(yīng)用程序,系統(tǒng)的主要功能模塊有:打開USB設(shè)備、復(fù)位USB設(shè)備、系統(tǒng)數(shù)據(jù)測試與顯示等。

  在VS2008中建立一個MFC 單文檔/對話框應(yīng)用程序后,在路徑項目中包含頭文件cyapi.h和cyapi.lib所在的路徑。然后手動導(dǎo)入cyapi.lib,注意是CV6_7的lib,不要導(dǎo)入BCB的。

  開發(fā)USB應(yīng)用程序的一般工作流程如下。

  1)首先要創(chuàng)建一個USB設(shè)備對象

  CCyUSBDevice *USBDevice = new CCyUSBDev(Handle);括號中的Handle是USB所關(guān)聯(lián)對象的句柄,一般在MFC中直接就是m_hwnd。

  2)打開USB設(shè)備。

  可以用到兩個函數(shù)open();isopen()這兩個都可以用來打開USB設(shè)備,isopen()還可以判斷能否獲得USB設(shè)備句柄,一般來說,如果只有一個USB設(shè)備連接,可以這樣打開:

  USBDevice->open(0)//打開0號USB設(shè)備;如果要判斷,可以:

  if(!USBDevice->open(0)) //打開失敗

  {messagebox("USB未連接");}

  或者if(!USBDevice->Isopen())

  如果連接有多個USB設(shè)備,那么可以枚舉所有的USB,用到DeviceCount()函數(shù);具體的可以參考cybulk的例子。執(zhí)行USBDevice->DeviceCount()后,返回所連接的USB設(shè)備個數(shù):

  if (USBDevice->DeviceCount()) //保證至少有一個USB設(shè)備連接

  {

  for (i = 0; i DeviceCount(); i++) //枚舉所有USB設(shè)備

  {

  USBDevice->Open(i);//打開第i號USB設(shè)備

  m_DeviceListComBox.AddString(USBDevice->DeviceName);//所選擇的當(dāng)前設(shè)備名}

  }

  3)端點枚舉

  在cybulk的例子中介紹了如何枚舉固件中使用的所有端點,也就是使用多個端點的情況,其枚舉步驟主要包括一下幾個端點:

  (1)創(chuàng)建USB設(shè)備并打開該設(shè)備

  CCyUSBDevice *USBDevice=new CCyUSBDevice(m_hWnd);//USB設(shè)備USBDevice->Open(0);//打開0號USB設(shè)備。

  (2)獲取所用的端點數(shù)目

  intepts = USBDevice->EndPointCount();

  EndPointCount();函數(shù)返回當(dāng)前所用的端點數(shù)+1,也就是包含了控制端點。例如在固件接口描述符Interface Descriptor中設(shè)置Number of end points項(第5項)的值為4,則epts的值為4+1=5。

  (3)定義端點指針

  CCyUSBEndPoint *endpt;CCyUSBEndPoint建立一個端點對象,可建立所有的端點類型,控制端點,bulk端點,ISO端點等;

  (4)枚舉端點,并獲得其屬性:端點號,傳輸方向

  for (i=1; i

  {

  endpt = USBDevice->EndPoints[i];//EndPoints-端點列表,最大16.EndPoints[0]指向控制端點(CCyControlEndPoint),未使用的端點設(shè)置為NULL。

  if (endpt->Attributes == 2) // Bulk Attributes 判斷傳輸類型bulk,control,等。

  {

  sprintf(s, "0x%02x", endpt->Address);

  if (endpt->Address & 0x80) //Address--判斷傳輸方向in or out 0x8_-in;0x0_-out

  {

  m_InEndptComBox.AddString(s); //最高位為8,in端點,添加到in組合框m_InEndptComBox.SetItemData(m_InEndptComBox.GetCount()-1,i);

  else

  {

  m_OutEndptComBox.AddString(s); //否則,最高位為0,out端點,添加到out組合框m_OutEndptComBox.SetItemData(m_OutEndptComBox.GetCount()-1,i);

  }}}  這樣,就完成了某個具體端點的選擇。如果只需要使用一個端點的話,那上面的代碼無疑就顯得冗長不夠簡潔了。僅使用一個端點,可以使用EndPointOf()函數(shù),該函數(shù)直接使用指定的端點,返回其指針;例如,要使用端點2,in傳輸,那么,可以這樣:

  CCyUSBDevice *USBDevice=new CCyUSBDevice(m_hWnd); //USB設(shè)備

USBDevice->Open(0); //打



關(guān)鍵詞: Spartan-6高速數(shù)

評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉