高速USB2.0外设控制器接口设计

1、芯片选型:CY7C68013A;

2、介绍:赛普拉斯半导体公司 (赛普拉斯)的 EZ-USB FX2LP(CY7C68013A/14A) 是高集成、低功耗 USB 2.0 微控制器EZ-USB FX2™ (CY7C68013) 的一个低功耗版本;

3、软件:8051 代码运行介质:

  内部 RAM,通过 USB 下载;

  内部 RAM,从 EEPROM 加载;

4、应用

  (1)低速设备(10-100kbps):键盘,鼠标

  (2)全速设备(500kbps-10mbps):音频、麦克风

  (3)高速设备(25-400mbps):视频、图像

5、校验方式(CRC)

  (1)CRC5:x^5 +x^2 +1 (除数100101)

  (2)CRC16:x^16 +x^15 +x^2+1(除数1100000000101)

6、传输方式

  Usb2.0能够了传输方式(根据设备的应用划分)有4种,具体如下:

(1)配置传输

  主机控制从机采用传输方式,步骤如下:

  ①主机发出一个配置传输令牌包

  ②主机发出配置数据包

  ③从机给主机一个应答包

(2)块传输

  主要从来传输大批量数据,比如U盘,步骤如下:

  ①主机发出一个读数据/写数据传输令牌包

  ②主机发出写数据包/从发出读数据包

  ③从机给主机一个写应答包/主机给从机一个读应答包

 (3)同步传输

  针对像音频,视频类的设备,数据传输实时性高,因此专门定义了这种传输类型

  步骤如下:

  ①主机发出一个读同步传输读数据令牌包(每隔一定的时间轮训)

  ②从机给主机数据包

 (4)中断传输

  针对终端类设备,像键盘,鼠标,针对这种设备定义了专门的传输类型,步骤如下:

  ①主机发出一个读终端传输读数据令牌包(每隔一定的时间轮训)

  ②从机给主机数据包

7、USB解决方案

   针对USB这种通用串行总线,全球有专门的厂家产生usb解决方案的芯片,目前所熟知的全球最大的解决方案的公司cpress,在FPGA开发中也会用这些的解决方案;我们只需要通过芯片预留的GPIF接口和FIFO_SLAVE接口,将FPAG与USB进行连接。

8、信号介绍

Slwr_n    :    写有效信号       芯片输入信号

Slrd_n    :    读有效信号       芯片输入信号

Sloe_n     :     读数据使能信号     芯片输入信号

port_sel[1:0] :     端口选择      芯片输入信号(00:EP2、01:EP4、10:EP6、11:EP8)

Ifclk       :  芯片时钟      芯片输出信号

fd[15:0]    :  数据(1次两字节)   双向

(Flaga、Flagb、Flagc、Flagd):对应EP2、4、6、8的端口缓存标志,如果该端口为读端口标志位高电平表示非空,如果是写端口,写之前单个缓存空的时候标志位低电平,当写入数据后没有满则为高电平,当单个缓存写满后变为低电平

 9、接受usb数据时序

10、接收USB数据接口代码

 1 module exfx2_receive(if_clk, rst_n, slrd_n, sloe_n, slwr_n, port_sel, fd, flags, wr_en, wr_clk, wrdata, full);
 2 
 3     input if_clk;
 4     input rst_n;
 5     
 6     //usb接口
 7     output reg slrd_n;  //读有效信号
 8     output reg sloe_n;  //读数据使能
 9     output reg slwr_n;  //写有效信号
10     output [1:0] port_sel;  //端口选择
11     input [15:0] fd;    //数据线
12     input flags;   //缓存标志
13     
14     //fifo写接口
15     output reg wr_en;
16     output wr_clk;
17     output reg [15:0] wrdata;
18     input full;
19     
20     reg [1:0] state;
21     parameter S0    = 2'd0;
22     parameter S1    = 2'd1;
23     parameter S2    = 2'd2;
24     
25     assign port_sel = 2'b00;
26     
27     always @ (posedge if_clk, negedge rst_n)
28     begin
29         if(!rst_n)
30             state <= S0;
31         else
32             case(state)
33                 S0  :   if(flags)
34                             state <= S1;  
35                 S1  :   state <= S2;
36                 S2  :   state <= S0;
37                 default :   ;
38             endcase
39     end
40     
41     always @ (posedge if_clk, negedge rst_n)
42     begin
43         if(!rst_n)
44             begin
45                 slrd_n <= 1'b1;
46                 sloe_n <= 1'b1;
47                 slwr_n <= 1'b1;
48             end
49         else
50             case(state)
51                 S0  :   begin
52                             slrd_n <= 1'b1;
53                             sloe_n <= 1'b1;
54                             slwr_n <= 1'b1;
55                         end 
56                 S1  :   begin
57                             slrd_n <= 1'b0;
58                             sloe_n <= 1'b0;
59                             slwr_n <= 1'b1;
60                         end 
61                 S2  :   begin
62                             slrd_n <= 1'b1;
63                             sloe_n <= 1'b0;
64                             slwr_n <= 1'b1;
65                         end 
66                 default :   ;
67             endcase
68     end
69     
70     assign wr_clk = if_clk;
71     
72     always @ (posedge if_clk, negedge rst_n)
73     begin
74         if(!rst_n)
75             begin
76                 wr_en <= 1'b0;
77                 wrdata <= 16'd0;
78             end
79         else
80             if(state == S2 && (~full))
81                 begin
82                     wrdata <= fd;
83                     wr_en <= 1'b1;
84                 end
85             else
86                 wr_en <= 1'b0;
87     end
88 
89 endmodule

 11、发送给usb数据时序

12、发送给USB数据接口代码

module ezfx2_trans(tr_en, if_clk, rst_n, fd, slwr_n, flagw, rd_en, rd_clk, rddata, empty);

    input tr_en;
    input if_clk;
    input rst_n;
    inout [15:0] fd;
    output reg slwr_n;
    input flagw;
    
    //fifo读接口
    output reg rd_en;
    output rd_clk;
    input [15:0] rddata;
    input empty; 
    
    reg [1:0] state;
    parameter S0    = 2'd0;
    parameter S1    = 2'd1;
    parameter S2    = 2'd2;
    
    assign fd = (slwr_n == 1'b0) ? rddata : 16'hzzzz;
    
    always @ (posedge if_clk, negedge rst_n)
    begin
        if(!rst_n)
            state <= S0;
        else
            case(state)
                S0  :   if(tr_en && (~empty))
                            state <= S1; 
                S1  :   state <= S2;
                S2  :   state <= S0;
                default :   ;
            endcase
    end
    
    always @ (posedge if_clk, negedge rst_n)
    begin
        if(!rst_n)
            slwr_n <= 1'b1;
        else
            case(state)
                S0  :   slwr_n <= 1'b1;
                S1  :   slwr_n <= 1'b0;
                S2  :   slwr_n <= 1'b1;
                default :   ;
            endcase
    end
    
    always @ (posedge if_clk  or negedge rst_n)
    begin
        if(~rst_n)
            rd_en <= 1'b0;
        else
            if(tr_en && (~empty))
               rd_en <= 1'b1;
            else
               rd_en <= 1'b0;
    end
    
    assign rd_clk = if_clk;   

endmodule

 

posted on 2020-11-13 21:12  追梦的少年郎  阅读(365)  评论(0)    收藏  举报

导航