<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 利用FPGA實(shí)現外設通信接口之: 典型實(shí)例-USB 2.0接口的設計與實(shí)現

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

作者: 時(shí)間:2017-06-05 來(lái)源:網(wǎng)絡(luò ) 收藏

本文引用地址:http://dyxdggzs.com/article/201706/348803.htm

10.7典型實(shí)例17:接口的設計與實(shí)現

10.7.1實(shí)例的內容及目標

1.實(shí)例的主要內容

本節旨在設計實(shí)現了通過(guò)接口芯片與PC機進(jìn)行高速數據通信,分為讀數據、寫(xiě)數據和讀寫(xiě)數據3部分內容。幫助讀者進(jìn)一步了解USB接口芯片的工作原理和設計方法。

2.實(shí)例目標

通過(guò)本實(shí)例,讀者應達到如下目標。

·了解CY7C68013芯片的工作原理和SlaveFIFO模式時(shí)序。

·了解的固件設計以及USB驅動(dòng)程序設計。

·熟練掌握狀態(tài)機的使用。

·實(shí)現與PC機之間的USB接口通信。

10.7.2USB接口通信實(shí)戰步驟

首先創(chuàng )建工程并為工程添加文件,如圖10.30所示。

然后編譯工程并下載至硬件,如圖10.31所示。

圖10.30創(chuàng )建工程并添加文件 圖10.31編譯工程并下載

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

(1)通過(guò)芯片的I2C總線(xiàn)連接外部的EEPROM,固件代碼事先通過(guò)燒寫(xiě)器寫(xiě)入EEPROM中,USB設備上電運行時(shí),通過(guò)I2C總線(xiàn)將EEPROM中固件代碼載入。EZ-USB支持外部EEPROM通過(guò)總線(xiàn)來(lái)下載固件,這種方式使開(kāi)發(fā)者可以從外圍硬件來(lái)下載8051程序代碼,但是不利于在設備開(kāi)發(fā)階段使用。

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

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

圖10.32USBControlPanel界面

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

圖10.33下載固件程序

其中,通過(guò)單擊“GetPipes”按鈕可以查看通道信息。

現在固件程序后,即可進(jìn)行USB通信測試。

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

圖10.34USB測試軟件

10.7.3USB接口通信實(shí)例結果

實(shí)現與PC機之間的USB通信,并且在PC機的超級終端上面測試USB的讀寫(xiě)速度,如圖10.35和圖10.36所示。關(guān)于EZ-USB的詳細內容,可參見(jiàn)工程文件夾中提供的相關(guān)文檔。

圖10.35USB測試結果

圖10.36USB測試結果

10.7.4FPGA代碼的設計實(shí)現

本程序功能是配合CY68013的SlaveFIFO接口時(shí)序。它完成接收從主機下傳的60KB數據,寫(xiě)入板上SRAM里,然后從板上SRAM中讀出,再上傳至主機。整個(gè)傳輸過(guò)程通過(guò)CY68013的SlaveFIFO來(lái)交互。

整個(gè)程序由一個(gè)狀態(tài)機構成,包括以下?tīng)顟B(tài):

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;

每個(gè)狀態(tài)的作用描述如下。

·IDLE:整個(gè)操作過(guò)程(包括讀SLAVEFIFO和寫(xiě)SLAVEFIFO)的入口。對相關(guān)的寄存器進(jìn)行初始化,然后轉入READ_EVENT狀態(tài),開(kāi)始讀SLAVEFIFO操作。

·READ_EVENT:把u_addr[1:0]置為’b00,指向輸出FIFO(對應端點(diǎn)6),然后轉入POINT_TO_OUT_FIFO狀態(tài)。

·POINT_TO_OUT_FIFO:判斷u_flagc是否為高(u_flagc為高指示輸出FIFO為空,即輸出FIFO中有數據),如果為高,則啟動(dòng)讀過(guò)程,把u_sloe置為低,轉入DATA_READY狀態(tài),第一個(gè)16位數據出現在總線(xiàn)上;否則說(shuō)明輸出FIFO中無(wú)數據,等待。

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

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

