• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統 > 設計應用 > 基于FPGA和VHDL的USB2.0控制器設計

    基于FPGA和VHDL的USB2.0控制器設計

    作者: 時間:2010-05-21 來源:網絡 收藏

      2.2 協議層

      控制器的核心邏輯位于PL(Protocl Layer)模塊,負責管理所有USB數據I/O和控制通信,其結構如圖4所示。

    基于FPGA和VHDL的USB2.0控制器設計

      DMA和存儲器接口提供隨機存儲器訪問和DMA操作。該模塊使PL和外部微控制器采用DMA方式訪問SSRAM。當外部總線有訪問SRAM的請求時,且PL沒有請求訪問存儲器,控制邏輯如下:req、ack分別對應外部總線和存儲器之間的請求和響應信號,din、addr和we分別是外部總線給出的數據、地址和寫信號,mreq是內部DMA向存儲器發送的請求信號,mdin、maddr和mwe分別是內部DMA給出的數據、地址和寫信號。

      sel =(req OR ack_r) AND(NOT mreq);

      if sel='1' then

      sram_out=din;

      sram_adr=addr;

      sram_we=req AND we;

      else

      sram_out=mdin;

      sram_adr=maddr;

      sram_we =mwe;

      end if;

      由控制邏輯可看出,內部DMA操作的優先級比外部總線高。

      協議引擎(Protocol Engine)處理所有標準的USB握手信號和控制通信。分組組裝器組裝分組并送入輸出FIFO,先組裝分組頭,插入適當的PID(分組標識)和校驗和,然后加入數據域。分組拆裝器先解碼出PID和序列號以及校驗和,再從8位PID取低4位(或高4位取反)得到PID[3:0],通過USB2.0協議的PID類型定義譯碼出PID名,判斷是Token分組(OUT、IN、SOF和SETUP)還是DATA分組(DATA0、DATA1、DATA2和MDATA)。

      Pid_Token=pid_OUT OR pid_IN OR pid_SOF OR pid_SETUP;

      Pid_DATA =pid_DATA OR pid_DATA1 OR pid_DATA2 OR pid_MDATA;

      如果是Token分組(格式定義如圖5所示),則將后續的16bit數據分別放入兩個8bit臨時Token寄存器token0和token1,然后取出分組中的7位地址、4位端點號及5位CRC校驗碼。

    Token分組

      Token_fadr=token0[6:0];

      Token_endp=token1[2:0] token0[7];

      Token_crc5=token1[7:3];

      對于特殊的Token須進行特殊的處理,本文實現的控制器只對SOF這一特殊Token進行操作,解出PID后的11位幀號及5位CRC5校驗碼。

      Frame_no=token1[2:0] token0;

      Token_crc5=token1[7:3];

      檢驗校驗碼是否出錯,如果出錯等待下一個Token,否則將地址、端點號和幀號等放入相應寄存器。Token類型如果是IN,則執行組裝分組并發送寄分組;如果是OUT則拆卸接收到的數據分組。對于其他不支持的Token則視為錯誤處理:Pid_ERROR=pid_ACK OR pid_NACK OR pid_STALL OR pid_NYET OR pid_PRE OR pid_ERR OR pid_SPLIT OR pid_PING;如果出錯則不進行Token的解碼,而等待下一個Token的到來。

      如果是DATA分組,則緊接著PID的是最大載荷為1024字節的數據和16位CRC16校驗碼。對數據的處理先寫入端點寄存器,然后通過DMA操作寫入SSRAM。下面詳細介紹端點寄存器和DMA操作。



    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 巨鹿县| 江永县| 河间市| 黎城县| 巫山县| 石家庄市| 象州县| 深圳市| 广宁县| 新余市| 藁城市| 惠水县| 诏安县| 法库县| 乌兰县| 铜陵市| 罗田县| 德阳市| 大石桥市| 华蓥市| 外汇| 孝义市| 泸定县| 施秉县| 米脂县| 武隆县| 卫辉市| 重庆市| 江安县| 马山县| 莱州市| 大足县| 谢通门县| 海口市| 囊谦县| 禹州市| 陆川县| 青阳县| 贞丰县| 安图县| 洮南市|