利用FPGA實現外設通信接口之: 典型實例-USB 2.0接口的設計與實現

2020-12-11 電子產品世界

本文引用地址:http://www.eepw.com.cn/article/201706/348803.htm

10.7典型實例17:USB2.0接口的設計與實現

10.7.1實例的內容及目標

1.實例的主要內容

本節旨在設計實現了FPGA通過FX2USB2.0接口晶片與PC機進行高速數據通信,分為讀數據、寫數據和讀寫數據3部分內容。幫助讀者進一步了解USB接口晶片的工作原理和設計方法。

2.實例目標

通過本實例,讀者應達到如下目標。

·了解FX2CY7C68013晶片的工作原理和SlaveFIFO模式時序。

·了解FX2的固件設計以及USB驅動程序設計。

·熟練掌握狀態機的使用。

·實現FPGA與PC機之間的USB接口通信。

10.7.2USB接口通信實戰步驟

首先創建工程並為工程添加文件,如圖10.30所示。

然後編譯工程並下載至硬體,如圖10.31所示。

圖10.30創建工程並添加文件 圖10.31編譯工程並下載

接下來可以加載固件了,固件程序的載入有兩種方式。

(1)通過晶片的I2C總線連接外部的EEPROM,固件代碼事先通過燒寫器寫入EEPROM中,USB設備上電運行時,通過I2C總線將EEPROM中固件代碼載入。EZ-USB支持外部EEPROM通過總線來下載固件,這種方式使開發者可以從外圍硬體來下載8051程序代碼,但是不利於在設備開發階段使用。

(2)使用該晶片特有軟配置功能,將固件程序存儲在計算機中,當該設備接入USB電纜時,由於EZ-USB具有重新枚舉的能力,所以在初始化枚舉以後,用戶只需要通過Cypress公司提供的開發軟體USBControlPanel中Download項,就可以將固件載入到控制晶片中。該方法完全是軟操作,不需要額外的硬體設備,方便程序的修改調試。

使用USBControlPanel進行固件程序下載的界面如圖10.32所示。

圖10.32USBControlPanel界面

單擊「Download…」按鈕,選擇「slavefifo.hex」。下載固件成功以後顯示如圖10.33信息。

圖10.33下載固件程序

其中,通過單擊「GetPipes」按鈕可以查看通道信息。

現在固件程序後,即可進行USB通信測試。

根據不同的程序,選擇相應的測試軟體,測試USB接口的傳輸速度。如圖10.34所示是RedLogic工作室提供的基於紅色颶風II的USB測試軟體。

圖10.34USB測試軟體

10.7.3USB接口通信實例結果

實現FPGA與PC機之間的USB通信,並且在PC機的超級終端上面測試USB的讀寫速度,如圖10.35和圖10.36所示。關於EZ-USB的詳細內容,可參見工程文件夾中提供的相關文檔。

圖10.35USB測試結果

圖10.36USB測試結果

10.7.4FPGA代碼的設計實現

本程序功能是配合CY68013的SlaveFIFO接口時序。它完成接收從主機下傳的60KB數據,寫入板上SRAM裡,然後從板上SRAM中讀出,再上傳至主機。整個傳輸過程通過CY68013的SlaveFIFO來交互。

整個程序由一個狀態機構成,包括以下狀態:

ParameterIDLE=H0,

READ_EVENT=H1,

POINT_TO_OUT_FIFO=H2,

DATA_READY=H3,

READ_INTERVAL=H4,

READ=H5,

READ_END=H6,

WRITE_EVENT=H7,

POINT_TO_IN_FIFO=H8,

WRITE_READY=H9,

WRITE=HA,

WRITE_END=HB;

每個狀態的作用描述如下。

·IDLE:整個操作過程(包括讀SLAVEFIFO和寫SLAVEFIFO)的入口。對相關的寄存器進行初始化,然後轉入READ_EVENT狀態,開始讀SLAVEFIFO操作。

