0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

FPGA外接FT232H配置FIFO实现USB通信回环测试

FPGA设计论坛 来源:CSDN技术社区 2025-07-17 11:30 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

USB英文全称 Universal Serial Bus,即通用串行总线,是一个外部总线标准,用于规范电脑与外部设备的连接和通讯。

FTDI 公司的USB2.0 芯片FT232H 进行USB 通信

FH232H芯片在内部不仅完成了USB 硬件接口差分电平转换,还封装了USB 的相关协议,留出数据交互接口

FH232H可以默认配置为UART模式,还可配置为JTAG,FIFO,IIC,SPI,本次将其配置为FIFO进行实验。

作为FPGA开发者只需要关注数据交互接口的时序即可实现USB功能。

cbbc27b8-613f-11f0-baa5-92fbcf53809c.png

MPSSE/Multi_purpose UART/FIFO controler:该模块为多功能UART/FIFO 控制器,它集成了面向用户的IO,直接负责与用户端(FPGA)进行数据交互。当把FT232H 配置成不同的模式时,管脚会有不同的含义

cbd3c1e8-613f-11f0-baa5-92fbcf53809c.png

(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中的数据立即发送使能,低电平有效

cc5e4a20-613f-11f0-baa5-92fbcf53809c.png

读时序: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

cc77897c-613f-11f0-baa5-92fbcf53809c.png

连接好硬件后进行FT232H模式修改:

在官网下载ft_prog

安装后运行,去掉其他FT器件,按如图所示操作

cc8fcece-613f-11f0-baa5-92fbcf53809c.png

编写代码实现回环(参考正点原子源码)

配置管脚,按硬件连接配置管脚

cca801f6-613f-11f0-baa5-92fbcf53809c.png

xilinx vivado FIFO IP核配置:

ccbc3c20-613f-11f0-baa5-92fbcf53809c.png

cccaf08a-613f-11f0-baa5-92fbcf53809c.png

顶层模块

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测试:

ccd97a2e-613f-11f0-baa5-92fbcf53809c.png

cce3fc74-613f-11f0-baa5-92fbcf53809c.png

成功的话会在接收窗口看到同样的数据返回。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1656

    文章

    22288

    浏览量

    630386
  • 接口
    +关注

    关注

    33

    文章

    9449

    浏览量

    156155
  • usb
    usb
    +关注

    关注

    60

    文章

    8372

    浏览量

    281761
  • fifo
    +关注

    关注

    3

    文章

    406

    浏览量

    45497
  • 串行总线
    +关注

    关注

    1

    文章

    186

    浏览量

    31519

原文标题:FPGA外接FT232H配置FIFO实现USB通信回环测试

文章出处:【微信号:gh_9d70b445f494,微信公众号:FPGA设计论坛】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    【紫光同创国产FPGA教程】【第二十八章】USB双向测速例程

    如何使用FTDI公司的FT232H驱动芯片进行USB数据传输,文中从底层FPGA、驱动层固件(FT232H固件)及上位机测试软件设计方面阐述
    的头像 发表于 04-09 10:46 2.3w次阅读
    【紫光同创国产<b class='flag-5'>FPGA</b>教程】【第二十八章】<b class='flag-5'>USB</b>双向测速例程

    完美高性能USB解决方案1

    R, FT232H, FT230X, FT231XUSB 转 FIFOFT245B, FT2
    发表于 03-29 11:43

    UM232H-B是FT232H高速到串行/并行接口转换器的开发模块

    UM232H-B-01,用于FT232H单通道USB至串行/并行接口分线板的开发模块,带有母头。 UM232H-B是FT232H高速到串行/
    发表于 04-04 11:42

    FT232H单通道USB至串行/并行接口分线板开发模块UM232H-B-WE

    UM232H-B-WE,用于FT232H单通道USB至串行/并行接口分线板的开发模块,带有6条悬空引线,连接到信号焊盘。 UM232H-B是FT23
    发表于 04-08 11:03

    用于FT232H单通道USB至串行/并行接口分线板的开发模块UM232H-B-NC

    UM232H-B-NC,用于FT232H单通道USB至串行/并行接口分线板的开发模块,仅带焊盘。 UM232H-B是FT232H高速到串行/
    发表于 04-09 09:20

    采用FT245BM和FPGA实现USB接口设计

    USB协议芯片FT245BM,实现FPGA与PC机的USB通信,该方法不用微控制器,减少了元器
    发表于 04-22 07:00

    采用FT245BM和FPGA实现USB接口设计

    USB协议芯片FT245BM,实现FPGA与PC机的USB通信,该方法不用微控制器,减少了元器
    发表于 04-26 07:00

    PIC32MX与FTDI FT232H接口如何同步并行

    有可能将PIC32MX(目前我有一个运行@50Mhz)与FTDI FT232H接口。同步FIFO-并行(高达40MB/s)在这种模式下,FT232H输出一个60Mhz的时钟,这样对于我所有
    发表于 04-29 07:16

    USB2.0高速至MPSSE SPI模块VA800A-SPI是一个小型电子电路板

    -AN_。该模块由十个母管接头端接,母管接头可与一个母管接头连接。引脚信号在3.3伏时符合CMOS逻辑。FT232H是一个单通道USB 2.0高速(480Mb/s)到UART/FIFO IC。它可
    发表于 10-14 16:55

    基于FT2232HUSB-RS232转换模块设计

    鉴于大量外围设备和软件使用RS232串口标准,为了充分利用USB的传输速度快,连接简单快捷,即插即用等优势,给出一种采用第5代USB-to-UART-FIFO器件FT2232H设计
    发表于 12-27 10:05 200次下载

    微雪电子FT245USBFIFO介绍

    FT245 USBFIFO模块 USB mini接口 支持3种供电模式 提供USB驱动 电路原理图 型号
    的头像 发表于 12-30 11:26 5974次阅读
    微雪电子<b class='flag-5'>FT245USB</b>转<b class='flag-5'>FIFO</b>介绍

    FT2232H USB串口芯片国产替代DP2232H

    FT2232H -高速双 USB UART/FIFO IC FT2232H是FTDI的第5代USB设备芯片。
    发表于 12-02 10:01 7636次阅读

    基于FPGAFT232H接口通信开发方案

    概述 本文主要介绍一种基于FPGAFT232H接口通信开发方案。传统的USB通信开发对工程人员的要求比较高,除了上层应用软件以外,还需要掌
    的头像 发表于 07-05 09:56 6814次阅读
    基于<b class='flag-5'>FPGA</b>的<b class='flag-5'>FT232H</b>接口<b class='flag-5'>通信</b>开发方案

    一种基于FPGAFT232H接口通信开发方案

    从图1中我们可以了解到,FT232H芯片内部可以划分为UTMI_PHY、USB_protocol and FIFO ctrol、Tx/Rx Buffer、MPSSE/Multi_purpose
    的头像 发表于 07-05 09:56 2560次阅读
    一种基于<b class='flag-5'>FPGA</b>的<b class='flag-5'>FT232H</b>接口<b class='flag-5'>通信</b>开发方案

    基于FPGAUSB3.0回环传输测试方案

    本文开源一个FPGA项目: USB3.0 LoopBack 。基于FPGAUSB3.0通信方案有很多,其中非常好用的一款
    的头像 发表于 10-01 09:49 6907次阅读
    基于<b class='flag-5'>FPGA</b>的<b class='flag-5'>USB</b>3.0<b class='flag-5'>回环</b>传输<b class='flag-5'>测试</b>方案