查看: 976|回复: 0
收起左侧

优秀的 Verilog/FPGA开源项目介绍(五)- USB通信

[复制链接]

  离线 

  • TA的每日心情
    奋斗
    2022-6-21 08:23
  • 签到天数: 2 天

    [LV.1]

    发表于 2021-12-10 22:41:15 | 显示全部楼层 |阅读模式

    有人预言,RISC-V或将是继Intel和Arm之后的第三大主流处理器体系。欢迎访问全球首家只专注于RISC-V单片机行业应用的中文网站

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    本帖最后由 塞巴斯蒂安 于 2021-12-10 22:43 编辑

    优秀的 Verilog/FPGA开源项目介绍(五)- USB通信

    USB是我们生活中非常非常常见的接口,鼠标、键盘以及常见的U 盘等,可以说现在的USB设备已经渗透到生活中的方方面面,下面就介绍几个开源的USB IP,供大家学习。

    0-官方网站

    https://www.usb.org/

    很多人花各种XX币下载各种标准,其实太浪费时间和精力了,这里介绍一个网站--usb.org。

    USB Implementers Forum, Inc. 是一家非营利性公司,由开发通用串行总线规范的公司集团创立。USB-IF 的成立是为了为通用串行总线技术的进步和采用提供支持组织和论坛。该论坛促进了高质量兼容 USB 外围设备(设备)的开发,并促进了 USB 的优势和通过一致性测试的产品质量。

    网站上的文档:
    国外芯片技术交流-优秀的 Verilog/FPGA开源项目介绍(五)- USB通信risc-v单片机中文社区(1)
    1-usbcorev

    项目地址 https://github.com/avakar/usbcorev

    项目简介

    该IP可以将全速 (12Mbps) USB 2.0 设备内核嵌入到 FPGA 设计中。

    接口部分

    我们知道USB接口使用了差分结构,所以接口部分还是很复杂的。
    国外芯片技术交流-优秀的 Verilog/FPGA开源项目介绍(五)- USB通信risc-v单片机中文社区(2)
    由于 USB 在其半双工差分线上使用了一些奇怪的信号,因此需要做一些工作才能将其连接到核心。以下五个信号连接到USB 信号的 D+ 和 D- 。
    • input rx_j -- D+/D-线上的微分值
    • input rx_se0 -- 单端零检测:应在 D+ 和 D- 线均为零时设置
    • output tx_se0-- 在两条 USB 线上传输零;优先于tx_j
    • output tx_j-- 传输tx_j到 D+ 和~tx_jD-
    • output tx_en -- 启用发射器

    如果使用的 FPGA 没有差分接收器,那么可以简单地使用两个引脚并按如下方式连接它们。但是,如果没有差分接收器,这将超出 USB 规范。
    1. inout usb_dp;
    2. inout usb_dn;

    3. // ...

    4. wire usb_tx_se0, usb_tx_j, usb_tx_en;
    5. usb usb0(
    6.     .rx_j(usb_dp),
    7.     .rx_se0(!usb_dp && !usb_dn),

    8.     .tx_se0(usb_tx_se0),
    9.     .tx_j(usb_tx_j),
    10.     .tx_en(usb_tx_en));

    11. assign usb_dp = usb_tx_en? (usb_tx_se0? 1'b0: usb_tx_j): 1'bz;
    12. assign usb_dn = usb_tx_en? (usb_tx_se0? 1'b0: !usb_tx_j): 1'bz;
    复制代码
    对于 Xilinx Spartan 6 系列,使用四个物理引脚如下。
    1. // These pins are configured as differential inputs. Unfortunately,
    2. // you can't use single-ended receivers nor transmitters on these pins.
    3. input usb_sp;
    4. input usb_sn;

    5. // These pins are single-ended inouts.
    6. inout usb_dp;
    7. inout usb_dn'
    8. // ...
    9. IBUFDS usb_j_buf(.I(usb_sp), .IB(usb_sn), .O(usb_rx_j_presync));
    10. synch usb_j_synch(clk_48, usb_rx_j_presync, usb_rx_j);
    11. synch usb_se0_synch(clk_48, !usb_dp && !usb_dn, usb_rx_se0);
    12. wire usb_tx_se0, usb_tx_j, usb_tx_en;
    13. usb usb0(
    14.     .rx_j(usb_rx_j),
    15.     .rx_se0(usb_rx_se0),
    16.     .tx_se0(usb_tx_se0),
    17.     .tx_j(usb_tx_j),
    18.     .tx_en(usb_tx_en));
    19. assign usb_dp = usb_tx_en? (usb_tx_se0? 1'b0: usb_tx_j): 1'bz;
    20. assign usb_dn = usb_tx_en? (usb_tx_se0? 1'b0: !usb_tx_j): 1'bz;
    复制代码
    注意接收器之后的同步。

    无论在哪个引脚上传输,都需要在线路上增加串阻,通常大约 27 欧姆就可以了。

    还需要将 D+ 线增加1.5K的 3.3V 上拉。如果您想动态连接/分离到总线,可以直接或通过 FPGA 上的引脚拉动它。确保永远不要下拉线路,上拉引脚的唯一有效输出是1'b1和1'bz。

    2-no2usb

    https://github.com/no2fpga/no2usb

    该项目是Lattice众多拥簇的一员的项目,平台也是运行在ice40中,之前我也做了一个开发板(),奈何国内对这个感兴趣的不过,也就没怎么推广。

    下面简单介绍一下这个项目。

    概述

    该 fpga 内核仅使用普通 FPGA CMOS IO 实现 USB 全速 SIU(Server Interface Unit)。
    • 小巧高效(最初针对 ice40)
    • 灵活,动态 EP 配置
    • 单时钟域

    该项目目前只运行在ice40芯片(Apple曾使用的)上,目前在适配ecp5(lattice)。

    说明

    https://github.com/smunaut/ice40-playground/tree/master/cores

    该项目里有很多可以参考的实例:
    国外芯片技术交流-优秀的 Verilog/FPGA开源项目介绍(五)- USB通信risc-v单片机中文社区(3)

    3-tinyfpga_bx_usbserial(USB转串口 SPI)

    https://github.com/davidthings/tinyfpga_bx_usbserial

    这个项目的起源也很有意思,ice40系列FPGA是使用SPI接口烧写程序的(类似JTAG),使用时需要一个USB转SPI芯片作为“JTAG”,常用的就是FT232/FT2232等,但是FTDI的芯片价格普遍比较贵(差不多和ICE40一样价格甚至更贵),本项目的起源就是为了节省这一芯片,使用FPGA本身实现USB-SPI。

    项目起源地址
    https://github.com/tinyfpga/TinyFPGA-Bootloader

    简介

    Lawrie Griffiths 深入研究了这段代码的"暗盒",并做了大量工作将其更改为 USB - SERIAL 桥接器,将用户视为串行端口,而不是 SPI 主机。他还创造了一些很好的例子,他的工作在这里:

    https://github.com/lawrie/tiny_usb_examples

    本项目针对以上两个项目做了一些改善。并且做了很多改善,不仅使用ICE40系列FPGA还适配了XIlinx A7 FPGA,同时ECP5(Lattice)也可以使用。

    项目资源使用如下:
    1. Info: Device utilisation:
    2. Info:           ICESTORM_LC:  1093/ 7680    14%
    3. Info:          ICESTORM_RAM:     2/   32     6%
    4. Info:                 SB_IO:     9/  256     3%
    5. Info:                 SB_GB:     8/    8   100%
    6. Info:          ICESTORM_PLL:     1/    2    50%
    7. Info:           SB_WARMBOOT:     0/    1     0%
    复制代码

    项目的README中有详细的介绍及使用教程,这里就介绍的这里,毕竟不是完整的USB通信。

    4-众多IP核

    https://github.com/ultraembedded/cores

    这个项目不仅不包括了USB(主要是USB1.1),还包括很多常见的低速接口-SPI UART I2S等等
    国外芯片技术交流-优秀的 Verilog/FPGA开源项目介绍(五)- USB通信risc-v单片机中文社区(4)
    每个IP都有完整的说明,自己去看吧,非常适合新手调试接口。

    5-usb_cdc(设备类)

    https://github.com/ultraembedded/core_usb_cdc

    USB的CDC类是USB通信设备类 (Communication Device Class)的简称。CDC类是USB组织定义的一类专门给各种通信设备(电信通信设备和中速网络通信设备)使用的USB子类。

    简介

    该项目是一个简单的 USB 外设接口(设备)实现,可枚举为高速 (480Mbit/s) 或全速 (12Mbit/s) CDC-ACM 设备。

    该 IP 具有用于输入和输出数据的简单 FIFO 接口(有效、数据、接受),以及用于连接到 USB PHY 的 UTMI 接口。

    特征

    • 高速或全速 USB CDC 设备。
    • 硬件枚举 - 无需软件干预。
    • UTMI PHY 接口
    • 具有握手功能的简单 8 位数据输入/输出接口(符合 8 位宽 AXI4-Stream 接口)。
    • 配置/要求(全速(12Mbit/s))

    文件说明
    1. Configuration / Requirements (Full Speed (12Mbit/s))

    2. Top: usb_cdc_core
    3. Clock: clk_i - 48MHz or 60MHz
    4. Reset: rst_i - Asynchronous, active high
    5. VID/PID can be changed in usb_desc_rom.v
    6. Param: USB_SPEED_HS = "False"
    复制代码
    1. Configuration / Requirements (High Speed (480Mbit/s))

    2. Top: usb_cdc_core
    3. Clock: clk_i - 60MHz
    4. Reset: rst_i - Asynchronous, active high
    5. VID/PID can be changed in usb_desc_rom.v
    6. Param: USB_SPEED_HS = "True"
    复制代码
    该项目在仿真下验证,在 FPGA 上针对 Linux、Windows 和 MAC OS-X 进行了测试。

    6-www-asics-ws的项目

    https://github.com/www-asics-ws

    www-asics-ws项目中包含了USB1.1和USB2.0设备类USB IP。
    国外芯片技术交流-优秀的 Verilog/FPGA开源项目介绍(五)- USB通信risc-v单片机中文社区(5)

    usb1_device
    • USB 1.1 兼容功能
    • 支持硬件枚举
    • 无需微控制器/CPU
    • 基于 FIFO 的接口
    • 用 Verilog 编写
    • 完全可合成
    • 仿真及硬件测试

    usb2_dev

    这是一个符合 USB 2.0 标准的内核。由于接口速度高,此内核需要外部 PHY。已开发出用于 USB 的行业标准 PHY 接口。该接口称为USB Transceiver Macrocell Interface或简称UTMI。USB 内核的主机接口符合 WISHBONE SoC 标准。有关 USB 标准和完整规范的更多信息,请访问www.usb.org。有关 WISHBONE SoC 的更多信息和完整规范,请访问www.opencores.org。UTMI 规范(以及其他各种有用的 USB 文件)可以从这里下载:
    1. https://www.intel.com/content/www/us/en/homepage.html?ref=https://www.intel.com/content/www/us/en/io/universal-serial-bus/universal-.html
    复制代码

    参考意义不大,不能直接在FPGA中使用,需要搭配PHY使用。

    7-usbhostslave

    https://github.com/freecores/usbhostslave

    该项目已使用 Quartus 6.0 成功编译并且USBHostSlave 已经在 SystemC 和 Altera Nios 开发套件 Cyclone 版中进行了测试。

    整个项目文档说明很少,但是看提交记录该项目完成度很高,还是适合入坑。

    优秀的 Verilog/FPGA开源项目介绍(四)- Ethernet

    9-core_usb_sniffer

    https://github.com/ultraembedded/core_usb_sniffer

    这个内核是一个 HS/FS USB2.0 分析器(USB 总线嗅探器)。

    内核监控 UTMI 接口,并通过 AXI-4 总线主接口将看到的流量记录到内存缓冲区。

    可以连续提取日志格式(连续捕获模式),也可以在内存缓冲区已满时内核停止捕获(一次性模式)。

    IP 的配置是使用 AXI4-Lite 从接口执行的。

    该内核已用于生产USB 2.0 捕获设备(https://github.com/ultraembedded/usb2sniffer)这是实现的案例。

    10-商业IP

    https://www.synopsys.com/designware-ip/interface-ip/usb.html

    商业IP肯定首推来自老牌大厂新思,新思科技在2018年推出基于HAPS-80 FPGA的硬件原型验证平台上部署了USB 3.2设备IP和主机IP。这些FPGA硬件原型验证平台在FinFET工艺节点的FPGA中使用了USB PHY。解决方案如下:
    国外芯片技术交流-优秀的 Verilog/FPGA开源项目介绍(五)- USB通信risc-v单片机中文社区(6)
    有需要的可以去上面的网站了解,需要money的IP,所以我就不过多介绍了,个人也不会选用,大公司自然有销售对接。
    国外芯片技术交流-优秀的 Verilog/FPGA开源项目介绍(五)- USB通信risc-v单片机中文社区(7)
    以上就是今天推荐的项目,这里建议第一个和第五个项目可以入坑,其他看自己需求。

    最后,还是感谢各个大佬开源的项目,让我们受益匪浅。
    国外芯片技术交流-优秀的 Verilog/FPGA开源项目介绍(五)- USB通信risc-v单片机中文社区(8)

    NOW现在行动!


    学习Xilinx FPGA最好的资料其实就是官方手册,下表总结了部分手册的主要介绍内容

    国外芯片技术交流-优秀的 Verilog/FPGA开源项目介绍(五)- USB通信risc-v单片机中文社区(9)





    上一篇:优秀的 Verilog/FPGA开源项目介绍(四)- Ethernet
    下一篇:优秀的 Verilog/FPGA开源项目介绍(六)- MIPI
    RISCV作者优文
    全球首家只专注于RISC-V单片机行业应用的中文网站
    回复

    使用道具 举报

    高级模式
    B Color Image Link Quote Code Smilies

    本版积分规则

    关闭

    RISC-V单片机中文网上一条 /2 下一条



    版权及免责声明|RISC-V单片机中文网 |网站地图

    GMT+8, 2024-4-26 05:35 , Processed in 0.510757 second(s), 48 queries .

    快速回复 返回顶部 返回列表