·READ_END:把相關(guān)寄存器置為初始態(tài),轉入WRITE_EVENT狀態(tài),開(kāi)始寫(xiě)操作。

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

·WRITE_READY:判斷u_flagb是否為高(u_flagb為高指示輸入FIFO非滿(mǎn)),如果為高,則啟動(dòng)寫(xiě)過(guò)程,從SRAM中讀取數據并送到SLAVEFIFO總線(xiàn)上,把u_lswr置為低,轉入WRITE狀態(tài);否則說(shuō)明輸入FIFO已滿(mǎn),等待。

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

·WRITE_END:把相關(guān)寄存器置為初始態(tài),轉入IDLE狀態(tài),開(kāi)始下一個(gè)60KB的讀寫(xiě)操作。

狀態(tài)機的源代碼如下:

case(STATE)

IDLE:

begin

//添加RESET狀態(tài)

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; //設定讀寫(xiě)標志

u_addr0=b0; //指定端點(diǎn)FIFO

u_addr1=b0;

STATE=POINT_TO_OUT_FIFO;

end

POINT_TO_OUT_FIFO:

begin

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

begin

u_sloe=b0; //開(kāi)始從FX2的端點(diǎn)FIFO讀數據

u_slrd=b1;

STATE=DATA_READY;

end

else

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

u_sloe=b1; //停止從FX2的端點(diǎn)FIFO讀數據

u_slrd=b1;

STATE=POINT_TO_OUT_FIFO;

end

end

DATA_READY:

begin

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

begin

u_slrd=b0;

sram_a=sram_a+1; //把上一個(gè)讀取的數據寫(xiě)入SRAM

sram_d_i=data;

sram_wr=b0;

sram_re=b1;

STATE=READ; //完成數據寫(xiě)入后,進(jìn)入讀數據狀態(tài)

end

else

begin

u_slrd=b1; //如果FIFO空,回到等待狀態(tài)

u_sloe=b1;

STATE=POINT_TO_OUT_FIFO;

end

end

READ:

Begin

u_slrd=b1; //完成上一個(gè)數據的SRAM寫(xiě)周期

sram_re=b1;

sram_wr=b1;

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

STATE=DATA_READY;

else

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

end

READ_END:

begin

u_slrd=b1; //回到初始狀態(tài),準備寫(xiě)操作

u_sloe=b1;

u_addr0=b0;

u_addr1=b0;

sram_a=h3ffff;

STATE=WRITE_EVENT;

end

WRITE_EVENT:

begin

u_addr0=b0; //指定寫(xiě)數據的端點(diǎn)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中讀取一個(gè)數據

sram_re=b0;

sram_wr=b1;

STATE=WRITE_READY;

end

WRITE_READY:

begin

if(u_flagb)

begin //如果FIFO不滿(mǎn),開(kāi)始寫(xiě)數據到FX2的FIFO

data_wr=sram_d;

u_slwr=b0;

u_slrd=b1;

STATE=WRITE;

end

else

begin

u_slwr=b1; //如果FIFO已滿(mǎn),等待

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地址沒(méi)有達到最大值,繼續從SRAM讀數據

sram_wr=b1;

sram_re=b0;

STATE=WRITE_READY;

end

else

begin

sram_a=h3ffff;//如果SRAM地址達到最大值,復位SRAM地址,進(jìn)入寫(xiě)結束

sram_wr=b1;

sram_re=b1;

STATE=WRITE_END;

end

end

WRITE_END:

begin

wr_flag=b0; //結束寫(xiě)FX2FIFO狀態(tài),回到初始的IDLE狀態(tài)

sram_a=h3ffff;

u_addr0=b1;

u_addr1=b1;

STATE=IDLE;

end

default:

STATE=IDLE;

endcase

10.7.5小結

本節對利用USB接口芯片FX2來(lái)完成FPGA和PC機的做了介紹,并通過(guò)編譯下載在紅色颶風(fēng)的開(kāi)發(fā)板上實(shí)現了預定功能。



關(guān)鍵詞: USB2.0 FX2 FPGA 高速數據傳輸

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>