標(biāo)題: 基于FIFO模式的FPGA與 USB2.0通訊接口設(shè)計(jì) [打印本頁]

作者: w4wind315    時(shí)間: 2010-1-14 15:26
標(biāo)題: 基于FIFO模式的FPGA與 USB2.0通訊接口設(shè)計(jì)

usb文章.pdf (558.74 KB, 下載次數(shù): 79)

 由于不能上傳圖片大家詳細(xì)請看附件;歡迎大家和我交流 021 54453155 專業(yè)代理FTDI芯片
 

  基于FIFO模式的FPGA USB2.0通訊接口設(shè)計(jì)

                                    作者:上海茂晶 楊文達(dá)samy@gfgei.com.hk

0

  USB(通用串行總線)是英特爾、微軟、IBM、康柏等公司1994年聯(lián)合制定的一種通用串行總線規(guī)范,它具有數(shù)據(jù)傳輸速度快,成本低,可靠性高,支持即插即用和熱插拔等優(yōu)點(diǎn),迅速得到廣泛應(yīng)用。

  在高速的數(shù)據(jù)采集或傳輸中,目前使用較多的都是采用USB 2.0接口控制器和FPGA或DSP實(shí)現(xiàn)的,本設(shè)計(jì)在USB 2.0接口芯片F(xiàn)T2232H的同步 FIFO模式下,利用FPGA作為外部主控制器實(shí)現(xiàn)和FT2232H 內(nèi)部的FIFO進(jìn)行控制,以實(shí)現(xiàn)數(shù)據(jù)的高速傳輸。該模塊可普遍適用于基于USB 2.0接口的高速數(shù)據(jù)傳輸或采集中。

  l 系統(tǒng)硬件模塊設(shè)計(jì)

  1.1 系統(tǒng)硬件框圖

圖1中展示了 FIFO方式下FT2232H 和FPGA的典型連接。其中,ADBUS[7..O]為8位雙向數(shù)據(jù)總線OE#用于使能數(shù)據(jù)總線ADBUS的輸出; RD#和WR#可分別作為FIFO的讀寫選通信號;CLK為同步時(shí)鐘輸出;RXF#為FIFO接受數(shù)據(jù)標(biāo)志位為當(dāng)為low時(shí)候可以讀取數(shù)據(jù);TXE#為 FIFO發(fā)送數(shù)據(jù)標(biāo)志位當(dāng)為low時(shí)可以寫入操作。

 

1.2 USB 2.0接口芯片FT2232H

1.2.1 FT2232H的結(jié)構(gòu)特點(diǎn)

FT2232H內(nèi)部結(jié)構(gòu)圖如圖1所示。FT2232H有2個(gè)獨(dú)立的UART/FIFO控制器,用于控制異步數(shù)據(jù)、245 FIFO數(shù)據(jù)、光電隔離(高速串口)或在安裝程序命令時(shí)控制Bit-Bang模式;USB協(xié)議引擎控制和管理UTMI PHY與FIFO之間的接口,負(fù)責(zé)電源管理和USB協(xié)議規(guī)范;雙端口FIFO TX緩沖區(qū)(4KB)存儲(chǔ)來自主機(jī)PC的數(shù)據(jù),并通過多用途的UART,F(xiàn)IFO控制器使用數(shù)據(jù);雙端口FIFO RX緩沖區(qū)(4KB)存儲(chǔ)來自多用途UART/FOFO控制器的數(shù)據(jù),然后再將數(shù)據(jù)送至主機(jī);復(fù)位發(fā)生器模塊上電時(shí)為設(shè)備內(nèi)部電路提供可靠的供電復(fù)位。 RESETn輸入引腳允許外部設(shè)備重置FT2232H。如果不使用RESETn,應(yīng)將其連接到VCCIO(+3.3 V);獨(dú)立波特率發(fā)生器提供×16或×10的時(shí)鐘信號給UART,通過1個(gè)14位比例因子和4個(gè)寄存位提供最佳的波特率調(diào)諧,決定UART可編程設(shè)置的波特率;+1.8 VLDO穩(wěn)壓器為系統(tǒng)核心,為USB收發(fā)器模塊提供+1.8 V電壓,其輸入(VREGIN)必須接+3.3 v外接電源。VREGIN還需外接一只濾波電容器:通用收發(fā)器宏單元接口(UTMI)物理層為USBTX/RX數(shù)據(jù)提供全速/高速SERDES (serialise-deserialise勸能,還可提供時(shí)鐘;當(dāng)不使用外部E2PROM時(shí),F(xiàn)T2232H默認(rèn)為一個(gè)USB到雙串口設(shè)備,添加一個(gè)外部93C46(93C56或93C66)E2PROM使每個(gè)器件的通道獨(dú)立配置為一個(gè)串行UART(RS232)模式,并行FIFO(245)模式或高速串口(光電隔離)。外部E2PROM也可用于存儲(chǔ)FT223-2H的USB VID,PID,設(shè)備驅(qū)動(dòng)號和設(shè)備說明文字。

 

  

1.2.2 FT2232H的工作模式

  FT2232H有Ports模式、245FIFO、bit-bang和MPSSE等接口方式。

Ports模式是一種最基本的數(shù)據(jù)傳輸方式,其數(shù)據(jù)傳輸主要由固件程序完成,需要CPU的參與,因此數(shù)據(jù)傳輸速率比較低,適用于傳輸速率要求不高的場合。

245FIFO模式可以分為異步和同步2種方式,可以通過如FPGA等象普通FIFO一樣對FT2232H緩沖FIFO進(jìn)行讀寫,F(xiàn)T2232H內(nèi)部FIFO FIFO提供所需的時(shí)序信號、握手信號(滿、空等)和輸出使能等。這里就是在同步FIFO模式下實(shí)現(xiàn)USB 2.O接口和FPGA的數(shù)據(jù)通信。

可編程接口bit-bang是主機(jī)方式,bit-bang作為內(nèi)部主機(jī)控制端點(diǎn),可以軟件編程讀寫控制波形,幾乎可以對任何8/16 b接口的控制器、存儲(chǔ)器和總線進(jìn)行數(shù)據(jù)的主動(dòng)讀寫,非常靈活。

MPSSE模式是FTDI公司的最大亮點(diǎn)之一。FT2232H內(nèi)部MPSSE單元可以模擬多種串行協(xié)議,從而方便實(shí)現(xiàn)USB轉(zhuǎn)換為其他協(xié)議,包括SPI,JTAG,I2C等接口,廣泛應(yīng)用于各種領(lǐng)域。

  2 系統(tǒng)軟件模塊設(shè)計(jì)

  2.1 USB固件程序設(shè)計(jì)

應(yīng)用中采用同步FIFO方式,使用內(nèi)部輸出60 MHz時(shí)鐘,固件程序采用FTDI公司提供的固件程序D2XX框架,在其初始化函數(shù)中添加了用戶配置代碼。該設(shè)計(jì)中同步自動(dòng)FIFO數(shù)據(jù)傳輸?shù)某跏蓟a如下:#include <windows.h>

