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

FPGA控制DM9000A进行以太网数据收发的Verilog实现(2)

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2018-10-15 09:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

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

x
本帖最后由 Diabloa 于 2018-10-15 09:37 编辑
) A- ], S0 ~6 p3 J4 ^: q
: E# F2 M. N& F6 D
FPGA控制DM9000A进行以太网数据收发的Verilog实现
$ D% s: [4 ~$ I. w1 F: h2 l1 y
    初始化模块
    DM9000A正常工作需要在上电后对内部寄存器进行初始化,该过程通过FPGA对DM9000A外部控制总线和数据总线的读写操作完成。具体流程如下所示:

) N7 k; Z* }) x+ z
    >激活PHY
     设置GPR(REG_1F)CEPIO0bit[0]=0;
     复位后,DM9000A恢复默认的休眠状态,以降低功耗,因此需要首先唤醒PHY。
( A. a& x0 X8 U# o3 k2 c
    >进行两次软复位,步骤如下:
     设置NCR(REG_00)bit[2:0]=011,至少保持20μs;
     清除NCR(REG_00)bit[2:0]=000;
     设置NCR(REG_00)bit[2:0]=011,至少保持20μs;
     清除NCR(REG_00)bit[2:0]=000;
, I. [' C/ S( O$ ^, _: W% F
    >配置NCR寄存器;
     设置NCR(REG_00)bit[2:1]=00;配置为正常模式。
     通过改变该寄存器可以选择设置内部或者外部PHY、全双工或者半双工模式、使能唤醒事件等网络操作。

" J4 q( f7 ^4 ~4 w
    >清除发送状态;
     设置NSR(REG_01)bit[5]=1bit[3]=1 bit[2]=1;

/ u: T5 o7 w: Z& j9 x6 \
    >设置IMR寄存器(REG_FF)PAR bit[7]=1,以肩用RX/TX FIFOSRAM读/写地址指针自动返回功能;
9 `$ W% ?7 `, F5 _6 h) R- T
    >通过IMR寄存器(REG_FF)PRM bit[0]/PTM bit[1],对RX/TX中断使能。如果需要在一个数据帧发送完后产生一个中断,就应该将PTM      bit[1]置1,如果需要在接收到一帧新数据时产生一个中断,就应该将PRM bit[1]置1;
+ ?( W1 |% w& I4 n) y: L
    >设置RCR寄存器,使能数据接收功能。

5 U3 }) y! p+ `+ T) Y2 h, Y" c  @
    通过以上步骤,可以通过LED指示灯观测到DM9000A是否已成功初始化。

" z; A" |2 S1 z9 t4 ]" h
   发送模块
    DM9000A中的发送缓冲区可以同时存储两帧数据,可以按照先后顺序命名为帧I和帧II。DM9000A上电初始化后,发送缓存区的起始地址是00H,当前数据帧编号为帧I。两帧数据的状态控制字分别记录在DM9000A的状态寄存器03H和04H中。发送过程如下:
    首先,FPGA利用写操作寄存器MWCMD(REG_F8)向DM9000A的发送缓存区中写入发送数据帧,即需要先写入6字节的目的MAC地址,再写入6字节的源MAC地址,最后再写入发送数据。随后,FPGA利用写操作寄存器MWCMD(REG_F8)将数据帧长度写入寄存器FCH和FDH,数据长度为16位,将高8位写入寄存器FCH,低8位写入寄存器FDH。最后,FPGA将发送控制寄存器TCR(REG_02)的bit[1]置为高电平,向DM9000A发出发送数据指令。DM9000A会自动做一些处理才将数据发往以太网,这包括:插入报头和帧起始分隔符;插入来自上层协议的数据,如果数据量小于64字节,则自动补齐64字节;根据目标地址、源地址、长度/类型和数据产牛CRC校验序列,并插入校验序列位。这些处理都无需FPGA干预。处理完毕后,DM9000A即开始发送帧I,在帧I发送的同时,帧II的数据即可写入发送缓存区。在帧I发送完后,将帧II的数据长度写入寄存器FCH和FDH,最后将发送控制寄存器NSR(REG_01)的bit[1]置为高电平,即可开始帧II的发送。依此类推,下面发送的帧将会继续编号为帧I、帧II、帧I、帧II……按照同样的方式发送。
    如果FPGA将中断屏蔽寄存器 IMR(REG_FF)的bit[1]置为高电平,那么发送完毕后,DM9000A将会产生一个指示发送完成的中断信号。在发送过程中,FPGA可以查询寄存器标志位寄存器NSR(REG_01)中的TX1END bit[2]或者TX2END bit[3],得到数据帧的发送状态。
    发送流程,寄存器ISR中的PTS标志位是发送中断标志位,当一帧数据发送完毕,PTS=0,FPCA检测到该标志后,应清除标志位以便发送新的数据帧。这里需要注意的是,向FC、FD所写的帧长度应该包含目的MAC地址段、源MAC地址段和有效数据的总长度。

/ \9 G( _0 O7 \
   接收模块
    DM9000A中的接收缓存区是一个环形结构,初始化后的起始地址为0C00H,每帧数据都有4字节长的首部,然后是有效数据和CRC校验序列。首部4字节依次是01H、状态、长度低字节和长度高字节。 首部4字节含义如下:
    第一个字节用来检测接收缓存区中是否有数据,如果这个字节是01H,表明接收到了数据;如果为00H,则说明没有数据。但是,如果第一个字节既不是01H,也不是00H,DM9000A就必须作一次软复位来从这种异常状态中恢复。
    第二个字节存储着以太网帧状态,由此可判断所接收帧是否正确。
    第三和第四字节存储着以太网帧长度。后续的字节就是有效数据。

2 H: y+ r8 w4 i* |1 k8 [5 A3 l
    接收过程如下:
* ]& X* i: m4 k+ u" ]1 h
    查看中断状态寄存器,如果接收到新数据,寄存器ISR的PRS位将被置为0;如果检测到PRS=0,清除PRS,FPGA开始读接收缓存区数据。如果第一字节是01H,则说明有数据,00H说明无数据,否则要进行复位; 根据获取的长度信息,判断是否读完一帧,如果读完,接着读下一帧,直到遇到首字节是00H的帧,说明接收数据已读完。FPGA可以重新查看中断状态寄存器,等待新的有效数据帧。
1 b  Z" \, x& ~; o" H$ L
    结语
    本文对以太网控制器DM9000A进行了原理和功能介绍,并结合自行开发的SDR基带信号处理平台,基于FPGA设计实现了100M以太刚接口,其设计思路新颖,硬件连接简单。整体系统具有功耗低,体积小,运行稳定可靠等优点。

5 `2 }( n, w, P+ y  R3 t
. p# j: b9 e6 I, X7 E- p2 d7 j4 [  [% A
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-23 09:21 , Processed in 0.125000 second(s), 24 queries , Gzip On.

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

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

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