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

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

3天内不再提示

FPGA学习系列:37. USB2.0的设计

FPGA学习交流 2018-09-13 12:07 次阅读

设计背景:

USB(Universal Serial Bus2.0,通用串行总线)是一种应用在计算机领域的新型接口技术USB接口具有传输速度更快,支持热插拔以及连接多个设备的特点。目前已经在各类外部设备中广泛的被采用。USB接口有三种:USB1.1,USB2.0和USB3.0。理论上USB1.1的传输速度可以达到12Mbps,而USB2.0则可以达到速度480Mbps,并且可以向下兼容USB1.1

设计原理:

本次的设计主要设计我们用用的开发板是我们至芯出的第一代开发板,其中的USB芯片C是ypress的FX2LP系列中的CY7C68013A代,详细的介绍不多说,见Cypress的官网:在这里我就简化的给大家做一个简单介绍。

FX2的设计架构如下图,内嵌480MBit/s的收发器,锁相环PLL,串行接口引擎SIE——集成了整个USB 2.0协议的物理层。为适应USB 2.0的480MBit/s的速率,FIFO端点可配置成2,3,4个缓冲区。 配置用的是“软配置”——USB固件可由USB总线下载,片上不需集成ROM。拥有四个FIFO接口,可工作在内部或外部时钟下。端点和FIFO接口的应用使外部逻辑和USB总线可高速连接。

image.png

基于FX2LP的USB开发,包括三部分:固件程序、驱动、上位机软件。

固件程序我们在kiil中写出来,然后配置到我们的芯片中,固件的开发对我们FPGA工程师来说是不用写的,是别的工程师配置好芯片我们拿来用的,其主要的配置过程如下图:先上电复位,然后初始化我们的寄存器变量,然后调用配置函数,打开中断后,判断是否接受到了我们的配置包,如果接收到了就调用TD_POLL()函数,这个是函数是不停的执行扫描我们的端点等。然后判断我们的芯片是否挂起,如果挂起就叫醒芯片,如果没有就一直调用TD_POLL函数,这样完成我们所需要的配置。

image.png

我们的项目是要把我们的FX2配置成从FIFO的模式, 配置为单片机工作时钟24M,端点2输出,字节1024,端点6输入,字节1024,信号全设置为低电平有效等。我们的模块驱动时钟我们配置成内部输出时钟,也就是让FX2给我们的设计当做时钟源,输出一个最大的配置时钟48M的时钟。

在这边说一下,我们的FX2的数据存储区叫端点,有512,1024字节两个存储大小之分。

FIFO的说明:

当有一个与FX2芯片相连的外部逻辑只需要利用FX2做为一个USB 2.0接口而实现与主机的高速通讯,而它本身又能够提供满足Slave FIFO要求的传输时序,可以做为Slave FIFO主控制器时,即可考虑用此传输方式。

Slave FIFO传输的示意图如下:

image.png

在这种方式下,FX2内嵌的8051固件的功能只是配置Slave FIFO相关的寄存器以及控制FX2何时工作在Slave FIFO模式下。一旦8051固件将相关的寄存器配置完毕,且使自身工作在Slave FIFO模式下后,外部逻辑(如FPGA)即可按照Slave FIFO的传输时序,高速与主机进行通讯,而在通讯过程中不需要8051固件的参与。

FX2系列的有3种封装方式,我们我的开发板用的是56引脚的封装方式的电路图,其电路图如下所示:

image.png


端口介绍:

IFCLK:FX2输出的时钟,可做为通讯的同步时钟;

SLCS:FIFO的片选信号,外部逻辑控制,当SLCS输出高时,不可进行数据传输;

SLOE:FIFO输出使能,外部逻辑控制,当SLOE无效时,数据线不输出有效数据;

SLRD:FIFO读信号,外部逻辑控制,同步读时,FIFO指针在SLRD有效时的每个IFCLK的上升沿递增。

