• FPGA实现对USB2.0的同步数据传输及USB2.0固件配置(2)


          USB2.0的开发与设置主要包括三部分,第一:基于keil 的USB2.0的固件开发,这里主要是借用黑金开发板516上面自带的固件进行相关的设置预配置:第二:是基于C# 或者C++对于USB2.0的上位机的开发;第三:主要是基于FPGA的对于USB2.0的同步传输。

          首先,通过固件修改将USB2.0配置为同步传输模式,这里用到的是EZ-USB,板载芯片是Cypress68013A。黑金开发板默认的是异步传输。

          

      将固件中的IFCONFIG 寄存器配置成为0xE3,即配置成了同步模式,即图示位置

    将改好后的固件编译后,同过黑金提供的上位机,将生成的HEX文件或者IIC文件下载到USB2.0中,重新上电即可,如下图所示DONWLOAD是用来下载HEX文件,掉电丢失;LG EEPROM是用来下载IIC文件时机哦保存在RRPROm中的。

    固件配置好后就是 FPGA  Verilog 程序设计了;在本次测试中实现的是FPGA想USB中写数据,在PC端通过上位机显示出来。代码很少;

     1 module  top(
     2         // system signals
     3         input                   s_rst_n                 ,       
     4         // system signals
     5         input                   usb_ifclk               ,       
     6         input                   usb_full                ,       
     7         input                   usb_empty               ,       
     8         output  wire            usb_slcs                ,       
     9         output  wire            usb_slwr                ,       
    10         output  wire            usb_slrd                ,       
    11         output  wire            usb_sloe                ,       
    12         output  wire    [ 1:0]  usb_fifoadr             ,
    13         output  reg     [15:0]  usb_fdata
    14 );
    15 
    16 //========================================================================
    17 // =========== Define Parameter and Internal signals =========== 
    18 //========================================================================/
    19 
    20 reg                             usb_slwr_reg                    ;       
    21 
    22 //=============================================================================
    23 //**************    Main Code   **************
    24 //=============================================================================
    25 assign  usb_slcs        =       1'b0;
    26 assign  usb_slwr        =       (usb_full == 1'b1 && usb_slwr_reg == 1'b0) ? 1'b0 : 1'b1;
    27 assign  usb_slrd        =       1'b1;
    28 assign  usb_sloe        =       1'b1;
    29 assign  usb_fifoadr     =       2'b10;  // 2,4,6,8
    30 
    31 
    32 always  @(posedge usb_ifclk or negedge s_rst_n) begin
    33         if(s_rst_n == 1'b0)
    34                 usb_slwr_reg    <=      1'b1;
    35         else if(usb_full == 1'b1)
    36                 usb_slwr_reg    <=      1'b0;
    37         else 
    38                 usb_slwr_reg    <=      1'b1;
    39 end
    40 
    41 
    42 always  @(posedge usb_ifclk or negedge s_rst_n) begin
    43         if(s_rst_n == 1'b0)
    44                 usb_fdata       <=      'd0;
    45         else if(usb_slwr == 1'b0)
    46                 usb_fdata       <=      usb_fdata + 1'b1;
    47 end
    48 
    49 
    50 endmodule

    介绍一下端口的设计:usb_ifclk :是输入时钟这是针对于FPGA来说,数据的输出和时钟都是基于此时钟,同步写数据的时候。

                                         usb_full:写满标志,因为我们设置的是slave FIFO模式。高电平表示为写满,拉低的是后标志写满。

                                          usb_empty:读空标志,高电平表示没有读空,拉低表示读空。

                                         usb_scls:片选信号

                                          usb_sloe:输出使能信号,

                                          usb_slrd:;读触发信号

                                         usb_slwr:写出发信号

                                         usb_fifoadr[1:0]:表示你要操作那个FIFO

                                         usb_fifodata[15:0]:表示传输的数据位。

    在数据手册中我们可以总结出的信号连接图在SlaveFIFO方式下,FPGA与FX2的连接信号图如图:

    在数据手册中各个管脚的作用:

    下面是信号线的说明。

    IFCLK:FX2输出的时钟,可作为通信的同步时钟。

    FLAGA、FLAGB、FLAGC、FLAGD:FX2输出的FIFO状态信息,如满、空等。

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

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

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

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

    PKTEND:包结束信号,外部逻辑控制,在正常情况下,外部逻辑向FX2的FIFO中写数,当写入FIFO端点的字节数等于FX2固件设定的包大小时,数据将自动被打成一包进行传输,但有时外部逻辑可能需要传输一个字节数小于FX2固件设定的包大小的包,这时,它只需在写入一定数目的字节后,声明此信号,此时FX2硬件不管外部逻辑写入了多少字节,都自动将之打成一包进行传输。

    FD[15:0]:数据线。

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

    逻辑思维梳理:

    当按照以上所述的模式设置时。USB与PC端通信可以理解为以下模式:

    官方同步写数据的时序图:

    可以理解为以下时序图:

     

    后续》》》》》

     

     

     

     

     

                                              

  • 相关阅读:
    创建和发送事件
    (实战)为系统类添加NameValueTable属性,并且添加到相关对话框
    使用GetUniqueIndentifier为某类对象连续编码
    中秋小感
    数据库中取随机数的方法讨论
    CVS添加用户的过程和命令列表
    Mysql中获取刚插入的自增长id的三种方法归纳
    关于Action重复执行两遍的原因
    td内容空的时候,如何显示边框线
    2003下 tomcat 连mysql问题的解决
  • 原文地址:https://www.cnblogs.com/lgy-gdeu/p/11409981.html
Copyright © 2020-2023  润新知