基于FPGA的USB2.0读写控制
项目简介
我们前面已经写过了USB3.0的FPGA实现,所用到的芯片是FX600Q芯片,这次我们讲解USB2.0的FPGA代码的编写。我们用到的芯片是Cypress厂家的Cy7C68013A,该款芯片在市场上的应用率极广,我们这里不涉及USB的具体协议,也不涉及固件的写法,因为前者已经封装进了USB芯片,后者Cypress厂家给出了例程。与USB3.0一样,我们能将USB芯片看成一个FIFO进行书写。
本次实验所用到的软硬件环境如下:
FPGA开发板:锆石A4plus开发板
软件环境:quartus II 13.1
上位机软件:Cypress官方提供(会放进群里面,有需要的进群下载)
CY7C68013A芯片介绍
我们从开发板的硬件电路中找到关于该款USB芯片的介绍:
从上图可以看出,芯片中含有一个8051的核。该电路在开发板上的连线如下:
其实USB芯片在下载官方的固件之后,我们可以把他等价成一个FIFO,如下图:
当然我们也可以对USB的固件进行编程,然后对数据进行一定的处理,但不在本次实验内容中。
接下来,我们将对上面的引脚做一些简单的说明,当然想具体了解的可以查阅技术手册:
USB_CLKOUT:USB芯片输出时钟引脚,本程序中不使用,不多关注
IFCLK:slave fifo的同步时钟信号,在USB工作在slave模式下,FIFO的同步信号,也是本次实验中使用的时钟引号。
FLAGA:slave FIFO是否可编程的标志信号,在我们的程序中也使用不到。
FLAGB:FIFO的满信号
FLAGC:FIFO的空信号
SLCS:USB芯片的片选信号,低电平使能
SLWR:USB芯片等价FIFO的写信号,低电平有效
SLRD:USB芯片等价FIFO的读信号,低电平有效
SLOE:USB芯片输出的使能信号,该信号为低电平时,USB芯片作为输出,高电平作为输入。
FIFOADR:该款USB芯片相当于4个FIFO,该信号控制着哪一个FIFO被选择,4个FIFO的编号是2,4,6,8分别对应00,01,10,11。具体哪个FIFO被选择是由固件所确定的,在上位机软件上可以查看。
该款USB芯片的驱动与固件程序由于CSDN无法上传文件,我们放在了群里面,需要的同学进群自己下载即可:
其中1是芯片的驱动,2是Cypress官方的配套软件与固件。
CY7C68013A芯片读写时序控制
这里我们从技术手册中找到芯片的读写时序,这里以同步读写为例:
由于这里时序特别简单,我们便不再画出具体的时序图,直接由上面的时序图进行写代码,相信大家从代码中很容易就可以读懂时序。
CY7C68013A芯片读写代码
USB2.0写代码:
`timescale 1ns / 1ps
// *********************************************************************************
// Project Name : OSXXXX
// Author : zhangningning
// Email : nnzhang1996@foxmail.com
// Website :
// Module Name : usb_write.v
// Create Time : 2020-02-19 12:53:38
// Editor : sublime text3, tab size (4)
// CopyRight(c) : All Rights Reserved
//
// *********************************************************************************
// Modification History:
// Date By Version Change Description
// -----------------------------------------------------------------------
// XXXX zhangningning 1.0 Original
//
// *********************************************************************************
module usb_write(
//System Interfaces
input rst_n ,