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

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端通信可以理解为以下模式:

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

可以理解为以下时序图:

后续》》》》》

原文地址:https://www.cnblogs.com/lgy-gdeu/p/11409981.html

时间: 2024-10-13 13:15:35

FPGA实现对USB2.0的同步数据传输及USB2.0固件配置的相关文章

Spring通过AOP实现对Redis的缓存同步

废话不多说 说下思路:使用aop注解,在Service实现类添加需要用到redis的方法上,当每次请求过来则对其进行拦截,如果是查询则从redis进行get key,如果是update则删除key,防止脏数据或者历史数据出现.建议aop不懂的同学或者SPEL也不太熟悉的先去看看资料再回过来看,会事半功倍. 1.首先贴上核心注解类 @Retention(RetentionPolicy.RUNTIME) @Target({ ElementType.METHOD }) public @interfac

用 Python 脚本实现对 Linux 服务器的监控

hon 分享到:8 原文出处: 曹江华 目前 Linux 下有一些使用 Python 语言编写的 Linux 系统监控工具 比如 inotify-sync(文件系统安全监控软件).glances(资源监控工具)在实际工作中,Linux 系统管理员可以根据自己使用的服务器的具体情况编写一下简单实用的脚本实现对 Linux 服务器的监控. 本文介绍一下使用 Python 脚本实现对 Linux 服务器 CPU 内存 网络的监控脚本的编写. Python 版本说明 Python 是由 Guido va

Java Web学习系列——Maven Web项目中集成使用Spring、MyBatis实现对MySQL的数据访问

本篇内容还是建立在上一篇Java Web学习系列——Maven Web项目中集成使用Spring基础之上,对之前的Maven Web项目进行升级改造,实现对MySQL的数据访问. 添加依赖Jar包 这部分内容需要以下Jar包支持 mysql-connector:MySQL数据库连接驱动,架起服务端与数据库沟通的桥梁: MyBatis:一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架: log4j:Apache的开源项目,一个功能强大的日志组件,提供方便的日志记录: 修改后的pom.xm

02-keepalived实现对nginx服务的高可用(主备)

实验环境:controller3,controller4为后端web服务器,controller1,controller2为nginx负载均衡服务器,用keepalived实现主备模式的高可用 controller1  IP:9.110.187.120 10.1.1.120 controller2  IP:9.110.187.121 10.1.1.121 controller3  IP:10.1.1.122 controller4  IP:10.1.1.123 1.controller3,con

Android下通过root实现对system_server中binder的ioctl调用拦截

Android下通过root实现对system_server中binder的ioctl调用拦截 分类: Android2013-06-19 18:09 779人阅读 评论(0) 收藏 举报 作 者: Passion时 间: 2012-10-18,13:53:53链 接: http://bbs.pediy.com/showthread.php?t=157419 Android下通过root实现对system_server中binder的ioctl调用拦截作者:passion2012-10-18关键

用C/C++实现对STORM的运行信息查看和控制

最近公司有个需求,需要在后端应用服务器上实时获取STORM集群的运行信息和topology相关的提交和控制,经过几天对STORM UI和CMD源码的分析,得出可以通过其thrift接口调用实现这些功能.先下载一个thrift库进行编码和安装.关于thrift可以参见这个地方.安装完成后,从STORM源码中将storm.thrift拷贝到thrift目录下.输入: hrift -gen cpp storm.thrift 会得到一个gen-cpp目录,里面就是thrift先关脚本的C++实现.我们先

用 Python 脚本实现对 Linux 服务器的网卡流量监控

*这篇文章网上已经有相关代码,为了加深印象,我做了相关注释,希望对朋友们有帮助 工作原理:基于/proc文件系统 Linux 系统为管理员提供了非常好的方法,使其可以在系统运行时更改内核,而不需要重新引导内核系统,这是通过/proc 虚拟文件系统实现的./proc 文件虚拟系统是一种内核和内核模块用来向进程(process)发送信息的机制(所以叫做"/proc"),这个伪文件系统允许与内核内部数据结构交互,获取有关进程的有用信息,在运行中(on the fly)改变设置(通过改变内核参

python实现对excel表的读写操作(一)

Part 1. 模块介绍: 使用python实现对excel表的读写操作有两个模块,分别为: 1. 对excel表读取模块 xlrd 0.9.3  :下载地址: https://pypi.python.org/pypi/xlrd 英文释意:The package is for reading data and formatting information from Excel files. 2. 对excel表写入模块 xlwt 0.7.5 : 下载地址:https://pypi.python.

利用PRTG实现对cisco路由器的cpu负载、端口流量等的监控

一.实验目的及前期准备 用gns3.vmware模拟真实的环境,利用prtg实现对cisco路由器状态的监控 前期准备:GNS3仿真路由软件和VMware虚拟软件,PRTG. 二.实验步骤 1)搭建如下拓扑环境 VMware server有2张网卡,一张(out)桥接到真实主机(Windows7)的网卡,另一张(in)连接到GNS3的R1路由器的e1/0上:R1路由器的e1/1和VMwar winxp的网卡相连. a)VMware安装一个server2003系统和一个xp系统,并虚拟3张虚拟网卡