(资料来源于网络以及自己的理解,再加上自己整理,只供学习参考,不用于商业用途,侵删)
目录
DDR3
基础知识
1.DDR3物理引脚可划分为4类:地址总线、数据总线、控制线、电源与参考电压。
1.数据线
- DQ:数据线
- DQS DQS#:数据选通
- TDQS TDQS#:数据选通
- DM:数据屏蔽
2.地址线
- A:地址
- BA:bank选通
3.控制线
- CS#:片选
- RAS#:行选
- CAS#:列选
- ZQ#:校准
MIG IP核
我们主要控制用户app接口就好,并且用户接口也不需要都用到,以下是常用的。
写命令(读写状态一般用状态机)
处于写数据状态时,当app_rdy和app_wdf_rdy变高时,我们拉高app_en,传输app_addr地址和app_cmd命令。
处于读数据状态时,当app_rdy变高时,也需要拉高app_en,自动读取数据。
写数据
当app_rdy和app_wdf_rdy变高时,我们拉高app_wdf_wren,传输数据。
读数据
当读命令写入后,若检测到app_rd_data_valid变高,则说明此时接收到了数据。
PS:根据数据手册, 其实用户可以只判断 app_rdy 信号,当 app_rdy 信号为高, 就可以拉高使能 app_en,之所以同时判断 app_rdy 和 app_wdf_rdy 是因为本实验只考虑 DDR3 写状态命令发送和数据发送同拍的情形,这样的做法基本上不会对 DDR3 读写操作效率造成很大影响,但是却能大大简化代码编写难度。
ARP
概述
数据包帧格式
- 单播地址:第一个字节的最低位为 0,比如 00-00-00-11-11-11,一般用于标志唯一的设 备;
- 组播地址:第一个字节的最低位为 1,比如 01-00-00-11-11-11,一般用于标志同属一组的多个设备;
- 广播地址:所有 48bit 全为 1,即 FF-FF-FF-FF-FF-FF,它用于标志同一网段中的所有设备。
之所以限制最大传输单元是因为在多个计算机的数据帧排队 等待传输时,如果某个数据帧太大的话,那么其它数据帧等待的时间就会加长,导致体验变差,这就像一 个十字路口的红绿灯,你可以让绿灯持续亮一小时,但是等红灯的人一定不愿意的。另外还要考虑网络 I/O 控制器缓存区资源以及网络最大的承载能力等因素,因此最大传输单元是由各种综合因素决定的。为了避 免增加额外的配置,通常以太网的有效数据字段小于 1500 个字节。
ARP协议
PHY芯片与RGMII接口
以太网的通信离不开PHY芯片,PHY和MAC之间的接口用的比较多的有MII,RMII,GMII,RGMII。
GMII ( Gigabit MII ): GMII 接口向下兼容 MII 接口,支持 10Mbps 、 100Mbps 和 1000Mbps 的操作,数据位宽为 8 位,在 1000Mbps 传输速率下,时钟频率为 125Mhz 。RGMII ( Reduced GMII ): RGMII 是 GMII 的简化版, 数据位宽为 4 位 ,在 1000Mbps 传输速率下, 时钟频率为 125Mhz ,在时钟的上下沿同时采样数据。在 100Mbps 和 10Mbps 通信速率下,为单个时钟沿采样。
这里面 RXCTL和 TXCTL其实分别是GMII接口中的 RX_DV和 RX_ERR的异或,以及 TX_EN和 TX_ERR的异或。
RGMII接口时序
时钟域和时钟树
时钟域指的是在同步电路中,被相同时钟信号驱动的寄存器共同组成一个时钟域。
在理想的同步电路中,我们认为同时钟域中的所有寄存器的时钟边沿应同时到达。但是在实际的电路中,这是不可能实现的,因此就需要对时钟域中的时钟信号进行管理,也就是采用时钟树了,时钟树可以保证时钟域中的各个寄存器的时钟边沿时间差最小(而并不一定能让其到达时间相同),从而保证良好的时序特性。
基本原理:时钟树主要利用多级扇出的形式来达到最终的高扇出结果,而通过控制各级扇出后的布线长度尽量一致来保证时钟信号能够尽可能同时到达各个触发器。
基本时钟树:全局时钟树、区域时钟树、IO时钟树
其原理示意图如下
加时钟树前结构如下:
加时钟树后结构如下:
Xilinx原语
三种工作模式
1.OPPOSITE_EDGE
2.SAME_EDGE
3.SAME_EDGE_PIPELINED(一般用这个模式)
ODDR:通过 ODDR 把两路单端的数据合并到一路上输出,上下沿同时输出数据,上升沿输出 a 路, 下降沿输出 b 路。
工作模式:
1.OPPOSITE_EDGE(不咋用)
2.SAME_EDGE(一般用这个)
IDELAYE2:(要搭配IDELAYCTRL用)
一般给IDELAYE2的时钟就200MHZ,对应的delay_resolution=78ps,那么delay_time=600ps + tap * delay_resolution
设计框架
RGMII_TO_GMII模块
IDELAYE2主要避免因为走线长度不一样导致rxd、ctl与rxc不同相,但感觉或许也没啥必要
GMII_TO_RGMII模块(没用ODELAYE2是因为现在用的板子不支持\笑)
ARP模块(TX和RX)
用状态机就是了,没啥好说的
基于IIC的EEPROM读写
IIC的原理
上图为IIC的通信协议时序:
- 当SCL为高电平时,SDA拉低,代表开始信号。
- 当SCL为时钟脉冲时,SCL低电平时SDA进行变化,当SCL为高电平时SDA需要保持稳定,此时代表传输了一个bit的数据,注意最先传输的是最高位。(因为如果SCL为高电平时若SDA变化则会被认为是开始或结束)
- 第8个时钟周期末,主机释放SDA(将其置为高阻),第9个周期从机通过SDA进行应答,若为低电平代表传输成功,相反则为失败。然后从机释放SDA,等待主机继续传输数据或结束。
- 当SCL为高电平时,SDA拉高,代表结束信号。
EEPROM通信协议
器件地址:1010是固定的,A2,A1,A0可通过EEPROM芯片引脚接高低电平来进行设置。
读写控制位:0表示写,1表示读。
当eeprom的存储单元容量小于等于258Byte时,字地址为8位,否则为16位(高3位不用)。
写数据(器件地址,字地址,写数据)
写数据分为单次写和连续写,区别在于写完一字节数据后,发送结束信号还是继续写数据。
读数据
读数据分为当前地址读、随机地址读和顺序读。
当前地址读(不咋用):由于IIC读或写一次后,其内部地址指针自动加1,故其读取的是上次读写操作的下一个地址的数据。
随机地址读:器件地址(写命令),字地址,起始信号!,器件地址(读命令),读数据。
前面第一次发送的器件地址(写命令),字地址是虚写,为了让地址指针指向这个地址。
PS:注意第一次发送完器件地址和字地址后还需要重新发送起始信号。还要注意从机发送完数据主机要进行非应答!
连续读:当前地址读的连续版本,没太多区别。
程序设计
写个状态机,分为IDLE,开始,发送器件地址,ACK1,ACK2,NACK,结束等等状态,本次SCL选择250K频率,通过时钟计数产生SCL_cnt,将一个bit分为四个cnt,0和3拉低,1和2拉高。