usb文章.pdf
(558.74 KB, 下載次數(shù): 79)
2010-1-14 15:25 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
由于不能上傳圖片大家詳細(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編輯過]
|