SLWR:FIFO写信号,外部逻辑控制,同步写时,在SLWR有效时的每个IFCLK的上升沿时数据被写入,FIFO指针递增

FD[15:0]:数据线;

FIFOADR[1:0]:选择四个FIFO端点的地址线,外部逻辑控制。

FLAGA,B,C端点的空满标志位

我们的开发驱动大家可以在网上找,然后根据自己系统装上合适的驱动,或者在我们的至芯论坛上搜EZ-USB,就可以看到我们老师发的帖子来讲解驱动的安装。

我们的上位机软件用的是官方的开发工具,只有如下的安装包

然后安装第一个和第二个就好了。

image.png


设计代码:

读模块:

0moduleusb_rd(pi_clk,pi_rst_n,pi_usb_flagb,pi_usb_flagc, pio_usb_data,

1 po_usb_oe_n,po_usb_rd_n,po_usb_address,po_usb_wr_n,led);

2

3 inputpi_clk;

4 inputpi_rst_n;

5 inputpi_usb_flagb; //端点2标志信号

6 inputpi_usb_flagc;//端点6标志信号

7 inout[15:0]pio_usb_data;//输入输出端口

8

9 outputregpo_usb_oe_n;//读标志信号

10 outputregpo_usb_rd_n;//写使能

11 outputregpo_usb_wr_n;//读使能

12 outputreg[1:0]po_usb_address;//端点地址选择

13 outputregled; //接收标志正确指示灯

14

15 reg[15:0]temp_data;

16 reg[9:0]count;

17 reg[2:0]state;

18

19 assignpio_usb_data =(state ==10)?1:16'hzzzz; //读数 据,可以一直释放数据总线的控制权

20

21 always@(posedgepi_clk ornegedgepi_rst_n)

22 if(!pi_rst_n)

23 begin

24 state <=0;

25 po_usb_oe_n <=1;

26 po_usb_rd_n <=1;

27 count <=0;

28 po_usb_wr_n <=1;

29 temp_data <=0;

30 end

31 else

32 case(state)

33 0 : state <=1;

34

35 1 : begin

36 po_usb_address <=2'b00;//地址指向端点2

37 state <=2;

38 end

39

40 2 : if(!pi_usb_flagb) //判断端点2已经满

41 begin

42 po_usb_rd_n <=0;

43 state <=3;

44 po_usb_oe_n <=0;

45 end

46 else

47 state <=2;

48

49 3 : begin

50 if(count <512-1) //接收1024字节的数

51 begin

52 count <=count +1'b1;

53 end

54 else

55 begin

56 count <=0;

57 state <=4;

58 end

59 if(count ==2)

60 begin

61 temp_data <=pio_usb_data;

62 end

63 end

64

65 4 : begin

66 po_usb_rd_n <=1;

67 po_usb_oe_n <=1;

68 state <=0;

69 end

70

71 default: state <=0;

72 endcase

73

74 always@(*)

75 if(!pi_rst_n)

76 led <=1;

