毕业设计的题目是“基于USB2.0的FPGA和PC之间的通讯”。用的是Altera的FPGA,具体型号暂时不清楚,后续会更新。USB控制器用的是CY7C68013A。开发软件是Quartus II 9.0。连接上是将FPGA和CY7C68013A连接,然后CY7C68013A和PC端连接。我会开一个文件夹写关于这个题目的相关文章。这是第一篇。
总的来说,搭建这个系统,主要分成两个部分:
1. FPGA控制CY7C68013A部分的代码(Verilog/Quartus II 9.0)
2. USB固件程序开发(C/Keil 5.1)

本文主要写FPGA控制CY7C68013A程序中的写数据部分
CY7C68013A内部结构介绍

首先介绍USB控制器,这是整个系统中很重要的一个部分。CY7C68013A是CYPress公司的一款USB控制器,使用广泛,内部结构图如下:

CY7C68013A有三种工作模式,Ports模式,GPIF模式,Slave FIFO模式,介绍固件程序篇再详细介绍。本次搭建的系统使用的是Slave FIFO模式。

FPGA和CY7C68013A的连接

连接部分如图所示:

IFCLK是时钟信号
FLAGA,FLAGB,FLAGC,FLAGD都是FIFO的输出状态(空还是满或者是半满)标志信号,本次设计中暂时设定只是用一个FIFO,代码中也没有指出用的是哪个FIFO和FLAG信号,属于简化了设计
SLOE是仅输入输出使能
SLRD是读数据使能
SLWR是写数据使能
FIFOADR[1:0]是FIFO选择信号,本设计中只用一个FIFO,所以代码中没有这个参数的设置
PKTEND是将FIFO的数据打包并传输到端点的输入端,就是数据输入了一部分后用这个信号将数据打包然后一起传输
FD[15:0]是数据传输信号,本次设计中使用的数据总线只有8位,简化了设计
#####异步写信号
异步写状态机示意图如下:

IDLE:当写数据事件发生时,进入状态1
状态1:激活FIFOADR[1:0],指向输入FIFO,然后进入状态2
状态2:如果FIFO状态是满,就在状态2等待,如果没有满,就进入状态3
状态3:驱动数据到数据总线,使能SLWR信号,持续一个时钟周期后进入状态4
状态4:如果还有数据需要传输,回到状态2循环,否则结束进入IDLE状态
本次设计中不考虑FIFOADR[1:0]的激活,所以在写数据事件发生时,直接进入状态2,这样可以简化设计,便于早期写代码

Verilog代码

FPGA控制代码用Verilog编写,编译软件是Quartus II 9.0,仿真软件为Quartus自带
代码如下所示:

// a test for USB FIFO write
//last edit:2017.02.27
//  signal explaination
//  CLK(posedge) :   the Clock Signal
//  RRESET(posedge): restart all signal and give them a number
//  FULL(high means not full): to judge whether the FIFO is FULL or not
//  SLOE(high),SLRD(high),SLCS(low):  control signal
//  SLWR: the write permitted signal
//  SLWR_reg(high means not permitted): the reg type of SLWR
//  PKTEND(low means effective): pack data
module JellyBeam(CLK,SLWR,SLCS,DATA,PKTEND,FULL,SLOE,RESET,SLRD);
input CLK,RESET;
input FULL;
output SLCS,SLOE,SLRD,SLWR,PKTEND;
output [7:0]DATA;
reg [7:0]DATA;
reg SLCS,SLOE,SLRD,SLWR,PKTEND;
reg [11:0]cnt;
reg SLWR_reg;//creat cnt and PKTEND
always@(posedge CLK or posedge RESET)
begin if (RESET)begin cnt<=12'b0;PKTEND<=1'b1;    //it's effective when it's lowendelse beginif(SLWR_reg==1'b0 &&FULL==1'b1 && PKTEND==1'b1)begin cnt<=cnt+1'b1;endcase({cnt[11],cnt[10],cnt[9]})              //the high 3-bit are 3 types of size of data pack,applying to 3 types of PKTEND 3'b010: if(cnt[7:0]==8'b00001000)       begin                          PKTEND<=1'b0;cnt[11:0]<=011000000000;endelsePKTEND<=1'b1;3'b100: if(cnt[7:0]==8'b00010000)beginPKTEND<=1'b0;cnt[11:0]<=101000000000;endelse PKTEND<=1'b1;3'b110: if(cnt[7:0]==8'b00011000)begin PKTEND<=1'b0;cnt[11:0]<=111000000000;endelsePKTEND<=1'b1;default: PKTEND<=1'b1;endcaseend
end//maintain the control point
always@(posedge CLK or posedge RESET)
beginif(RESET)begin SLWR_reg<=1'b0;      //slwr should be effective when it's lowSLOE<=1'b1;SLCS<=1'b0;          // beginning of the process,better to be low at the beginningSLRD<=1'b1;endelsebegin SLOE<=1'b1;SLCS<=1'b0;SLRD<=1'b1;if(FULL)beginSLWR_reg<=~SLWR_reg;endelsebeginSLWR_reg<=1'b1;endend
end//write data
always@(posedge CLK or posedge RESET)
beginif(RESET)beginDATA<=8'b00000000;endelsebegin if(SLWR_reg==1'b0 && FULL==1'b1 && PKTEND==1'b1)begin DATA<=cnt[7:0];endend
end//creat SLWR
always@(posedge CLK or posedge RESET)
begin if(RESET)begin SLWR<=1'b1;endelsebeginSLWR<=SLWR_reg;end
endendmodule

