本文实现一种FPGA与PC通信的方法,采用USB2.0,即Cypress公司的EZ_USB FX2LP系列的CY7C68013A芯片。下面先介绍一下这款芯片。

  CY7C68013A是一款含高速USB2.0协议及兼容的8051控制的USB2.0芯片。芯片内部含有16KB的RAM,不需要外加存储器就可以运行固件程序。内部的8051处理器的工作频率可以采用48MHz、24MHz、12MHz。芯片内部集成了4个FIFO,共4K字节。用户可以通过设置使其工作在Master或者Slave模式下。CY7C68013A内部有一个I2C接口用于连接外部的EEPROM,用户可以下载固件程序到EEPROM中,CY7C68013A上电会自动读取EEPROM中的程序到RAM中运行。芯片内部结构如图:

要从FPGA发送数据到PC上,一种简单的方法是配置成Slave mode,相当于直接向FIFO中写数据,在固件中配置数据自动转发到PC。下面先大概说一下固件程序中的配置:

void TD_Init(void)
{    CPUCS = ((CPUCS & ~bmCLKSPD) | bmCLKSPD1);//设置CPU时钟频率为48M//USBCS = Ox80;  //set high speed mode 添加此语句时工程编译不通过
IFCONFIG = 0XCB;                                       //选择内部时钟频率为48M,FIFO/GPIF采用异步操作模式,SLAVE FIFO接口(外部主控制器)
    SYNCDELAY;                                             //同步延时REVCTL = 0X03;    //0x01                               //版本号
    SYNCDELAY;FIFOPINPOLAR = 0X00;                                //所有引脚为低电平有效
    SYNCDELAY;                                    FIFORESET = 0X80;                                      //对从主机发送的数据进行握手
    SYNCDELAY;FIFORESET = 0X02;                                   //复位FIFO
    SYNCDELAY;FIFORESET = 0X04;                                   //复位FIFO
    SYNCDELAY;FIFORESET = 0X06;                                   //复位FIFO
    SYNCDELAY;FIFORESET = 0X08;                                   //复位FIFO
    SYNCDELAY;FIFORESET = 0X00;                                   //保存操作
    SYNCDELAY;EP6CFG =0xE0;                                      //使能端点6,端点方向为输入,块传输方式,端点大小512字节,端点为4重缓冲
    SYNCDELAY;  EP6FIFOCFG = 0X0C;                                    // AUTOIN=1 ZEROLEN=1 WORDIDE=0 设置端点6为自动输入,选择总线数据宽度为8位
    SYNCDELAY;                                    PINFLAGSAB = 0X00;                                    //确定引脚FLAGA为EPX的PF标志,FLAGB为EPX的FF标志,FLAGC为EPX的EF标志///
    SYNCDELAY;                                    PINFLAGSCD = 0X00;                                     //确定引脚FLAGA为EPX的PF标志,FLAGB为EPX的FF标志,FLAGC为EPX的EF标志///
    SYNCDELAY;                                    PORTACFG = 0X40;                                  //PORTACFG.6=1 设置IOPA7为CS引脚
    SYNCDELAY;                                    EP6AUTOINLENH = 0X02;                              //端点6 AUTOIN包长度高字节
    SYNCDELAY;                                    EP6AUTOINLENL = 0X00;                            //端点6 AUTOIN包长度高字节
    SYNCDELAY;  EP6BCH = 0x02;                                     //512byte///*
    SYNCDELAY;EP6BCL = 0x00;                                     //512byte///*
    SYNCDELAY;                      EP6FIFOPFH = 0X80;                                //端点6/SLAVE FIFO 可编程成级标志的高位(高速方式和全速方式)
    SYNCDELAY;                                        EP6FIFOPFL = 0X00;                               //端点6/SLAVE FIFO 可编程成级标志的高位(高速方式和全速方式)
    SYNCDELAY;                                    /*    OUTPKTEND =0X82;                                //启动OUT缓冲区SYNCDELAY;                                    OUTPKTEND =0X82;                                //启动OUT缓冲区SYNCDELAY;
*///AUTOPTRSETUP |= 0x01;                            //使能自动指针
        Rwuen = TRUE;       }