77 elseif(temp_data ==16'h33ff)//判断我们接收数据是否正确

78 led <=0;

79

80endmodule

写模块:

0moduleusb_wr(pi_clk,pi_rst_n,pi_usb_flagb,pi_usb_flagc, pio_usb_data,

1 po_usb_oe_n,po_usb_wr_n,po_usb_address,po_usb_rd_n);

2

3 inputpi_clk;

4 inputpi_rst_n;

5 inputpi_usb_flagb; //端点2标志信号

6 inputpi_usb_flagc; //端点6标志信号

7 inout[15:0]pio_usb_data; //输入输出端口

8

9 outputregpo_usb_oe_n; //读标志信号

10 outputregpo_usb_wr_n; //写使能

11 outputregpo_usb_rd_n; //读使能

12 outputreg[1:0]po_usb_address; //端点地址选择

13

14 reg[15:0]temp_data;

15 reg[2:0]state;

16

17 //在状态的3,拿回数据总线控制全,给写入数据

18 assignpio_usb_data =(state ==3)?temp_data :16'hzzzz;

19

20 always@(posedgepi_clk ornegedgepi_rst_n)

21 if(!pi_rst_n)

22 begin

23 state <=0;

24 po_usb_oe_n <=1;

25 po_usb_wr_n <=1;

26 temp_data <=0;

27 po_usb_rd_n <=1;

28 end

29 else

30 case(state)

31 0 : state <=1;

32

33 1 : begin

34 po_usb_address <=2'b10;//地址指向端点6

35 state <=2;

36 end

37

38 2 : if(!pi_usb_flagc) //判断端点6已经空

39 begin

40 po_usb_wr_n <=0;

41 state <=3;

42 end

43 else

44 state <=2;

45

46 3 : if(temp_data <256-1) //发送1024 字节的数据

47 temp_data <=temp_data +1'b1;

48 else

49 begin

50 temp_data <=0;

51 state <=4;

52 end

53

54 4 : begin

55 po_usb_wr_n <=1;

56 state <=0;

57 end

58

59 default: state <=0;

60 endcase

61

62endmodule


上位机测试:

我们安装好驱动和下载的上位机软件,然后在下面的界面中,点击LGEEPROM按钮,下载我们写好的的.IIC固件。

image.png


然后在下面的页面中会出现先选择other endpt xfers选项

会出现我们的4个端点,然后我们选择写入的端点或者读的端点执行读写操作

image.png


写的端点是6端点,我们选择这个端点,我们的写入端点是1024个字节,我设置的是512字节,也就是写入2次就可以写满了,

如下图,和我们代码中写入数据值是一样的。

image.png

image.png

读操作也就是要读我们的端点2,我们先要给端点一个数,然后才能读我们的端点,我们写入我们图中显示的数,因为我们设计的是读出的数如果第三个数位33ff 就让我们的灯亮,值得一说的是,我们上位机显示的时候是把低位显示到了前面,高位显示到了后面,我们一个包是1024字节,后面的数自动补零,读出数据后可以看到我们的led灯亮,验证出我们的设计正确。

image.png



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

    关注

    1601

    文章

    21296

    浏览量

    593081
收藏 人收藏

    评论

    相关推荐

    什么是USB3.0?usb3.0与usb2.0有什么区别?

    什么是USB3.0?usb3.0与usb2.0有什么区别 USB3.0是指“超级速度USB”,它是一种高速数据传输技术,是
    的头像 发表于 10-27 14:31 4395次阅读

    USB3.0和USB2.0工业连接器究竟有哪些区别?

    CNLINKO凌科电气连接器知识分享USB3.0和USB2.0工业连接器是用于USB接口设备的两款常用连接器,是数据传输非常重要的手段。相信很多人对这两种连接器的区别都有所知晓,但不一定全面。今天
    的头像 发表于 10-21 08:14 531次阅读
    <b class='flag-5'>USB</b>3.0和<b class='flag-5'>USB2.0</b>工业连接器究竟有哪些区别?

    usb2.0协议规范中文版

    500mA 的电流。USB2.0 被设计成为向下兼容的模式,当有全速(USB 1.1) 或者低速(USB 1.0)设备连接到高速(USB 2.0
    发表于 10-20 17:14 2次下载

    USB2.0静电保护方案

    usb2.0 静电保护方案2页
    发表于 10-09 07:54

    USB2.0高速读卡器方案 优点和参数

    BL8810是由台湾旺玖推出的一款USB2.0 SD/MMC闪存读卡器单芯片。支持USB2.0高速传输,并符合通用串行总线规范。该芯片集成了一个高速的8051微处理器和一个最好的数据引擎,它的引脚
    的头像 发表于 10-08 14:34 814次阅读
    <b class='flag-5'>USB2.0</b>高速读卡器方案 优点和参数

    怎样通过FPGA软件去读取USB2.0模块的数据

    出不知道多少倍了。 我们最常见的当属USB2.0USB3.0,这两个之间可以通用,但是也有区别: 1.USB3.0的速率是5Gbps,而USB2.0的速率是480Mbps。 2.从
    的头像 发表于 10-08 10:05 652次阅读

    EXR示波器系列小故事三,USB2.0高速信号质量一致性测试

    Hello 小伙伴们,大家好! ● EXR示波器系列小故事已来到了第三期, 那么今天咱们来简单聊一聊 USB2.0的高速信号质量一致性测试。 USB2.0接口是一种非常常见的接口,目前应用于很多
    的头像 发表于 09-27 07:40 778次阅读
    EXR示波器<b class='flag-5'>系列</b>小故事三,<b class='flag-5'>USB2.0</b>高速信号质量一致性测试

    USB2.0/3.0走线长度对信号及使用有何影响呢?

    USB接口支持3种常用数据信号速率,1.5Mbps的低速速率,主要用于键盘、鼠标等。480Mbps的高速速率,用于USB2.0设备,例如U盘、光驱等。
    的头像 发表于 09-20 16:59 9272次阅读
    <b class='flag-5'>USB2.0</b>/3.0走线长度对信号及使用有何影响呢?

    请教下,USB3.0的HUB接下行接4个USB2.0设备,上行是使用USB3.0通讯还是2.0

    如题,USB3.0的HUB接下行接4个USB2.0设备,上行是使用USB3.0通讯还是2.0? 是这样,USB3.0的HUB,下行接了4个
    发表于 09-12 13:21

    USB2.0USB3.0接口的PCB布局布线要求

    相关领域。 USB2.0接口具有高达480Mbps的传输速率,USB3.0的最大传输带宽高达5Gbps,USB3.0引入全双工数据传输。USB的布局和布线有其对应的设计要求。
    的头像 发表于 08-17 07:35 2102次阅读
    <b class='flag-5'>USB2.0</b>与<b class='flag-5'>USB</b>3.0接口的PCB布局布线要求

    IP_数据表(I-10):USB2.0 Transceiver for TSMC 28nm HPC+

    IP_数据表(I-10):USB2.0 Transceiver for TSMC 28nm HPC+
    发表于 07-06 20:21 0次下载
    IP_数据表(I-10):<b class='flag-5'>USB2.0</b> Transceiver for TSMC 28nm HPC+

    IP_数据表(I-9):USB2.0 Transceiver for TSMC 40nm LP

    IP_数据表(I-9):USB2.0 Transceiver for TSMC 40nm LP
    发表于 07-06 20:12 0次下载
    IP_数据表(I-9):<b class='flag-5'>USB2.0</b> Transceiver for TSMC 40nm LP

    请问M487SIDAE运行NuMicroPy如何使用自带的USB2.0下载python文件?

    只有一个USB2.0端口,造成MicroPython脚本无法下载,NuMicroPy固件源代码也没找到如何使用USB2.0代替USB1.1端口的代码。有人知道这种情况怎么处理吗?
    发表于 06-19 08:09

    超便携式USB2.0/3.0协议分析仪力科T3

    Teledyne LeCroy的Advisor T3是一款超便携式的SuperSpeed USB2.0/3.0分析仪,以性价比处于市场。
    的头像 发表于 06-01 12:17 843次阅读
    超便携式<b class='flag-5'>USB2.0</b>/3.0协议分析仪力科T3

    USB2.0单/双接口ESD静电浪涌保护方案

    Serial Bus2.0,简称USB2.0,中文:通用串行总线,是一种应用在计算机领域的接口技术。USB2.0接口传输速度快(低速1.5Mbps、全速12Mbps、高速480Mbps),支持热插拔以及连接多个设备的特性,在遥
    的头像 发表于 05-29 11:18 1139次阅读
    <b class='flag-5'>USB2.0</b>单/双接口ESD静电浪涌保护方案