代码中各信号已经有了注释,在这里不再花大篇幅解释。
最后仿真结果如下图:

数据中给出的时钟频率为200MHz,FULL信号为随机给入,RESET信号在刚开始给出,后续全程为低电平,从图中可以看出,数据能正确地传输到DATA端口中,然后通过DATA端口输入到CY7C68013A中

总结

本文中只写了写入数据部分,而且只是一个初稿,里面很多地方进行了简化设计,后续会进行更新和改进

FPGA和CY7C68013A的连接以及控制程序(1)相关推荐

  1. 基于FPGA的cy7c68013a双向通信实验

    基于FPGA的cy7c68013a双向通信实验 本实验是基于FPGA的cy7c68013a的USB双向通信实验,以前折腾过一段时间cy7c68013a,没有入门时感觉好难,入门了就会感觉很简单.本教程 ...

  2. USB通讯基FPGA的CY7C68013A实现(2)

    写这篇博客的初衷 虽然很多人都会被68013的寄存器配置困扰,但是对于我们的使用来讲,官方和很多厂商会提供固件库,他们都会把常用功能都已经配置好,对于我们直接使用他们的固件就够了,对于我们开发而言可能 ...

  3. USB通讯基于FPGA的CY7C68013A实现(1)

    最近要写一个USB的通讯协议,实现USB的数据收发,以前做过一些UART.IIC.SPI的通讯,一开始还以为USB 也是这样,本来还以为很简单,结果越做越复杂,经过两三周的时间,终于实现了整个USB通 ...

  4. FPGA USB FX2 ov5640摄像头视频采集 驱动CY7C68013A实现 提供2套工程源码和技术支持

    目录 1.前言 2.我这儿已有的 FPGA USB 通信方案 3.CY7C68013A芯片解读和硬件设计 FX2 简介 SlaveFIFO模式及其配置 4.工程详细设计方案 5.vivado工程 6. ...

  5. (4)FPGA JTAG接口连接(学无止境)

    1 JTAG简介 FPGA烧录bit文件需要用到仿真器,仿真器与FPGA硬件板卡通过JTAG接口连接.JTAG主要起作用的只有五个信号:Test Clock Input(TCK).Test Mode ...

  6. 74HC595驱动(并转串,fpga与时钟匹配,fpga与外部芯片的连接注意事项)

    上一次设计的动态扫描数码管显示电路模型如上,这是一个32位并行数据[31:0]disp_num选通输出并行数据[7:0]select和[7:0]段选的电路.因此需要输出16个信号 而在开发板上的电路与 ...

  7. fpga的jtag接口扫不到器件_JTAG接口无法连接的问题

    测试时采用的万用表直流档测的,因为当时手边没有示波器,所以就用万用表将就一下子.DSP JTAG连接如下图所示: 一切正常,为啥连接不上呢?开关反复测了几遍,不存在前些天的问题,最郁闷的是有时候能连上 ...

  8. [Craftor原创]EZ-USB与FPGA的通信接口设计

    声明:Craftor原创,转载请注明出处. 使用芯片:CY7C68013A(Cypress)与XC3S50AN(Xilinx) 一.原理图 FPGA与EZ-USB通过异步FIFO方式连接,以下截图来自 ...

  9. DSP的EMIF接口通信FPGA

    DSP通过EMIF接口与FPGA通信采集视频 背景 使用FPGA系统进行视频采集,DSP进行视频处理需要了解以下知识: 1.  DSP-C6000系列的中断与GPIO系统 2.  DSP-C6000系 ...

最新文章

  1. 《科学》杂志做了一个清单,告诉你今年 10 个最重要的科技突破
  2. 点击失效,一层透明的view,
  3. Metrics.NET 项目
  4. xshell无法连接linux虚拟机问题的解决办法
  5. HashSet和HashMap的区别
  6. 以太网RJ45 接线标准 线序(备忘)
  7. MacBook设置终端命令行的颜色高亮显示
  8. 如何把一个字符串填充到一个无类型的指针 - 回复 豪杰的爸爸 的问题
  9. 华硕笔记本重装系统按哪个键进u盘启动项
  10. [原]VS2012入门图文教程——第一个程序Hello World
  11. 实习成长之路——设计模式四:如何做到“对扩展开放、修改关闭”?扩展和修改各指什么?
  12. 解决 Manjaro 中 Linuxqq扫码登陆闪退问题
  13. 极简jmeter使用教程
  14. php获取毫秒级别时间戳及转换日期
  15. 412 Precondition Failed
  16. keil5c语言定义引脚,keil编写C程序是不是不能在函数内定义变量啊,求大神
  17. 如何成为一个优秀的测试工程师
  18. 计算复杂性第八章——空间复杂性
  19. HTML+JavaScript简单搜索功能实现
  20. b560主板怎么样 b560主板支持的cpu

热门文章

  1. STM32PWM调速小车速度(全网最强)
  2. 论坛相关英语表达词汇
  3. Navicat12安装教程
  4. python库:scapy使用
  5. win10下载安装eclipse手把手教程,适合新手小白
  6. LEARNED VIDEO CODEC WITH ENRICHED RECONSTRUCTION FOR CLIC P-FRAME CODING个人理解
  7. 机器学习实验1 / 线性回归
  8. 电脑开机黑屏提示 ERROR 0199 System Security-Security password retry
  9. 【语音识别】基于VQ特定人孤立词语音识别matlab 源码
  10. python进行微积分运算——sympy库简介