·READ_EVENT:把u_addr[1:0]置為』b00,指向輸出FIFO(對應端點6),然後轉入POINT_TO_OUT_FIFO狀態。

·POINT_TO_OUT_FIFO:判斷u_flagc是否為高(u_flagc為高指示輸出FIFO為空,即輸出FIFO中有數據),如果為高,則啟動讀過程,把u_sloe置為低,轉入DATA_READY狀態,第一個16位數據出現在總線上;否則說明輸出FIFO中無數據,等待。

·DATA_READY:判斷u_flagc是否為高,如果為高,把u_slrd拉低,繼續讀取下16位數據。同時為把上一16位數據寫入SRAM做準備(主要是SRAM的三態總線),同時轉入READ狀態,否則轉入POINT_TO_OUT_FIFO,等待下一次讀取過程。

·READ:把上一16位數據寫入SRAM,同時把u_slrd拉高,當前16位數據讀取結束。判斷是否是60KB數據,如果不是,則轉入DATA_READY狀態,繼續讀操作;否則轉入READ_END狀態,讀操作結束。

·READ_END:把相關寄存器置為初始態,轉入WRITE_EVENT狀態,開始寫操作。

·POINT_TO_IN_FIFO:為從SRAM中讀取數據作準備,轉入WRITE_READY狀態。

·WRITE_READY:判斷u_flagb是否為高(u_flagb為高指示輸入FIFO非滿),如果為高,則啟動寫過程,從SRAM中讀取數據並送到SLAVEFIFO總線上,把u_lswr置為低,轉入WRITE狀態;否則說明輸入FIFO已滿,等待。

·WRITE:把u_slwr置為高,當前數據寫入SLAVEFIFO。判斷是否是60KB數據,如果不是,則轉入WRITE_READY狀態,繼續寫操作;否則轉入WRITE_END狀態,寫操作結束。

·WRITE_END:把相關寄存器置為初始態,轉入IDLE狀態,開始下一個60KB的讀寫操作。

狀態機的原始碼如下:

case(STATE)

IDLE:

begin

//添加RESET狀態

data_wr=h0; //USB接口信號初始化

u_slwr=b1;

u_slrd=b1;

u_sloe=b1;

u_addr0=b1;

u_addr1=b1;

oe=b0;

sram_d_i=h0; //SRAM的控制信號初始化

sram_a=h3ffff;

sram_re=b1;

sram_wr=b1;

wr_flag=b0;

STATE=READ_EVENT;

end

READ_EVENT:

begin

wr_flag=b1; //設定讀寫標誌

u_addr0=b0; //指定端點FIFO

u_addr1=b0;

STATE=POINT_TO_OUT_FIFO;

end

POINT_TO_OUT_FIFO:

begin

if(u_flagc) //如果flagc高,FIFO不空,開始讀數據

begin

u_sloe=b0; //開始從FX2的端點FIFO讀數據

u_slrd=b1;

STATE=DATA_READY;

end

else

begin //如果flagc為低,FIFO為空,等待FIFO有數據

u_sloe=b1; //停止從FX2的端點FIFO讀數據

u_slrd=b1;

STATE=POINT_TO_OUT_FIFO;

end

end

DATA_READY:

begin

if(u_flagc) //如果flagc為高,繼續讀取下一個數據

begin

u_slrd=b0;

sram_a=sram_a+1; //把上一個讀取的數據寫入SRAM

sram_d_i=data;

sram_wr=b0;

sram_re=b1;

STATE=READ; //完成數據寫入後,進入讀數據狀態

end

else

begin

u_slrd=b1; //如果FIFO空,回到等待狀態

u_sloe=b1;

STATE=POINT_TO_OUT_FIFO;

end

end

READ:

Begin

u_slrd=b1; //完成上一個數據的SRAM寫周期

sram_re=b1;

