找回密码
 注册
关于网站域名变更的通知
查看: 225|回复: 1
打印 上一主题 下一主题

基于FPGA的USB2.0控制器设计

[复制链接]
  • TA的每日心情
    奋斗
    2022-1-21 15:15
  • 签到天数: 1 天

    [LV.1]初来乍到

    跳转到指定楼层
    1#
    发表于 2021-11-30 14:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

    EDA365欢迎您登录!

    您需要 登录 才可以下载或查看,没有帐号?注册

    x
    如图1所示由视频A/D采集的原始视频数据,在Philips公司生产的TM1300专用视频处理器中压缩后,通过USB控制器送至PC机。PC机的整个通过USB控制器传输到TM1300,解压后发送至视频D/A。
    / {8 F1 C( [( ^8 Q8 c& P4 c1 c$ V6 x0 F
    / u3 J( u$ C8 n% n6 y  j3 h9 _, T
    # t# k" G* b" h, K
    1 控制器结构原理3 q1 U' U) S+ y; H

    ) \0 R' M; b, n2 L) sUSB2.0控制器结构框图如图2所示。控制器主要由两个部分组成,其一为与外设的接口,另一个是内部协议层逻辑PL(Protocol Layer)。内部存储器仲裁器实现对内部DMA和外部总线对存储器访问之间的仲裁。PL则实现USB的数据I/O和控制。, N, n1 D% Y1 o0 r5 n2 L
    5 d5 a0 |/ x1 @  s! i. c8 H

      S+ }! a" h/ @" Z
    % a1 S; x' c1 o, {5 S6 ^接口有三种:一种是与微控制器之间的功能接口;一种是与单口同步静态存储器(SSRAM)之间的接口;另外一种是与物理层之间的接口。这里符合UTMI(USB Transceiver Macrocell InteRFace)规范定义。
    9 Z  a& E, r; ]% a5 p$ n( k( D6 h  ^  Z2 k
    2 控制器实现
    5 k: W0 I! o' N9 R( Q/ Q, V0 s1 H- [/ _! j) p( G5 S
    控制器接口的信号框图如图3所示。存储器采用标准的单口SRAM,其信号接口由32位数据线SRAM_DATA、15位地址线SRAM_ADDR及读写信号(SRAM_WE和SRAM_RD)组成,系统所需SRAM的容量为2 15×32bit=128KB。
    9 U" T: @1 ^5 B6 y  }! _5 f1 f
    ( Z, a& \. M: m# S
    2 m. H/ ?& Y/ I* H0 o5 }

    4 T) D' `0 a& y' G8 H* _+ w而与微控制器之间的接口信号包括32位数据线DATA、18位地址线ADDR以及DMA请求和响应信号(DMA_REQ和DMA_ACK)。由于要支持到128KB,需要17位地址线,另外还需要一根地址线来选通SSRAM和USB控制器内部的寄存器,总共需要18根地址线addr[17:0]。定义如下:" q0 a; Z6 y. \( y; M

    ; m& q' l* f, C; b/ Y- kUSB_RF_SEL <= !addr[17];
    1 ~9 o, x* X1 P# j2 N# \6 a2 p# f4 r! X1 q# ~
    USB_MEM_SEL <=addr[17];" K* F8 V5 J* z5 B
    % U/ e" F2 n1 n( }% y6 p
    第18位地址addr[17]为高时选择缓冲存储器,否则选择内部寄存器。地址addr[16:2]直接用于存储器SSRAM的地址。
    , ?0 Y( w  a' m9 q- K+ Q5 w( T$ I  m8 E
    2.1 UTMI接口2 ]/ R) {5 z' D: _

    0 H. H  S6 f1 \& l6 A/ k0 nUTMI接口信号包括:与发送数据相关的信号(TxValid、TxReady等),与接收数据相关的信号(RxActive、RxValid、RxError等)以及16位双向数据线。& P* K+ B+ @! O5 G: m. z5 i; {
    & Q5 A7 ~& }' t7 q( k
    在物理层,该控制器需要一个外部的USB收发器(Transceiver),本文采用的是Philips公司的ISP1501芯片。该芯片用作USB2.0的模拟前端,从USB电缆来的差分信号进行反转不归零码(NRZI)解码和位解填充转换成16位并行数据;反之,16位并行数据通过一个差分驱动电路经过串行化、位填充和NRZI编码输出到USB电缆上。ISP1501通过管脚MODE0和MODE1决定收发器的工作模式,共有4种工作模式:MODE[1:0]为“00”时,收发器处于断开状态;为“01”时处于全速(Full Speed)模式(此时USB带宽为12Mb/s);为“10”时是高速(High Speed)模式(此时USB最大带宽是480Mb/s);为“11”时是HS chirp模式。* N- B9 \( n( E2 x/ N# s( x
    ' Q' ]; W2 d8 W, M% o
    UTMI接口通过译码MODE[1:0]来控制ISP1501在HS和FS之间转变。
    6 K$ i( G4 F  @2 c
    ! h/ l" ~7 M' L! b, E6 h2 ]If mode_hs='1'then
    3 b4 A. i8 k' a. u8 F$ A' ?3 z& x8 u# I, R- X
    MODE<='10'
    5 J/ {# U1 B9 p* g
    ! \5 G) U* {8 C$ gElsif mode_hs='0'then1 z. z/ N+ }# A; s

    ! o; d8 k& ?4 t. ^3 o0 fMODE<='01'
    " [  K  a' ]) }4 b" a: k
    # V+ f" W. B" K, k" a+ ~End if;
    : M  N, P  Q% k# H5 a& R
    2 ]6 O% O% X; h3 c: q. Q. B2.2 协议层
    + j: X8 _! g2 t0 b- G1 N$ l
    % ^7 S9 f& k* i控制器的核心逻辑位于PL(Protocl Layer)模块,负责管理所有USB数据I/O和控制通信,其结构如图4所示。9 E+ ^+ m! h& c$ S

    ! P5 w/ t8 _/ W9 c; I
    6 ~7 H8 C+ V3 I) s- W# a# ]
    3 V3 u* l" D2 l3 w2 p( p* Y+ k3 c7 D
    DMA和存储器接口提供随机存储器访问和DMA操作。该模块使PL和外部微控制器采用DMA方式访问SSRAM。当外部总线有访问SRAM的请求时,且PL没有请求访问存储器,控制逻辑如下:req、ack分别对应外部总线和存储器之间的请求和响应信号,din、addr和we分别是外部总线给出的数据、地址和写信号,mreq是内部DMA向存储器发送的请求信号,mdin、maddr和mwe分别是内部DMA给出的数据、地址和写信号。
    4 q! I* I# T! Y# v7 B+ i2 W8 {! w" g; p2 q# a# p/ U
    sel <=(req OR ack_r) AND(NOT mreq);4 C" A# y  Y" j1 Z2 I1 B

    1 w  Z  Y' n) {, ]- n; q7 H1 Dif sel='1' then+ h6 J5 h( t) N" I$ {7 m

    ( L- n0 v  X) H0 G& fsram_out<=din;
    ! D0 O2 d: l" O
    ! }! l, C. t  I* c% Xsram_adr<=addr;; ]* ^8 v6 c9 {2 T% o1 s
    ( x0 [" L  f; _2 `2 [! b& m
    sram_we<=req AND we;: B# p: v. E+ _$ _9 f! I

    : _# ?5 b! U0 }" e4 relse6 a" }$ q; y( _( P

      i. G4 a2 X+ ^, q5 E4 N* g1 Lsram_out<=mdin;! x0 o0 h% A7 ~- m2 W% L

    + P1 ^6 ^& d/ n* C/ qsram_adr<=maddr;
    ) c+ K) F& M/ e8 C2 p0 I8 Q# `/ [+ c0 N/ v$ U8 J9 S
    sram_we <=mwe;% E* ?  `0 e* ?9 I7 l' I+ h  G

    / D% T2 E' g/ }% wend if;5 C9 p8 B# H* C! G* o% I. W  B7 f1 w
    - A! `5 n0 L# N9 ^" X& C
    由控制逻辑可看出,内部DMA操作的优先级比外部总线高。( z7 u6 e6 j. i! o4 H& U

    % Z! s7 ?9 E( c, d协议引擎(Protocol Engine)处理所有标准的USB握手信号和控制通信。分组组装器组装分组并送入输出FIFO,先组装分组头,插入适当的PID(分组标识)和校验和,然后加入数据域。分组拆装器先解码出PID和序列号以及校验和,再从8位PID取低4位(或高4位取反)得到PID[3:0],通过USB2.0协议的PID类型定义译码出PID名,判断是Token分组(OUT、IN、SOF和SETUP)还是DATA分组(DATA0、DATA1、DATA2和MDATA)。
    $ L" w* w5 i: x2 f" Z2 L3 @1 l! V/ d% I& X
    Pid_Token<=pid_OUT OR pid_IN OR pid_SOF OR pid_SETUP;" K6 K( g  C4 e3 e# `# J

    8 V/ N# a! e2 _: WPid_DATA <=pid_DATA OR pid_DATA1 OR pid_DATA2 OR pid_MDATA;
    + p, x0 i; q  f, A. g
    8 a8 T2 V" ]+ r! o, s" t& N如果是Token分组(格式定义如图5所示),则将后续的16bit数据分别放入两个8Bit临时Token寄存器token0和token1,然后取出分组中的7位地址、4位端点号及5位crc校验码。
    % `+ G! I* v) D+ a6 R  p. W! k  M) R
    Token_fadr<=token0[6:0];
    % p. L$ l5 o) g! h$ F, W2 S: `
    ! Q/ w# B' w! k, Y2 bToken_endp<=token1[2:0] & token0[7];
    + D; c6 A( u6 F$ c7 i
    7 J$ J4 o& R6 OToken_crc5<=token1[7:3];! j: S" g7 P% |3 j! d
    3 P7 P5 B8 K: d6 d% f  U) s
    3 I$ Y! D6 S' t4 f! |9 ]9 j. }

    " V8 a! x5 I9 L6 I$ D, J1 X" L: N( g对于特殊的Token须进行特殊的处理,本文实现的控制器只对SOF这一特殊Token进行操作,解出PID后的11位帧号及5位CRC5校验码。
    : Y8 d& I" m7 R. I, g& \% [3 f+ D6 e) \. Q$ ?! b0 E, ]6 ~2 \; S6 \$ p
    Frame_no<=token1[2:0] & token0;7 m* I' K& G; O% ]: p
    1 k  }3 S2 D, H# o
    Token_crc5<=token1[7:3];+ l; L& }% f! X/ _+ q$ ]% `

    : [6 h+ l& k) i检验校验码是否出错,如果出错等待下一个Token,否则将地址、端点号和帧号等放入相应寄存器。Token类型如果是IN,则执行组装分组并发送寄分组;如果是OUT则拆卸接收到的数据分组。对于其他不支持的Token则视为错误处理:Pid_ERROR<=pid_ACK OR pid_NACK OR pid_STALL OR pid_NYET OR pid_PRE OR pid_ERR OR pid_SPLIT OR pid_PING;如果出错则不进行Token的解码,而等待下一个Token的到来。  i9 n) i, p. p5 a2 b! c

    + k; z- V0 Z+ r$ l( H' V# m如果是DATA分组,则紧接着PID的是最大载荷为1024字节的数据和16位CRC16校验码。对数据的处理先写入端点寄存器,然后通过DMA操作写入SSRAM。下面详细介绍端点寄存器和DMA操作1 R# E* B5 N& }( n# g

    , ~: T3 Z4 B6 \! c* F

    ) n7 x& c$ H' L% y) j; l0 [9 ?
    6 v0 ]; ?0 [7 `" D( \8 O* J2.3 端点操作, q/ j2 ~9 ~7 s- \
    / i: g* m0 _5 W2 V9 L6 G3 m9 }) y
    数据的传输实际上通过端点(Endpoint)进行,控制器通过写端点的寄存器来配置端点,该控制器最多可有16个端点,每个端点有相应的4个寄存器:Epn_CSR、Epn_INT、Epn_BUF0和Epn_BUF1(这里n=0、1、2或3),其格式如图6所示。本文使用addr[8:2]7根据地址线来访问这些寄存器,addr[8:4]用来选择端点号,其值(16进制)从4到19分别表Epn(n=0...15)。addr[3:2]指定寄存器类型:“00”代表CSR(Control Status Register);“01”代表中断寄存器;“10”指向Buffer0;“11”代表Buffer1。这两个Buffer用来作临时数据存储,Buffer0和Buffer1分别作为专用的输入/输出缓冲器来提高USB的数据吞吐能力。双Buffer能够减少微控制器和驱动软件之间的延迟。其中端点的CSR寄存器指定端点的工作模式并且向控制器报告指定端点的状态。Ep_CSR[31:30]必须初始化为“00”(最初使用Buffer0),通过读这2位可以知道下次所要处理的缓冲器;为“01”时,指定Buffer1。Ep_CSR[27:26]和Ep_CSR[25:24]分别指定端点类型和传输类型,Ep_CSR[21:18]指定端点号,总共可以有16个端点。Ep_CSR[15]时DMA使能位,为“1”时允许外部DMA操作,否则不允许DMA操作。( b; _$ {& {, M  V/ h

    : [5 r+ ]8 A" g, s当控制器收到中断时,读中断源寄存器(Ep_INT[6:0])来判断中断源和产生的原因。可自定义中断源,如Ep_INT[2]定义为该控制器接收到不支持的PID而产生的中断:Ep_INT[2]<=Pid_ERROR。Ep_INT[4]和Ep_INT[3]分别表示Buffer1和Buffer0的满或空的状态位。
    + e$ n& G+ L  N' J
    . q* _2 K: b/ d$ ~0 F$ x( uEp_BUF[31](标记缓冲器是否被使用过)在使用后被控制器置“1”,在清空或重填充该缓冲器后,控制器清除该位。该闰初始化时为“0”。Ep_BUF[30:17]指定缓冲器能容纳的字节数。Ep_BUF[16:0]缓冲器的指针,装载存储器SRAM中数据的地址。2 ]9 ]' B' j* D- b
    * n# ?. P8 ], d# H
    控制端点(Endpoint0)比较特殊,由于它既要接收也要发送数据,因此对于控制端点,Buffer0用于OUT缓冲器,Buffer1则是IN缓冲器。从SETUP和OUT分组来的数据,写入Buffer0,IN分组的数据则是从Buffer1中获取。
    & v& o5 _6 b. R9 S/ m; X
    * E2 E  p$ N1 D2 ]& b
    & v" \* G" H, |, R3 G

    : @0 ]4 k9 B2 M6 B  ]2.4 DMA操作
    " B8 T5 s& f4 F- @2 @  r3 T) @' ^+ S; c) {. ]" H3 W. K% U# w1 ?$ q
    DMA操作允许控制器与功能接口之间数据的透明传输。一旦设置了DMA操作,则不需要微控制器的干预。每个端点有一对DMA_REQ和DMA_ACK信号。当CSR寄存器中DMA使能信号位(Ep_CSR[15])被置位时,USB控制器使用DMA_REQ和DMA_ACK这两个信号来进行DMA的流控制。当缓冲区有数据或为空需要填充时发送DMA请求信号DMA_REQ,每传输4字节,响应一个DMA_ACK信号。! s  }% ]; J( d, ]: A
    # w' {/ e1 [+ A  q
    由于USB2.0协议定义的事务操作以8bit为单位,因此完成一次32bit的DMA操作需要进行4次写8bit。内部DMA采用高效的One-hot状态机设计方法,状态转换如图7所示。当需要将接收到的数据存储到SRAM(rx_dma_en=1)时进入WAIT_MRD状态,在该状态选中一个临时数据寄存器,并向存储器发送请求信号mreq,从存储器中预取4字节(当接收到的数据少于4字节时,保证有4字节的数据写入存储器)到该寄存器中,然后进入MEM_WR状态。当PL的分组拆装器接收到1字节数据时,将该字节写入临时存储器,转入下一状态MEM_WR1;当分组拆装器没数据给DMA仲裁器时则进入MEM_WR2状态,在此状态将临时存储器中的数据写入SRAM,然后回到IDLE状态。在操作过程中,使用计数器adr_cb对传输字节数进行计数,通过addr_cb[1:0]的值标识当前传输的是32bit中的哪个字节。计数器sizu_c每接收1字节数值加1。
    $ W! t! w7 W! I+ m; a
    1 [! y* u0 k) v7 W# O在需要读取SRAM中的数据(tx_dma_en=1)时,DMA仲裁器由IDIE状态进入MEM_RD1状态,读取4字节数据到发送缓冲区中,然后进入状态MEM_RD2,再读4字节进入状态MEM_RD3,这8字节轮流使用Buffer0和Buffer1缓冲区:
    : w, P+ ?/ m7 d3 K; [/ {1 m8 C8 g! K% Z7 M0 Q; q
    在需要读取SRAM中的数据(tx_dma_en=1)时,DMA仲裁器由IDLE状态进入MEM_RD1状态,读取4字节数据到发送缓冲区中,然后进入状态MEM_RD2,再读4字节进入状态MEM_RD3,这8字节轮流使用Buffer0和Buffer1缓冲区:1 F% O; w" C$ W) l0 K

    2 V! }, e3 N! }1 w* nif((NOT adr_cb[2]) AND mack2 q! S# ?3 w/ l" F  F/ [+ v2 p
    / Z: ]: ]( n" B# v
    then Buffer0<=SRAM_DATA_I;2 N$ U; F% `. f1 U3 a: s: k
    / M$ E! v  @" E4 O$ C: Y9 z
    elsif (adr_cb[2] AND mack)6 T! O* _6 C: t: f5 l, Y% y
    9 Z" Y6 _# M2 J2 j: y  _
    then Buffer1<=SRAM_DATA_I;
    & ~% Z$ i1 h, t) I- b# Q
    2 o, u( D- ]5 i5 v) F) L( J: k7 kend if;% O2 |7 p- G; `. t

    2 h3 r% b9 V( N  w9 J1 b在MEM_RD3状态判断是否还需要读下一个数据,如果需要再进入状态MEM_RD2,否则在传输完所有字节后,返回到IDLE状态。在发送数据过程中,使用14bit计数器sizd_c决定传输字节数,取自Ep_BUF[30:17],每发送1字节数据,它的值减1。在图7中的各个状态中,由于超时、CRC校验错误或得到的数据发生错误时,PE产生的Abort信号会使当前状态都回到IDLE。- Q. j4 X6 N- s0 S1 s% c/ A3 C
    8 E9 s0 }9 X4 ]8 Y2 s* t

    / ^3 |0 q' W# i/ I& x2 i/ K2 w1 N
    $ B$ V- d5 n) Q$ T( H* G/ `文中阐述了USB2.0功能控制器的一种实现方案。 其VHDL语言实现代码,已在xilinx公司的FPGA Virtex XVV3006fg456中通过了Xilinx ISE的仿真、综合及布局布线。FPGA的规模是32万门,1536个CLB(可配置逻辑单元)。该控制模块占用2050个Slice(66%),使用了1697个Slice触发器(27%)和3047个4输入LUT表(49%)。整个FPGA的速度可达到56.870MHz,完全满足视频数据的高速传输(对32bit数据操作,达到480Mb/s的速度时钟只需15MHz)。该方案实现的控制器便于修改且易于实现,可作为一个功能模块嵌入到SOC中,可使不同情况最大限度地灵活设计片上系统。1 E0 S3 v3 A# H( u$ k+ O! \
  • TA的每日心情
    开心
    2022-1-29 15:07
  • 签到天数: 2 天

    [LV.1]初来乍到

    2#
    发表于 2021-11-30 15:15 | 只看该作者
    接口有三种:一种是与微控制器之间的功能接口;一种是与单口同步静态存储器(SSRAM)之间的接口;另外一种是与物理层之间的接口。这里符合UTMI(USB Transceiver Macrocell InteRFace)规范定义。
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-10-8 08:51 , Processed in 0.156250 second(s), 23 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表