void TD_Poll(void) // Called repeatedly while the device is idle
{

}

 

TD_Init()这个函数是初始化函数,上电执行一次。函数内部就是对寄存器的配置。在这里我们使用EP6作为输入端,FPGA将数据写入EP6,EP6自动转发数据到PC。配置FLAGB为满标志,这里作为EP6的满标志。TD_Poll()这个函数是循环执行的函数,在里面可以进行一些操作,如进行端点数据的交换等。这里我们不用8051CPU处理数据,故可以为空。配置好之后就可以去FPGA中向EP6(FIFO)写入数据。采用异步写入的方式,即使用slwr信号作为写入信号。下图为异步写的时序图:

可以看得出来这个时序很简单了,只要保证fd数据总线在slwr的上升沿保持稳定即可。

/* Generate USB read/write access request*/
always @(negedge Clk_5M or negedge reset_n)
beginif (~reset_n ) beginaccess_req<=1'b0;endelse beginif (usb_flagb & (bus_busy==1'b0))     //EP6的FIFO不满,而且状态为idleaccess_req<=1'b1;                             //USB写请求else access_req<=1'b0;end
end/* Generate USB write command*/
always @(posedge Clk_5M or negedge reset_n)beginif (~reset_n) beginusb_fifoaddr<=2'b10;usb_slcs<=1'b0;        usb_sloe<=1'b1;        usb_slrd<=1'b1;    usb_slwr<=1'b1;usb_fd_en<=1'b0;    usb_state<=IDLE;         end        else begincase(usb_state)IDLE:beginusb_fifoaddr<=2'b10;    i<=0;usb_fd_en<=1'b0;                      if (access_req==1'b1) begin                                   usb_state<=EP6_GET_DATA;                //开始GET数据bus_busy<=1'b1;                       //状态变忙end                else beginbus_busy<=1'b0;          usb_state<=IDLE;  end     end      EP6_GET_DATA:beginif(i==8) begin                        i<=0;    usb_state<=EP6_GET_OVER;//    data_reg<=shift_reg;                       //读取数据data_reg<=oe_ranNum;endelse begin                      i<=i+1'b1;endend          EP6_GET_OVER:beginif(i==4) begin                        i<=0;    usb_fifoaddr<=2'b10;                            usb_state<=EP6_WR_CMD;endelse begin                  i<=i+1'b1;endend    EP6_WR_CMD:begin          if(i==8) beginusb_slwr<=1'b1;i<=0;                            usb_state<=EP6_WR_OVER;endelse beginusb_slwr<=1'b0;    usb_fd_en<=1'b1;                     //数据输出                        i<=i+1'b1;endend          EP6_WR_OVER:begin          if(i==4) beginusb_fd_en<=1'b0;bus_busy<=1'b0;i<=0;                            usb_state<=IDLE;endelse begin          i<=i+1'b1;endenddefault:usb_state<=IDLE;endcaseendend  assign usb_fd = usb_fd_en?data_reg:8'bz; 

完成之后将.bit烧入FPGA中,打开Cyconsole,Options -->EZ-USB Interface,将Bulk Trans这一行的Pipe切换为Endpoint 6 IN,再单击Bulk Trans就可以看到FPGA的数据已经发送到PC啦!

 

转载于:https://www.cnblogs.com/kl2blog/p/6718465.html

EZ_USB salveFIFO相关推荐

  1. [2022CISCN]ez_usb

    [2022CISCN]ez_usb:键盘提取压缩包和密码流量分析 首先题目给的提示是这个是键盘流量,那么我们搜索8个字节长度的数据包,这里发现有两个Destination的数据包的长度是8,说明键盘给 ...

  2. 2021年中国工业互联网安全大赛核能行业赛道writeup之usb流量分析

    目录 一.USB协议 二.键盘流量 三.鼠标流量 四.writeup 附件题:usb流量分析 题目描述: 具体描述忘记了o(╯□╰)o 大概意思是有个U盘插到电脑上,然后经过一些操作导致该电脑重启了. ...

  3. GPIF II designer使用说明+CYUSB3014芯片基本信息介绍——英文文档学习记录

    这篇文章是基于之前FX3实现FPGA与USB3.0通信的内容.本人新手,写的不好如有错误请原谅.今天来记录一下官方文档的学习. 一.基本信息讲解 1.1 GPIF II Designer和CYUSB3 ...

  4. 2020ciscn wp

    目录 1.签到电台 2.基于挑战码的双向认证(1,2) 3.web Ezpo 4.基于挑战码的双向认证3 5.ISO9798 6.问卷调查 7.ez_usb 8.login-nomal 1.签到电台 ...

  5. CY68013 FPGA通信联调总结

    1. 简介 CY68013是一款USB 2.0芯片,常用作fpga与pc的接口芯片,其硬件可以自动处理USB协议,也可以在里面下载对应的固件程序,由固件程序来完成USB协议的通信.我们只关心USB数据 ...

  6. 第15届全国大学生知识竞赛 2022ciscn初赛 部分wp

    Misc ez_usb 1.键盘流量 USB协议数据部分在Leftover Capture Data域中,数据长度为八个字节.其中键盘击键信息集中在第三个字节中. 如图,发现击键信息为0x06,即对应 ...

  7. 第十五届全国大学生信息安全竞赛创新实践能力赛

    ​ 基于挑战码的双向认证1 这两个应该是属于非预期,查找文件内容,两个flag都出了: find / |xargs grep -ri flag{ 2>/dev/null flag{34f5fda ...

  8. 第15届全国大学生知识竞赛场景实操 2022ciscn线上初赛 部分writeup

    文章目录 ez_usb everlasting_night 问卷调查 签到电台 Ezpop **基于挑战码的双向认证1.2** 基于挑战码的双向认证3 Iso9798 Login-nomal Baby ...

  9. 第15届全国大学生知识竞赛场景实操 2022ciscn初赛 部分writeup

    文章目录 Crypto 签到电台 基于挑战码的双向认证1 基于挑战码的双向认证2 基于挑战码的双向认证3 Misc ez_usb everlasting_night 问卷 babydisk Web E ...

最新文章

  1. Linux导入ora-39070,impdp 导入数据报ORA-39002,ORA-39070,ORA-39002, ORA-39087
  2. 【TensorFlow】tf.concat的用法
  3. matlab求解线性方程组
  4. HTML5火焰文字特效DEMO演示---转载
  5. 路由cpu负载过高检查
  6. c语言编写贪吃蛇难点解析,刚学C语言,想写一个贪吃蛇的代码
  7. CPU里都有几十亿个晶体管,万一坏掉几个还能用吗?
  8. 2016 中国大数据技术大会 相关资料
  9. 【Python-3.3】win7 安装pip
  10. 微信公众号后台开发---永久素材失效
  11. 火狐flash扩展_获得您喜欢的扩展以在Firefox Alpha构建中使用
  12. 尝试说透网关和路由器的异同
  13. oracle HTTP Server安装和配置为集群代理(linux)
  14. Javascript判断是否是ipad的浏览器
  15. Android中EditText优先弹出数字输入法
  16. MT6737芯片技术资料集锦下载
  17. 《浅谈-Android系统越用反应越慢的问题》
  18. 百分制转五分制(java)
  19. 历届CSP真题题解-CSP刷真题之路
  20. 20194311姜晨昊Exp3-免杀原理与实践

热门文章

  1. Oracle用imp和exp实现数据的导入和导出
  2. bootstrap学习笔记(1)基础段落,表格的实现
  3. kafka partition分配_logstash消费kafka数据,partition分配不均衡
  4. idea多行编辑_开发神器idea被玩残了,你们功不可没啊!
  5. Python中利用*打印不同的三角形
  6. Linux下如何用pxe安装虚拟机?
  7. rainmeter皮肤_关于雨滴桌面(rainmeter)中无界大神的仿WMP外星人播放器修改方案...
  8. 圣诞限定快乐,送3本技术好书
  9. win10 tensorflowgpu-2.0安装cuda10.0 +cudnn7.4
  10. TriumphX与Metaverse NFT艺术家RisingSun签署专属合同