#include <stdlib.h>

#include <stdio.h>

#pragma comment(lib, "FTD2XX.lib")

#include "FTD2XX.h"

int main()

{

 //FT_Open,FT_Close

 FT_HANDLE ftHandle;

 FT_STATUS ftStatus;

 //FT_EE_Read

 FT_PROGRAM_DATA ftData;

 char ManufacturerBuf[32];

 char ManufacturerIdBuf[16];

 char DescriptionBuf[64];

 char SerialNumberBuf[16];

 //FT_SetBitMode

 UCHAR Mask = 0xFF; //UCHAR ModeAsync= 0x01;

 UCHAR ModeSync = 0x40;//FT_Write

 DWORD BytesWritten;

 unsigned char TxBuffer[65536];//FT_GetStatus

 DWORD TxBytes;

 DWORD EventDWord;//FT_Read

 unsigned char RxBuffer[262144];

 unsigned char RxBuffer1[1];

 unsigned char RxBuffer2[2];

 unsigned char flag[32];

 unsigned char flag1;

 unsigned char flag2;

 DWORD RxCount = 0;

 DWORD RxBytes = 10;

 DWORD BytesReceived;

 int i,j,m,n;

 FILE *fp;

 RxBuffer2[0]=0;

 RxBuffer2[1]=1;

 flag1=85;

 flag2=170;

 flag[0]=flag1;

 flag[1]=flag1;

 for(i=2;i<32;i=i+2)

  flag=flag1;

 for(i=3;i<32;i=i+2)

  flag=flag2;

 ftStatus = FT_Open(0, &ftHandle);

 if(ftStatus != FT_OK) {

  printf("FT_Open failed\n");

  return 0;

  }

 ftStatus = FT_ResetDevice(ftHandle);

 if(ftStatus == FT_OK) {

  printf("FT_ResetDevice OK\n");

  }//FT_EE_Read

 ftData.Signature1 = 0x00000000;

 ftData.Signature2 = 0xffffffff;

 ftData.Version = 0x00000003;

 ftData.Manufacturer = ManufacturerBuf;

 ftData.ManufacturerId = ManufacturerIdBuf;

 ftData.Description = DescriptionBuf;

 ftData.SerialNumber = SerialNumberBuf;

 ftStatus = FT_EE_Read(ftHandle,&ftData);

 if (ftStatus == FT_OK){

  printf("FT_EE_Read OK!~\n");

  printf("Manufacturer=%s,ManufacturerId=%s\n",ftData.Manufacturer,ftData.ManufacturerId);

  printf("Description=%s,SerialNumber=%s\n",ftData.Description,ftData.SerialNumber);

  printf("IFAIsFifo7=%d\n",ftData.IFAIsFifo7);

  }

 else {

  printf("FT_EE_Read FAILED!\n");

  }

 //FT_EE_Program//ftData.VendorId = 0x0403;//ftData.ProductId = 0x6010;//ftData.Manufacturer = "FTDI";

 //ftData.ManufacturerId = "FT";

 //ftData.SerialNumber = "FTS58JQC";

 //ftData.Description = "FT2232H_Mini_Module";

 ftData.IFAIsFifo7 = 1;

 ftStatus = FT_EE_Program(ftHandle, &ftData);

 if (ftStatus == FT_OK) {

  printf("FT_EE_Program OK!~\n");

  }

 else {

  printf("FT_EE_Program FAILED!\n");

  }//FT_SetBitMode

 ftStatus = FT_SetBitMode(ftHandle,Mask,ModeSync);

 if (ftStatus == FT_OK) {

  printf("SetBitMode ModeSync OK!~\n");

  }

 else{

  printf("FT_SetBitMode FAILED!\n");

  }

 j = 0;m = 0;n = 0;

 }

 FT_Close(ftHandle);

 printf("FT_Close!\n");

 return 0; */

}

  2.2 FPGA控制程序設(shè)計(jì)

