找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6419|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

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

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:21127 發(fā)表于 2010-1-14 15:26 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式

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

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

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

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

0

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

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

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

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

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

 

1.2 USB 2.0接口芯片FT2232H

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

FT2232H內(nèi)部結(jié)構(gòu)圖如圖1所示。FT2232H有2個獨立的UART/FIFO控制器,用于控制異步數(shù)據(jù)、245 FIFO數(shù)據(jù)、光電隔離(高速串口)或在安裝程序命令時控制Bit-Bang模式;USB協(xié)議引擎控制和管理UTMI PHY與FIFO之間的接口,負(fù)責(zé)電源管理和USB協(xié)議規(guī)范;雙端口FIFO TX緩沖區(qū)(4KB)存儲來自主機(jī)PC的數(shù)據(jù),并通過多用途的UART,F(xiàn)IFO控制器使用數(shù)據(jù);雙端口FIFO RX緩沖區(qū)(4KB)存儲來自多用途UART/FOFO控制器的數(shù)據(jù),然后再將數(shù)據(jù)送至主機(jī);復(fù)位發(fā)生器模塊上電時為設(shè)備內(nèi)部電路提供可靠的供電復(fù)位。 RESETn輸入引腳允許外部設(shè)備重置FT2232H。如果不使用RESETn,應(yīng)將其連接到VCCIO(+3.3 V);獨立波特率發(fā)生器提供×16或×10的時鐘信號給UART,通過1個14位比例因子和4個寄存位提供最佳的波特率調(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勸能,還可提供時鐘;當(dāng)不使用外部E2PROM時,F(xiàn)T2232H默認(rèn)為一個USB到雙串口設(shè)備,添加一個外部93C46(93C56或93C66)E2PROM使每個器件的通道獨立配置為一個串行UART(RS232)模式,并行FIFO(245)模式或高速串口(光電隔離)。外部E2PROM也可用于存儲FT223-2H的USB VID,PID,設(shè)備驅(qū)動號和設(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提供所需的時序信號、握手信號(滿、空等)和輸出使能等。這里就是在同步FIFO模式下實現(xiàn)USB 2.O接口和FPGA的數(shù)據(jù)通信。

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

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

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

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

應(yīng)用中采用同步FIFO方式,使用內(nèi)部輸出60 MHz時鐘,固件程序采用FTDI公司提供的固件程序D2XX框架,在其初始化函數(shù)中添加了用戶配置代碼。該設(shè)計中同步自動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è)計

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

  2.2.1 FIFO同步操作

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

  IDLE:當(dāng)“寫”事件發(fā)生時,轉(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。

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

 


 2.2.2 FIFO同步操作

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


  IDLE:當(dāng)寫事件發(fā)生時,轉(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ū)動數(shù)據(jù)。為一個激活WR#,轉(zhuǎn)向狀態(tài)3。

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

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

  3 實驗結(jié)果

  對傳輸?shù)臄?shù)據(jù)進(jì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è)計,提高了系統(tǒng)可靠性。該設(shè)計可擴(kuò)展性好,已經(jīng)被應(yīng)用于數(shù)據(jù)傳輸與采集的板卡上,經(jīng)實際測試,沒有出現(xiàn)數(shù)據(jù)的誤碼等錯誤,數(shù)據(jù)傳送正確,傳輸速率可達(dá)30 MHz/s以上,滿足設(shè)計要求。


[此貼子已經(jīng)被admin于2010-1-14 17:49:42編輯過]
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表