USB2.0的開發與設置主要包括三部分,第一:基於keil 的USB2.0的固件開發,這里主要是借用黑金開發板516上面自帶的固件進行相關的設置預配置:第二:是基於C# 或者C++對於USB2.0的上位機的開發;第三:主要是基於FPGA的對於USB2.0的同步傳輸。
首先,通過固件修改將USB2.0配置為同步傳輸模式,這里用到的是EZ-USB,板載芯片是Cypress68013A。黑金開發板默認的是異步傳輸。
將固件中的IFCONFIG 寄存器配置成為0xE3,即配置成了同步模式,即圖示位置
將改好后的固件編譯后,同過黑金提供的上位機,將生成的HEX文件或者IIC文件下載到USB2.0中,重新上電即可,如下圖所示DONWLOAD是用來下載HEX文件,掉電丟失;LG EEPROM是用來下載IIC文件時機哦保存在RRPROm中的。
固件配置好后就是 FPGA Verilog 程序設計了;在本次測試中實現的是FPGA想USB中寫數據,在PC端通過上位機顯示出來。代碼很少;
1 module top( 2 // system signals 3 input s_rst_n , 4 // system signals 5 input usb_ifclk , 6 input usb_full , 7 input usb_empty , 8 output wire usb_slcs , 9 output wire usb_slwr , 10 output wire usb_slrd , 11 output wire usb_sloe , 12 output wire [ 1:0] usb_fifoadr , 13 output reg [15:0] usb_fdata 14 ); 15 16 //========================================================================\ 17 // =========== Define Parameter and Internal signals =========== 18 //========================================================================/ 19 20 reg usb_slwr_reg ; 21 22 //============================================================================= 23 //************** Main Code ************** 24 //============================================================================= 25 assign usb_slcs = 1'b0; 26 assign usb_slwr = (usb_full == 1'b1 && usb_slwr_reg == 1'b0) ? 1'b0 : 1'b1; 27 assign usb_slrd = 1'b1; 28 assign usb_sloe = 1'b1; 29 assign usb_fifoadr = 2'b10; // 2,4,6,8 30 31 32 always @(posedge usb_ifclk or negedge s_rst_n) begin 33 if(s_rst_n == 1'b0) 34 usb_slwr_reg <= 1'b1; 35 else if(usb_full == 1'b1) 36 usb_slwr_reg <= 1'b0; 37 else 38 usb_slwr_reg <= 1'b1; 39 end 40 41 42 always @(posedge usb_ifclk or negedge s_rst_n) begin 43 if(s_rst_n == 1'b0) 44 usb_fdata <= 'd0; 45 else if(usb_slwr == 1'b0) 46 usb_fdata <= usb_fdata + 1'b1; 47 end 48 49 50 endmodule
介紹一下端口的設計:usb_ifclk :是輸入時鍾這是針對於FPGA來說,數據的輸出和時鍾都是基於此時鍾,同步寫數據的時候。
usb_full:寫滿標志,因為我們設置的是slave FIFO模式。高電平表示為寫滿,拉低的是后標志寫滿。
usb_empty:讀空標志,高電平表示沒有讀空,拉低表示讀空。
usb_scls:片選信號
usb_sloe:輸出使能信號,
usb_slrd:;讀觸發信號
usb_slwr:寫出發信號
usb_fifoadr[1:0]:表示你要操作那個FIFO
usb_fifodata[15:0]:表示傳輸的數據位。
在數據手冊中我們可以總結出的信號連接圖在SlaveFIFO方式下,FPGA與FX2的連接信號圖如圖:
在數據手冊中各個管腳的作用:
下面是信號線的說明。
IFCLK:FX2輸出的時鍾,可作為通信的同步時鍾。
FLAGA、FLAGB、FLAGC、FLAGD:FX2輸出的FIFO狀態信息,如滿、空等。
SLCS:FIFO的片選信號,外部邏輯控制,當SLCS輸出高時,不可進行數據傳輸。
SLOE:FIFO輸出使能,外部邏輯控制,當SLOE無效時,數據線不輸出有效數據。
SLRD:FIFO讀信號,外部邏輯控制,同步讀時,FIFO指針在SLRD有效時的每個IFCLK的上升沿遞增,異步讀時,FIFO讀指針在SLRD的每個有效至無效的跳變沿時遞增。
SLWR:FIFO寫信號,外部邏輯控制,同步寫時,在SLWR有效時的每個IFCLK的上升沿時數據被寫入,FIFO指針遞增,異步寫時,在SLWR的每個有效至無效的跳變沿時數據被寫入,FIFO寫指針遞增。
PKTEND:包結束信號,外部邏輯控制,在正常情況下,外部邏輯向FX2的FIFO中寫數,當寫入FIFO端點的字節數等於FX2固件設定的包大小時,數據將自動被打成一包進行傳輸,但有時外部邏輯可能需要傳輸一個字節數小於FX2固件設定的包大小的包,這時,它只需在寫入一定數目的字節后,聲明此信號,此時FX2硬件不管外部邏輯寫入了多少字節,都自動將之打成一包進行傳輸。
FD[15:0]:數據線。
FIFOADR[1:0]:選擇4個FIFO端點的地址線,外部邏輯控制。
邏輯思維梳理:
當按照以上所述的模式設置時。USB與PC端通信可以理解為以下模式:
官方同步寫數據的時序圖:
可以理解為以下時序圖:
后續》》》》》