FT2232H提供的端口FIFO的讀寫操作,與普通FIFO讀寫操作方式一樣。FT2232H為每個(gè)端口提供了“空”標(biāo)志、“滿”標(biāo)志和“ 可編程級”標(biāo)志。FPGA檢測這些信號,用于控制讀寫的過程。FPGA在完成這些端口FIFO的操作時(shí),采用Verilog HDL硬件描述語言實(shí)現(xiàn)了FIFO的讀寫時(shí)序,并在ALTERA公司提供的QuartusⅡ8.O開發(fā)工具中綜合編譯并映射到FPGA中運(yùn)行。

  2.2.1 FIFO同步操作

  實(shí)現(xiàn)同步FIFO“讀”的狀態(tài)機(jī)如下圖所示。其狀態(tài)轉(zhuǎn)移進(jìn)程如下:

  IDLE:當(dāng)“寫”事件發(fā)生時(shí),轉(zhuǎn)到狀態(tài)1。

  狀態(tài)1:激活OE#,如果FIFO空標(biāo)志為“假”(FIFO不空),則轉(zhuǎn)向狀態(tài)2;否則停留在狀態(tài)1。

  狀態(tài)2:激活SLOE,SLRD,傳送總線采樣數(shù)據(jù);撤銷激活RD(指針加1)和OE,轉(zhuǎn)向狀態(tài)3。

  狀態(tài)3:如果有更多的數(shù)據(jù)要求,則轉(zhuǎn)向狀態(tài)2;否則轉(zhuǎn)向IDLE。

  實(shí)現(xiàn)以上狀態(tài)機(jī)的仿真波形如下圖所示。

 


 2.2.2 FIFO同步操作

  實(shí)現(xiàn)同步FIFO“寫”的狀態(tài)機(jī)如圖5所示。其狀態(tài)轉(zhuǎn)移進(jìn)程如下:


  IDLE:當(dāng)寫事件發(fā)生時(shí),轉(zhuǎn)到狀態(tài)1。

  狀態(tài)1:指向 FIFO,如果FIFO滿標(biāo)志為“假”(FIFO不滿),則轉(zhuǎn)向狀態(tài)3;否則停留在狀態(tài)2。

  狀態(tài)2:傳送總線驅(qū)動(dòng)數(shù)據(jù)。為一個(gè)激活WR#,轉(zhuǎn)向狀態(tài)3。

  狀態(tài)3:如果有更多的數(shù)據(jù)要寫,則轉(zhuǎn)向狀態(tài)1;否則轉(zhuǎn)向IDLE。

  用QuartusⅡ進(jìn)行仿真驗(yàn)證,其仿真波形如下圖所示,經(jīng)分析可知,本狀態(tài)機(jī)實(shí)現(xiàn)的FIFO寫控制信號完全正確。

  3 實(shí)驗(yàn)結(jié)果

  對傳輸?shù)臄?shù)據(jù)進(jìn)行驗(yàn)證,可通過FPGA編程生成O~255的數(shù)據(jù)傳送至FT2232H的pc端,連續(xù)傳送兩次,然后通過D2xx所提供API函數(shù)編寫軟件測試所接收到的數(shù)據(jù),測試結(jié)果如下圖所示,可以看出,數(shù)據(jù)傳輸準(zhǔn)確無誤。

  4 結(jié)

  USB 2.0控制器FT2232H已經(jīng)被廣泛應(yīng)用到許多數(shù)據(jù)傳輸領(lǐng)域,由于USB具有靈活的接口和可編程特性,大大簡化了外部硬件的設(shè)計(jì),提高了系統(tǒng)可靠性。該設(shè)計(jì)可擴(kuò)展性好,已經(jīng)被應(yīng)用于數(shù)據(jù)傳輸與采集的板卡上,經(jīng)實(shí)際測試,沒有出現(xiàn)數(shù)據(jù)的誤碼等錯(cuò)誤,數(shù)據(jù)傳送正確,傳輸速率可達(dá)30 MHz/s以上,滿足設(shè)計(jì)要求。


[此貼子已經(jīng)被admin于2010-1-14 17:49:42編輯過]





歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1