基于FPGA和VHDL的USB2.0控制器設計
由于USB2.0協(xié)議定義的事務操作以8bit為單位,因此完成一次32bit的DMA操作需要進行4次寫8bit。內(nèi)部DMA采用高效的One-hot狀態(tài)機設計方法,狀態(tài)轉(zhuǎn)換如圖7所示。當需要將接收到的數(shù)據(jù)存儲到SRAM(rx_dma_en=1)時進入WAIT_MRD狀態(tài),在該狀態(tài)選中一個臨時數(shù)據(jù)寄存器,并向存儲器發(fā)送請求信號mreq,從存儲器中預取4字節(jié)(當接收到的數(shù)據(jù)少于4字節(jié)時,保證有4字節(jié)的數(shù)據(jù)寫入存儲器)到該寄存器中,然后進入MEM_WR狀態(tài)。當PL的分組拆裝器接收到1字節(jié)數(shù)據(jù)時,將該字節(jié)寫入臨時存儲器,轉(zhuǎn)入下一狀態(tài)MEM_WR1;當分組拆裝器沒數(shù)據(jù)給DMA仲裁器時則進入MEM_WR2狀態(tài),在此狀態(tài)將臨時存儲器中的數(shù)據(jù)寫入SRAM,然后回到IDLE狀態(tài)。在操作過程中,使用計數(shù)器adr_cb對傳輸字節(jié)數(shù)進行計數(shù),通過addr_cb[1:0]的值標識當前傳輸?shù)氖?2bit中的哪個字節(jié)。計數(shù)器sizu_c每接收1字節(jié)數(shù)值加1。
在需要讀取SRAM中的數(shù)據(jù)(tx_dma_en=1)時,DMA仲裁器由IDIE狀態(tài)進入MEM_RD1狀態(tài),讀取4字節(jié)數(shù)據(jù)到發(fā)送緩沖區(qū)中,然后進入狀態(tài)MEM_RD2,再讀4字節(jié)進入狀態(tài)MEM_RD3,這8字節(jié)輪流使用Buffer0和Buffer1緩沖區(qū):
在需要讀取SRAM中的數(shù)據(jù)(tx_dma_en=1)時,DMA仲裁器由IDLE狀態(tài)進入MEM_RD1狀態(tài),讀取4字節(jié)數(shù)據(jù)到發(fā)送緩沖區(qū)中,然后進入狀態(tài)MEM_RD2,再讀4字節(jié)進入狀態(tài)MEM_RD3,這8字節(jié)輪流使用Buffer0和Buffer1緩沖區(qū):
if((NOT adr_cb[2]) AND mack
then Buffer0=SRAM_DATA_I;
elsif (adr_cb[2] AND mack)
then Buffer1=SRAM_DATA_I;
end if;
在MEM_RD3狀態(tài)判斷是否還需要讀下一個數(shù)據(jù),如果需要再進入狀態(tài)MEM_RD2,否則在傳輸完所有字節(jié)后,返回到IDLE狀態(tài)。在發(fā)送數(shù)據(jù)過程中,使用14bit計數(shù)器sizd_c決定傳輸字節(jié)數(shù),取自Ep_BUF[30:17],每發(fā)送1字節(jié)數(shù)據(jù),它的值減1。在圖7中的各個狀態(tài)中,由于超時、CRC校驗錯誤或得到的數(shù)據(jù)發(fā)生錯誤時,PE產(chǎn)生的Abort信號會使當前狀態(tài)都回到IDLE。
文中闡述了USB2.0功能控制器的一種實現(xiàn)方案。 其VHDL語言實現(xiàn)代碼,已在XILINX公司的FPGA Virtex XVV3006fg456中通過了Xilinx ISE的仿真、綜合及布局布線。FPGA的規(guī)模是32萬門,1536個CLB(可配置邏輯單元)。該控制模塊占用2050個Slice(66%),使用了1697個Slice觸發(fā)器(27%)和3047個4輸入LUT表(49%)。整個FPGA的速度可達到56.870MHz,完全滿足視頻數(shù)據(jù)的高速傳輸(對32bit數(shù)據(jù)操作,達到480Mb/s的速度時鐘只需15MHz)。該方案實現(xiàn)的控制器便于修改且易于實現(xiàn),可作為一個功能模塊嵌入到SOC中,可使不同情況最大限度地靈活設計片上系統(tǒng)。
評論