sram_wr=b1;

if(sram_a!=ADDR_FULL) //如果SRAM地址沒有到最大值,繼續讀操作

STATE=DATA_READY;

else

STATE=READ_END; //如果SRAM地址到達最大值,結束讀操作

end

READ_END:

begin

u_slrd=b1; //回到初始狀態,準備寫操作

u_sloe=b1;

u_addr0=b0;

u_addr1=b0;

sram_a=h3ffff;

STATE=WRITE_EVENT;

end

WRITE_EVENT:

begin

u_addr0=b0; //指定寫數據的端點FIFO

u_addr1=b1;

oe=b1;

wr_flag=b0;

STATE=POINT_TO_IN_FIFO;

end

POINT_TO_IN_FIFO:

begin

sram_a=sram_a+1; //從SRAM中讀取一個數據

sram_re=b0;

sram_wr=b1;

STATE=WRITE_READY;

end

WRITE_READY:

begin

if(u_flagb)

begin //如果FIFO不滿,開始寫數據到FX2的FIFO

data_wr=sram_d;

u_slwr=b0;

u_slrd=b1;

STATE=WRITE;

end

else

begin

u_slwr=b1; //如果FIFO已滿,等待

u_slrd=b1;

STATE=WRITE_READY;

end

end

WRITE:

begin

u_slwr=b1;

u_slrd=b1;

if(sram_a!=ADDR_FULL)

begin

sram_a=sram_a+1; //如果SRAM地址沒有達到最大值,繼續從SRAM讀數據

sram_wr=b1;

sram_re=b0;

STATE=WRITE_READY;

end

else

begin

sram_a=h3ffff;//如果SRAM地址達到最大值,復位SRAM地址,進入寫結束

sram_wr=b1;

sram_re=b1;

STATE=WRITE_END;

end

end

WRITE_END:

begin

wr_flag=b0; //結束寫FX2FIFO狀態,回到初始的IDLE狀態

sram_a=h3ffff;

u_addr0=b1;

u_addr1=b1;

STATE=IDLE;

end

default:

STATE=IDLE;

endcase

10.7.5小結

本節對利用USB接口晶片FX2來完成FPGA和PC機的高速數據傳輸做了介紹,並通過編譯下載在紅色颶風的開發板上實現了預定功能。

