USB英文全稱 Universal Serial Bus,即通用串行總線,是一個(gè)外部總線標(biāo)準(zhǔn),用于規(guī)范電腦與外部設(shè)備的連接和通訊。
FTDI 公司的USB2.0 芯片F(xiàn)T232H 進(jìn)行USB 通信
FH232H芯片在內(nèi)部不僅完成了USB 硬件接口差分電平轉(zhuǎn)換,還封裝了USB 的相關(guān)協(xié)議,留出數(shù)據(jù)交互接口
FH232H可以默認(rèn)配置為UART模式,還可配置為JTAG,FIFO,IIC,SPI,本次將其配置為FIFO進(jìn)行實(shí)驗(yàn)。
作為FPGA開發(fā)者只需要關(guān)注數(shù)據(jù)交互接口的時(shí)序即可實(shí)現(xiàn)USB功能。
MPSSE/Multi_purpose UART/FIFO controler:該模塊為多功能UART/FIFO 控制器,它集成了面向用戶的IO,直接負(fù)責(zé)與用戶端(FPGA)進(jìn)行數(shù)據(jù)交互。當(dāng)把FT232H 配置成不同的模式時(shí),管腳會(huì)有不同的含義
(I/O是對于FT232H來說)
ADBUS[7:0]: (I/O) 數(shù)據(jù)端口,雙向IO接口(讀寫不能同時(shí)發(fā)生)
RD: (IN) FT232H中的數(shù)據(jù)輸出使能,由FPGA發(fā)送給FT232H,低電平有效
WR: (IN) FT232H中的數(shù)據(jù)輸入使能,由FPGA發(fā)送給FT232H,低電平有效
RXF: (OUT) FT232H中的FIFO數(shù)據(jù)可讀標(biāo)志位,低電平有效
TXE: (OUT) FT232H中的FIFO數(shù)據(jù)可寫標(biāo)志位,低電平有效
OE: (IN) FT232H中的數(shù)據(jù)輸出,低電平有效
CLKOUT: (OUT) 60MHz時(shí)鐘信號,由FT232H產(chǎn)生并傳遞給FPGA作為本次實(shí)驗(yàn)主時(shí)鐘
SIWU: (OUT) FT232H中的數(shù)據(jù)立即發(fā)送使能,低電平有效
讀時(shí)序:232拉低RXF表示有數(shù)據(jù)可讀 > FPGA拉低OE使能輸出 > 等待數(shù)據(jù)有效 > FPGA拉低RD > 有效數(shù)據(jù) > 232拉高RXF > 讀空 > FPGA需要同時(shí)拉高RD和OE
寫時(shí)序:232中FIFO未滿 > 232拉低TXE > FPGA拉低WR > 向232寫入數(shù)據(jù) > 232拉高TXE > 寫滿
硬件設(shè)計(jì):參考https://github.com/WangXuan95/FPGA-ftdi245fifo,正點(diǎn)原子達(dá)芬奇Pro
連接好硬件后進(jìn)行FT232H模式修改:
在官網(wǎng)下載ft_prog
安裝后運(yùn)行,去掉其他FT器件,按如圖所示操作
編寫代碼實(shí)現(xiàn)回環(huán)(參考正點(diǎn)原子源碼)
配置管腳,按硬件連接配置管腳
xilinx vivado FIFO IP核配置:
頂層模塊
moduleusb_loopback ( input usb_clk_60m, //FT232輸出的60M時(shí)鐘input sys_rst_n, //系統(tǒng)復(fù)位 ,低電平input usb_rxf_n, //FT232H中FIFO數(shù)據(jù)的可讀標(biāo)input usb_txe_n, //FT232H中FIFO數(shù)據(jù)的可寫標(biāo)output usb_oe_n, //FT232H數(shù)據(jù)輸出使能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雙向數(shù)據(jù)總線); //wire definewire[7:0] fifo_data_in; //從FT232進(jìn)到FPGA的數(shù)據(jù)wire[7:0] fifo_data_out; //從FPGA輸出到FT232的數(shù)據(jù)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; //立即發(fā)送,喚醒a(bǔ)ssignc7 =1'b1; //立即發(fā)送,喚醒//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調(diào)用 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 時(shí)鐘input rst_n, //系統(tǒng)復(fù)位 ,低電平//FT232Hinput usb_rxf_n, //FT232H 中FIFO 數(shù)據(jù)的可讀標(biāo)志input usb_txe_n, //FT232H 中FIFO 數(shù)據(jù)的可寫標(biāo)志outputreg usb_oe_n, //FT232H 數(shù)據(jù)輸出使能outputreg usb_rd_n, //FT232H 讀使能信號outputreg usb_wr_n, //FT232H 寫使能信號inout [7:0] usb_data, //FT232H 雙向數(shù)據(jù)總線//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中讀出的數(shù)據(jù)outputreg[7:0] fifo_data_in //寫入FPGA FIFO的數(shù)據(jù)); // localparam definelocalparamIDLE =4'b001; //FT232H 空閑localparamREAD =4'b010; //FT232H 讀狀態(tài),此時(shí)數(shù)據(jù)從FT232H發(fā)送到FPGAlocalparamWRITE =4'b100; //FT232H 寫狀態(tài),此時(shí)數(shù)據(jù)從FPGA發(fā)送到FT232H//reg definereg[2:0] cur_state; //讀寫現(xiàn)狀態(tài)reg[2:0] next_state; //讀寫次狀態(tài)reg usb_oe_n_d1; //usb_oe_n下一拍//*****************************************************//** main code//*****************************************************//在FT232H寫狀態(tài),將FIFO的數(shù)據(jù)輸出賦值給將USB數(shù)據(jù)總線,其他時(shí)候?yàn)楦咦钁B(tài)assignusb_data = (next_state == WRITE) ? fifo_data_out :8'hzz; //產(chǎn)生FT232H數(shù)據(jù)輸出使能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數(shù)據(jù)輸出使能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//狀態(tài)跳轉(zhuǎn)always?@(posedge?usb_clk_60m?ornegedge?rst_n)?beginif?(!rst_n) cur_state <= IDLE; ? ? ? ?else?cur_state <= next_state; ? ?end//讀寫狀態(tài)跳轉(zhuǎn)條件always?@(*)?begincase?(cur_state) ? ? ? ? ? ? IDLE:?beginif?(usb_rxf_n ==?1'b0) ?//usb_rxf_n拉低,,ft232中數(shù)據(jù)可讀,下一時(shí)鐘進(jìn)入去讀FT232H數(shù)據(jù)? ? ? ? ? ? ? ? ? ? ?next_state <= READ; ?//usb_txe_n拉低且FPGA FIFO不空進(jìn)入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數(shù)據(jù)讀空,從FT232H讀回到空閑狀態(tài)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被讀空,回到空閑狀態(tài)if?((usb_txe_n ==?1'b1) || (empty ==?1'b1)) next_state <= IDLE; ? ? ? ? ? ? ? ?else?next_state <= WRITE; ? ? ? ? ? ?enddefault: next_state <= IDLE; ? ? ? ?endcaseend//狀態(tài)賦值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//讀狀態(tài)時(shí),將usb數(shù)據(jù)賦值給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下一拍也為低時(shí)拉低usb_rd_n,其他時(shí)候?yàn)楦遡f?((usb_oe_n_d1 ==?0) && (usb_oe_n ==?0)) usb_rd_n <=?1'b0;//拉低讀取標(biāo)志位,開始讀取ft232數(shù)據(jù)else?usb_rd_n <=?1'b1; ? ? ? ? ? ? ? ?//在usb_oe_n下一拍為低,且usb_rxf_n也為低時(shí)使能FIFO寫if?((usb_oe_n_d1 ==?0) && (usb_rxf_n ==?0)) fifo_wr_en <=?1'b1;//使能本地fifo寫入數(shù)據(jù)else?fifo_wr_en <=?1'b0; ? ? ? ? ? ?end//寫狀態(tài)時(shí),使能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測試:
成功的話會(huì)在接收窗口看到同樣的數(shù)據(jù)返回。
-
FPGA
+關(guān)注
關(guān)注
1645文章
22049瀏覽量
618350 -
接口
+關(guān)注
關(guān)注
33文章
9001瀏覽量
153727 -
usb
+關(guān)注
關(guān)注
60文章
8184瀏覽量
272853 -
fifo
+關(guān)注
關(guān)注
3文章
402瀏覽量
44808 -
串行總線
+關(guān)注
關(guān)注
1文章
186瀏覽量
31112
原文標(biāo)題:FPGA外接FT232H配置FIFO實(shí)現(xiàn)USB通信回環(huán)測試
文章出處:【微信號:gh_9d70b445f494,微信公眾號:FPGA設(shè)計(jì)論壇】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
【紫光同創(chuàng)國產(chǎn)FPGA教程】【第二十八章】USB雙向測速例程

UM232H-B是FT232H高速到串行/并行接口轉(zhuǎn)換器的開發(fā)模塊
FT232H單通道USB至串行/并行接口分線板開發(fā)模塊UM232H-B-WE
用于FT232H單通道USB至串行/并行接口分線板的開發(fā)模塊UM232H-B-NC
采用FT245BM和FPGA實(shí)現(xiàn)USB接口設(shè)計(jì)
采用FT245BM和FPGA實(shí)現(xiàn)USB接口設(shè)計(jì)
PIC32MX與FTDI FT232H接口如何同步并行
USB2.0高速至MPSSE SPI模塊VA800A-SPI是一個(gè)小型電子電路板
基于FT2232H的USB-RS232轉(zhuǎn)換模塊設(shè)計(jì)
FT2232H USB串口芯片國產(chǎn)替代DP2232H
基于FPGA的FT232H接口通信開發(fā)方案

一種基于FPGA的FT232H接口通信開發(fā)方案

基于FPGA的USB3.0回環(huán)傳輸測試方案

評論