USB英文全稱 Universal Serial Bus,即通用串行總線,是一個外部總線標準,用于規范電腦與外部設備的連接和通訊。
FTDI 公司的USB2.0 芯片FT232H 進行USB 通信
FH232H芯片在內部不僅完成了USB 硬件接口差分電平轉換,還封裝了USB 的相關協議,留出數據交互接口
FH232H可以默認配置為UART模式,還可配置為JTAG,FIFO,IIC,SPI,本次將其配置為FIFO進行實驗。
作為FPGA開發者只需要關注數據交互接口的時序即可實現USB功能。
MPSSE/Multi_purpose UART/FIFO controler:該模塊為多功能UART/FIFO 控制器,它集成了面向用戶的IO,直接負責與用戶端(FPGA)進行數據交互。當把FT232H 配置成不同的模式時,管腳會有不同的含義
(I/O是對于FT232H來說)
ADBUS[7:0]: (I/O) 數據端口,雙向IO接口(讀寫不能同時發生)
RD: (IN) FT232H中的數據輸出使能,由FPGA發送給FT232H,低電平有效
WR: (IN) FT232H中的數據輸入使能,由FPGA發送給FT232H,低電平有效
RXF: (OUT) FT232H中的FIFO數據可讀標志位,低電平有效
TXE: (OUT) FT232H中的FIFO數據可寫標志位,低電平有效
OE: (IN) FT232H中的數據輸出,低電平有效
CLKOUT: (OUT) 60MHz時鐘信號,由FT232H產生并傳遞給FPGA作為本次實驗主時鐘
SIWU: (OUT) FT232H中的數據立即發送使能,低電平有效
讀時序:232拉低RXF表示有數據可讀 > FPGA拉低OE使能輸出 > 等待數據有效 > FPGA拉低RD > 有效數據 > 232拉高RXF > 讀空 > FPGA需要同時拉高RD和OE
寫時序:232中FIFO未滿 > 232拉低TXE > FPGA拉低WR > 向232寫入數據 > 232拉高TXE > 寫滿
硬件設計:參考https://github.com/WangXuan95/FPGA-ftdi245fifo,正點原子達芬奇Pro
連接好硬件后進行FT232H模式修改:
在官網下載ft_prog
安裝后運行,去掉其他FT器件,按如圖所示操作
編寫代碼實現回環(參考正點原子源碼)
配置管腳,按硬件連接配置管腳
xilinx vivado FIFO IP核配置:
頂層模塊
moduleusb_loopback ( input usb_clk_60m, //FT232輸出的60M時鐘input sys_rst_n, //系統復位 ,低電平input usb_rxf_n, //FT232H中FIFO數據的可讀標input usb_txe_n, //FT232H中FIFO數據的可寫標output usb_oe_n, //FT232H數據輸出使能output usb_rd_n, //FT232H讀使能信號output usb_wr_n, //FT232H寫使能信號output usb_siwu_n, //send immediate/wake upoutput c7, //send immediate/wake upinout [7:0] usb_data //FT232H雙向數據總線); //wire definewire[7:0] fifo_data_in; //從FT232進到FPGA的數據wire[7:0] fifo_data_out; //從FPGA輸出到FT232的數據wire wr_en; //FPGA FIFO寫使能wire rd_en; //FPGA FIFO讀使能wire full; //FPGA FIFO寫滿信號wire empty; //FPGA FIFO讀空信號//*****************************************************//** main code//*****************************************************assignusb_siwu_n =1'b1; //立即發送,喚醒assignc7 =1'b1; //立即發送,喚醒//USB 同步FIFO讀寫 usb_rw u_usb_rw ( .usb_clk_60m(usb_clk_60m), .rst_n (sys_rst_n), .usb_rxf_n (usb_rxf_n), .usb_txe_n (usb_txe_n), .usb_oe_n (usb_oe_n), .usb_rd_n (usb_rd_n), .usb_wr_n (usb_wr_n), .fifo_wr_en(wr_en), .fifo_rd_en(rd_en), .empty (empty), .usb_data (usb_data), .fifo_data_in(fifo_data_in), .fifo_data_out(fifo_data_out) ); //FPGA FIFO調用 fifo_generator_0 u_fifo_generator_0 ( .clk (usb_clk_60m), // input wire clk.srst(1'b0), // input wire srst.din (fifo_data_in), // input wire [7 : 0] din.wr_en(wr_en), // input wire wr_en.rd_en(rd_en), // input wire rd_en.dout(fifo_data_out), // output wire [7 : 0] dout.full(full), // output wire full.empty(empty) // output wire empty ); // ila_0 u_ila_0 (// .clk(usb_clk_60m), // input wire clk// .probe0(fifo_data_out), // input wire [7:0] probe0 // .probe1(fifo_data_in), // input wire [7:0] probe1// .probe2({usb_rxf_n,usb_txe_n,usb_oe_n,usb_rd_n,usb_wr_n}), // input wire [7:0] probe2// .probe3(0) // input wire [7:0] probe3// );endmodule
USB模塊:
moduleusb_rw ( input usb_clk_60m, //FT232 輸出的60M 時鐘input rst_n, //系統復位 ,低電平//FT232Hinput usb_rxf_n, //FT232H 中FIFO 數據的可讀標志input usb_txe_n, //FT232H 中FIFO 數據的可寫標志outputreg usb_oe_n, //FT232H 數據輸出使能outputreg usb_rd_n, //FT232H 讀使能信號outputreg usb_wr_n, //FT232H 寫使能信號inout [7:0] usb_data, //FT232H 雙向數據總線//FPGA FIFOoutputreg fifo_wr_en, //FPGA FIFO寫使能outputreg fifo_rd_en, //FPGA FIFO讀使能input empty, //FPGA FIFO讀空信號input [7:0] fifo_data_out, //FPGA FIFO中讀出的數據outputreg[7:0] fifo_data_in //寫入FPGA FIFO的數據); // localparam definelocalparamIDLE =4'b001; //FT232H 空閑localparamREAD =4'b010; //FT232H 讀狀態,此時數據從FT232H發送到FPGAlocalparamWRITE =4'b100; //FT232H 寫狀態,此時數據從FPGA發送到FT232H//reg definereg[2:0] cur_state; //讀寫現狀態reg[2:0] next_state; //讀寫次狀態reg usb_oe_n_d1; //usb_oe_n下一拍//*****************************************************//** main code//*****************************************************//在FT232H寫狀態,將FIFO的數據輸出賦值給將USB數據總線,其他時候為高阻態assignusb_data = (next_state == WRITE) ? fifo_data_out :8'hzz; //產生FT232H數據輸出使能usb_oe_nalways@(posedgeusb_clk_60mornegedgerst_n)beginif(!rst_n) usb_oe_n <=?1'b1; ? ? ? ?elseif?(!usb_rxf_n) usb_oe_n <=?1'b0; ? ? ? ?else?usb_oe_n <=?1'b1; ? ?end//FT232H數據輸出使能usb_oe_n打一拍always?@(posedge?usb_clk_60m?ornegedge?rst_n)?beginif?(!rst_n) usb_oe_n_d1 <=?1'b1; ? ? ? ?else?usb_oe_n_d1 <= usb_oe_n; ? ?end//狀態跳轉always?@(posedge?usb_clk_60m?ornegedge?rst_n)?beginif?(!rst_n) cur_state <= IDLE; ? ? ? ?else?cur_state <= next_state; ? ?end//讀寫狀態跳轉條件always?@(*)?begincase?(cur_state) ? ? ? ? ? ? IDLE:?beginif?(usb_rxf_n ==?1'b0) ?//usb_rxf_n拉低,,ft232中數據可讀,下一時鐘進入去讀FT232H數據? ? ? ? ? ? ? ? ? ? ?next_state <= READ; ?//usb_txe_n拉低且FPGA FIFO不空進入FT232H寫elseif?((usb_txe_n ==?1'b0) && (empty ==?1'b0)) next_state <= WRITE;//ft232可寫且本地fifo不為空else?next_state <= IDLE; ? ? ? ? ? ?end? ? ? ? ? ? ?READ:?begin//usb_rxf_n拉高,ft232數據讀空,從FT232H讀回到空閑狀態if?((usb_oe_n_d1 ==?1'b1) && (usb_rxf_n ==?1'b1)) next_state <= IDLE; ? ? ? ? ? ? ? ?else?next_state <= READ; ? ? ? ? ? ?end? ? ? ? ? ? ?WRITE:?begin//usb_txe_n拉高或者FPGA FIFO被讀空,回到空閑狀態if?((usb_txe_n ==?1'b1) || (empty ==?1'b1)) next_state <= IDLE; ? ? ? ? ? ? ? ?else?next_state <= WRITE; ? ? ? ? ? ?enddefault: next_state <= IDLE; ? ? ? ?endcaseend//狀態賦值always?@(*)?begincase?(next_state) ? ? ? ? ? ? IDLE:?begin? ? ? ? ? ? ? ? ?fifo_data_in <=?8'hzz; ? ? ? ? ? ? ? ? usb_rd_n <=?1'b1; ? ? ? ? ? ? ? ? usb_wr_n <=?1'b1; ? ? ? ? ? ? ? ? fifo_wr_en <=?1'b0; ? ? ? ? ? ? ? ? fifo_rd_en <=?1'b0; ? ? ? ? ? ?end//讀狀態時,將usb數據賦值給fifo_data_in? ? ? ? ? ? ?READ:?begin? ? ? ? ? ? ? ? ?fifo_data_in <= usb_data; ? ? ? ? ? ? ? ? usb_wr_n <=?1'b1; ? ? ? ? ? ? ? ? fifo_rd_en <=?1'b0; ? ? ? ? ? ? ? ?//在usb_oe_n為低且在usb_oe_n下一拍也為低時拉低usb_rd_n,其他時候為高if?((usb_oe_n_d1 ==?0) && (usb_oe_n ==?0)) usb_rd_n <=?1'b0;//拉低讀取標志位,開始讀取ft232數據else?usb_rd_n <=?1'b1; ? ? ? ? ? ? ? ?//在usb_oe_n下一拍為低,且usb_rxf_n也為低時使能FIFO寫if?((usb_oe_n_d1 ==?0) && (usb_rxf_n ==?0)) fifo_wr_en <=?1'b1;//使能本地fifo寫入數據else?fifo_wr_en <=?1'b0; ? ? ? ? ? ?end//寫狀態時,使能fifo_rd_en和usb_wr_n? ? ? ? ? ? ?WRITE:?begin? ? ? ? ? ? ? ? ?fifo_data_in <=?8'hzz; ? ? ? ? ? ? ? ? usb_rd_n <=?1'b1; ? ? ? ? ? ? ? ? fifo_wr_en <=?1'b0; ? ? ? ? ? ? ? ? usb_wr_n <=?1'b0; ? ? ? ? ? ? ? ? fifo_rd_en <=?1'b1; ? ? ? ? ? ?enddefault:?begin? ? ? ? ? ? ? ? ?fifo_data_in <=?8'hzz; ? ? ? ? ? ? ? ? usb_rd_n <=?1'b1; ? ? ? ? ? ? ? ? usb_wr_n <=?1'b1; ? ? ? ? ? ? ? ? ?fifo_wr_en <=?1'b0; ? ? ? ? ? ? ? ? fifo_rd_en <=?1'b0; ? ? ? ? ? ?endendcaseendendmodule
下載完成后斷開下載線,只保留USB連接線,使用串口助手 ATK-FUSB測試:
成功的話會在接收窗口看到同樣的數據返回。
-
FPGA
+關注
關注
1645文章
22049瀏覽量
618347 -
接口
+關注
關注
33文章
9001瀏覽量
153725 -
usb
+關注
關注
60文章
8184瀏覽量
272849 -
fifo
+關注
關注
3文章
402瀏覽量
44808 -
串行總線
+關注
關注
1文章
186瀏覽量
31112
原文標題:FPGA外接FT232H配置FIFO實現USB通信回環測試
文章出處:【微信號:gh_9d70b445f494,微信公眾號:FPGA設計論壇】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
【紫光同創國產FPGA教程】【第二十八章】USB雙向測速例程

UM232H-B是FT232H高速到串行/并行接口轉換器的開發模塊
FT232H單通道USB至串行/并行接口分線板開發模塊UM232H-B-WE
用于FT232H單通道USB至串行/并行接口分線板的開發模塊UM232H-B-NC
PIC32MX與FTDI FT232H接口如何同步并行
USB2.0高速至MPSSE SPI模塊VA800A-SPI是一個小型電子電路板
基于FT2232H的USB-RS232轉換模塊設計
FT2232H USB串口芯片國產替代DP2232H
一種基于FPGA的FT232H接口通信開發方案

基于FPGA的USB3.0回環傳輸測試方案

評論