相關焦點

  • USB3.0接口技術與電路設計
    摘 要:USB作為一種新型的接口技術,以其簡單易用、速度快等特點而備受青睞。本文簡要介紹USB 接口的特點、硬體結構、數據流傳送以及外設控制器的實現方式。並詳細說明利用51單片機結合PHILIPS公司的PDIUSBD12帶並行總線的USB接口器件設計帶DMA工作模式的可供視頻信號傳輸的多功能USB接口電路的過程。
  • 基於FPGA的RS232行列式矩陣鍵盤接口設計
    一、引言本文引用地址:http://www.eepw.com.cn/article/245960.htm本方案是用VHDL語言來實現的基於RS232按位串行通信總線的行列式矩陣鍵盤接口電路
  • 基於JTAG接口實現ARM的FPGA在線配置
    SDR技術要求通信終端具有可重配置能力,根據特定通信網絡情況,動態地改變調製/解調、編解碼、交織/解交織等方案。在線配置(In Sys—tem Programming,ISP)或者動態配置FPGA就是一種重要的SDR實現技術。本文介紹作者開發實現的一種基於ARM的嵌入式Linux下通過JTAG接口動態配置FPGA的方法。
  • 基於CH371的USB接口虛擬示波器設計
    而現在電腦的普及程度也達到了相當的規模,利用電腦以及附加的數採模塊實現一個靈活便捷的虛擬示波器能夠滿足大多數的工作、學習和開發需要,並且可以通過較低代價的硬體和軟體升級實現相當複雜的信號處理功能,能夠以較低的成本、較小的體積實現配置靈活的智能儀器組合;完全可以與便攜電腦結合,構成可攜式檢測維修工作站。
  • USB接口擴展與差分信號仿真
    1.1 USB接口的特點  以前的外部設備是通過RS232、RS485、並行接口、PCI接口和PS/2接口等老式專用接口來實現與計算機的通信。  1.2 接口布置  USB是一種常用的pc接口,他只有4根線,兩根電源兩根信號,故信號是串行傳輸的,usb接口也稱為串行口,usb2.0的速度可以達到480Mbps。可以滿足各種工業和民用需要。
  • 基於I2C總線技術的USB接口設計
    同時,他也得到了各PC廠商、晶片製造商和PC外設廠商的廣泛支持,USB外設在國內外以驚人的速度發展,迄今為止,各種USB的外設已經有數千種。為PC外圍設備設計USB接口已成為大勢所趨。         隨著單片機技術的發展,單片機的功能日益強大,外圍電路日益複雜,其有限的管腳也就顯 得捉襟見肘。
  • USB接口是如何進行通信的?
    打開APP USB接口是如何進行通信的?   我們已經知道,傳統的串行口、並行口通過握手信號進行通信,這些接口通常通過握手信號來聯絡主機和外設。我們也已經知道,通信雙方可以同步或異步兩種方式進行通信,兩者最大的區別是,同步通信接口中有時鐘信號線。   USB接口應用很廣。可是,USB接口中既沒有握手信號,也沒有時鐘信號,它是怎樣在主機與外設之間建立聯繫的呢?又是如何交換數據的呢?
  • usb接口類型有哪些_usb接口類型大全
    2.攜帶方便。USB設備大多以「小、輕、薄」見長,對用戶來說,隨身攜帶大量數據時,很方便。當然USB硬碟是首要之選了。 3.標準統一。大家常見的是IDE接口的硬碟,串口的滑鼠鍵盤,並口的印表機掃描儀,可是有了USB之後,這些應用外設統統可以用同樣的標準與個人電腦連接,這時就有了USB硬碟、USB滑鼠、USB印表機等等。 4.可以連接多個設備。
  • 基於Modelsim FLI接口的FPGA仿真技術
    >是 Model Technology(Mentor Graphics的子公司)的 HDL 硬體描述語言仿真軟體,可以實現 VHDL, Verilog,以及 VHDL-Verilog 混合設計的仿真。除此之外,Modelsim還能夠與 C 語言一起實現對 HDL 設計文件的協同仿真。同時,相對於大多數的 HDL 仿真軟體來說,Modelsim 在仿真速度上也有明顯優勢。這些特點使 Modelsim 越來越受到 EDA設計者、尤其是 FPGA 設計者的青睞。
  • 基於FPGA的航空總線協議接口設計
    它利用一條屏蔽的雙絞線進行帶有時鐘信息的數據傳輸。高可靠性1553B已成為我國航空航天領域廣泛採用的軍用總線標準。由於1553B總線協議控制器基本依賴於進口的專用器件,價格昂貴,還受到限制,並且這些器件需要外圍的硬體電路配合工作,如果完成整個總線接口板的設計,還需要單獨的MCU,集成度不高,這樣就在某種程度上限制了設計能力。
  • 利用Android智慧型手機及USB接口與1-Wire從設備通信
    引言本文引用地址:http://www.eepw.com.cn/article/246299.htm  本文介紹如何利用安卓Android®智慧型手機上的USB口與從設備通信,而無需計算機系統。文中給出的例子使用Android手機上的USB埠通過1-Wire®總線與Thermochron® iButton®溫度記錄器通信。
  • 【USB接口的奧秘】讓大家都懂USB通信原理
  • 配置子接口實現 VLAN 間通信的示例
    組網要求:在某運營商用戶接入場景中,當接入用戶數量較多時會導致數據通信衝突嚴重、廣播泛濫、性能顯著下降甚至造成網絡不可用等問題,為了有效減少以上問題,在組網中對接入的用戶根據企業需要劃分到不同的VLAN中,使得同VLAN之間的用戶可以二層通信,不同VLAN之間的用戶通過AR1上的子接口進行三層通信,且廣播報文限制在同
  • 為啥不用USB3.0 細說鍵鼠接口那些事
    IBM當時並未為滑鼠設計專用接口,外設廠商為保證滑鼠兼容性,利用電腦必備的串行接口通迅協議來設計滑鼠,原本為通用性設備設計的串口,成為了當時滑鼠的標準接口。4USB2.0 通用性與速率的完美融合    早期USB鍵鼠使用USB1.0/1.1協議設計,通過轉接頭轉換後,依舊可以在PS/2接口上使用,這一設計可以保證用戶在USB接口數量不足時,只需配備一個小小的轉接頭就可以通過鍵鼠專用接口與電腦進行連接
  • 實現一維與二維信號顯示的VGA的接口時序和系統設計
    在某些情況下,設計者希望通過普通的顯示器或投影儀觀測FPGA內部的一些矢量信號,即把帶VGA接口的顯示器當作示波器使用等,這就需要對數據進行處理,使之能夠在顯示器上實時顯示。 本文基於DSP Builder的VGA接口設計方法,對VGA接口時序和系統設計需求進行了介紹,並在硬體平臺下實現一維與二維信號的顯示。
  • 基於BlueCore2External藍牙晶片的USB接口設計
    工作電源為1.8 V,相對該公司的第一代藍牙產品BlueCore1提高了內部的RAM(3 2 kB),對擴展的外部FLASH提高到了8 Mb,且能量消耗更低。採用BlueCore2Extern al晶片進行設計減少了外部射頻元件的數目,確保產品模塊的成本減到最小。裝置合併自動校正和建立內部的自我測試程序使發展簡單化,類型一致和實現生產測試。
  • 計算機的並行接口(2)
    2.2)Nibble模式:用於從印表機或外部設備得到反向數據的常用方式,Nibble模式利用4條狀態線把數據從外設傳回電腦。標準的並行口提供5條外設到PC機的信號線,用於指示外設的狀態,利用這些信號線,外設可以分2次發送1位元組(8-bit)數據,每次發半字節(nibble:4-bit)信息。
  • 基於USB2I2C接口的CMOS圖像傳感器在線調試系統
    本文引用地址:http://www.eepw.com.cn/article/201610/307184.htmUSB(Universal Serial Bus)總線接口是一種PC機與外圍設備間高速通信接口,具有速率快,熱插拔等特性,可以廣泛應用於與計算機通信;I2C(Inter-Integrated Circuit Bus)總線以兩根連線實現全雙工同步數據傳送
  • thunderbolt接口是什麼_thunderbolt接口有什麼用_thunderbolt怎麼用
    該t技術由英特爾在2009年設計完成並定名為「Light Peak」(研發代號)。   Thunderbolt的研發初衷是為了替代並統一目前電腦上數量繁多性能參差不齊的擴展接口,比如SCSI, SATA, USB, FireWire和 PCI Express。 Thunderbolt 是蘋果與英特爾(Intel)的合作產物,由Intel開發,通過和蘋果的技術合作推向市場。
  • 3G系統中AGC的FPGA設計實現
    agc增益控制算法在數字部分來實現,在本設計中,agc電路可以有效提高鏈路的動態範圍(+25~-105 dBm),提高ADC輸出的SNR,以使DSP能更容易地實現Dw-PTS同步。agc在系統中的位置如圖1虛線框所示:    3 agc系統的fpga實現    根據agc所實現的功能  ,在fpga中將agc模塊分為如下幾個部分來實現:  3.1 數據幹路模塊    從RSP接口來10位二進位補碼數據I1和Q1,與求指數模塊傳送來的預放大增益