常见标准接口时序
> 说明:以下为工程常用“标准模板时序”,用于文档、评审和 RTL 设计对齐。
> 具体器件的 setup/hold、时钟频率、空闲电平请以芯片手册和 PHY 规范为准。
I2C主设备单字节读取时序(Master)
> 注:上图采用当前文档统一的压缩节拍风格(1..0.1010...)用于可视化示意,不与下文“20个SCL周期”的逐拍统计一一对应。
I2C主设备单字节读取从设备时序说明:
1. 时钟频率参数化:
• SCL为I2C总线的串行时钟线,默认选频率为100kHz标准模式。为INPUT信号。
• 时钟周期参数化:parameter SCL_PERIOD = 10_000;(100kHz时为10μs)。
• 所有时序参数以SCL时钟周期数为单位,确保足够的时序余量。
• SDA为I2C总线的串行数据线。为双向的INOUT信号。
2. 起始位(START Condition)时序:
• 在SCL为高电平期间,SDA从高电平跳变到低电平。
• 起始条件建立时间:SDA下降沿前,SCL必须保持高电平至少 0.5个SCL周期。
• 起始条件保持时间:SDA下降沿后,SCL必须保持高电平至少 0.4个SCL周期。
• 起始条件后,SCL拉低,准备传输数据。
3. 地址位发送时序:
• 地址格式:7位从设备地址 + 1位R/W位(1表示读操作)。
• 默认地址参数化:parameter DEFAULT_ADDR = 7'h50;。
• 每个bit传输时序:
• SCL低电平期间设置数据位(持续 0.5个SCL周期)。
• SCL拉高,数据稳定(持续 0.4个SCL周期)。
• SCL拉低,准备下一个bit(持续 0.5个SCL周期)。
• 8位地址发送共需 8个完整SCL周期。
4. 应答(ACK)时序:
• 第9个时钟周期为ACK周期。
• ACK建立时间:SCL上升沿前,从设备必须设置好SDA至少 0.025个SCL周期。
• ACK采样时间:SCL高电平中间点采样SDA(持续 0.4个SCL周期)。
• ACK保持时间:SCL下降沿后,SDA保持至少 0个SCL周期(最小为0)。
• ACK=0表示应答,ACK=1表示非应答。
5. 数据读取时序:
• 主设备释放SDA线,从设备控制SDA线。
• 每个数据bit时序:
• 数据建立时间:SCL上升沿前,数据必须稳定至少 0.025个SCL周期。
• 数据采样时间:SCL高电平中间点采样数据(持续 0.4个SCL周期)。
• 数据保持时间:SCL下降沿后,数据保持至少 0个SCL周期。
• 8位数据读取共需 8个完整SCL周期。
• 第9个周期主设备发送ACK/NACK。
6. 主设备ACK/NACK发送时序:
• 读取数据后,主设备在第9个周期发送响应:
• ACK建立时间:SCL低电平期间设置SDA(0或1),持续 0.5个SCL周期。
• ACK保持时间:SCL高电平期间保持SDA,持续 0.4个SCL周期。
• ACK(SDA=0):继续读取。
• NACK(SDA=1):结束读取。
7. 停止位(STOP Condition)时序:
• 在SCL为高电平期间,SDA从低电平跳变到高电平。
• 停止条件建立时间:SCL高电平到SDA上升沿至少 0.4个SCL周期。
• 总线空闲时间:STOP后到下一次START至少 0.5个SCL周期。
8. 完整读操作时序周期数:
1. 起始条件:1个SCL周期(含建立和保持时间)。
2. 地址发送:8个SCL周期。
3. ACK等待:1个SCL周期。
4. 数据读取:8个SCL周期(每字节)。
5. 主设备ACK/NACK:1个SCL周期(中间字节ACK,最后一字节NACK)。
6. 停止条件:1个SCL周期(含建立时间)。
9. 单字节读取总周期数:
• 最小:1(START)+ 8(地址)+ 1(ACK)+ 8(数据)+ 1(NACK)+ 1(STOP)= 20个SCL周期。
• 实际设计建议增加余量:25-30个SCL周期。
10. 时序余量设计原则:
• 建立时间:设计值 = 规范值 × 1.5倍余量。
• 保持时间:设计值 = 规范值 × 1.2倍余量。
• 高低电平时间:设计值 = 规范值 × 1.3倍余量。
• 总线空闲时间:设计值 = 规范值 × 2.0倍余量(确保可靠)。
11. 示例参数(100kHz标准模式):
SCL周期 = 10μs T_SU_STA = 0.5周期 = 5μs(规范4.7μs) T_HD_STA = 0.4周期 = 4μs(规范4.0μs) T_HIGH = 0.4周期 = 4μs(规范4.0μs) T_LOW = 0.5周期 = 5μs(规范4.7μs) T_SU_DAT = 0.025周期 = 250ns(规范250ns) T_BUF = 1.0周期 = 10μs(规范4.7μs,加倍余量)
I2C 写寄存器时序(Master)
I2C主设备单字节写入从设备时序说明:
1. 时钟频率参数化:
• SCL为I2C总线的串行时钟线,默认选频率为100kHz标准模式。为INPUT信号。
• 时钟周期参数化:parameter SCL_PERIOD = 10_000;(100kHz时为10μs)。
• 所有时序参数以SCL时钟周期数为单位,确保足够的时序余量。
• SDA为I2C总线的串行数据线。为双向的INOUT信号。
2. 起始位(START Condition)时序:
• 在SCL为高电平期间,SDA从高电平跳变到低电平。
• 起始条件建立时间:SDA下降沿前,SCL必须保持高电平至少 0.5个SCL周期。
• 起始条件保持时间:SDA下降沿后,SCL必须保持高电平至少 0.4个SCL周期。
• 起始条件后,SCL拉低,准备传输数据。
3. 地址位发送时序:
• 地址格式:7位从设备地址 + 1位R/W位(0表示写操作)。
• 默认地址参数化:parameter DEFAULT_ADDR = 7'h50;。
• 每个bit传输时序:
• SCL低电平期间设置数据位(持续 0.5个SCL周期)。
• SCL拉高,数据稳定(持续 0.4个SCL周期)。
• SCL拉低,准备下一个bit(持续 0.5个SCL周期)。
• 8位地址发送共需 8个完整SCL周期。
4. 地址应答(ACK)时序:
• 第9个时钟周期为地址ACK周期。
• ACK建立时间:SCL上升沿前,从设备必须设置好SDA至少 0.025个SCL周期。
• ACK采样时间:SCL高电平中间点采样SDA(持续 0.4个SCL周期)。
• ACK保持时间:SCL下降沿后,SDA保持至少 0个SCL周期(最小为0)。
• ACK=0表示应答,ACK=1表示非应答。
5. 写数据发送时序:
• 主设备驱动SDA发送写数据字节(WDATA[7:0])。
• 每个数据bit时序:
• 数据建立时间:SCL上升沿前,主设备输出数据稳定至少 0.025个SCL周期。
• 数据采样时间:从设备在SCL高电平中间点采样(持续 0.4个SCL周期)。
• 数据保持时间:SCL下降沿后,数据保持至少 0个SCL周期。
• 8位写数据发送共需 8个完整SCL周期。
6. 数据应答(ACK)时序:
• 数据字节发送完成后,第9个时钟周期为数据ACK周期。
• 主设备在ACK周期释放SDA,由从设备驱动ACK位。
• ACK=0表示数据接收成功;ACK=1表示未应答(可触发重试或STOP退出)。
7. 停止位(STOP Condition)时序:
• 在SCL为高电平期间,SDA从低电平跳变到高电平。
• 停止条件建立时间:SCL高电平到SDA上升沿至少 0.4个SCL周期。
• 总线空闲时间:STOP后到下一次START至少 0.5个SCL周期。
8. 完整写操作时序周期数:
1. 起始条件:1个SCL周期(含建立和保持时间)。
2. 地址发送:8个SCL周期。
3. 地址ACK等待:1个SCL周期。
4. 写数据发送:8个SCL周期(每字节)。
5. 数据ACK等待:1个SCL周期。
6. 停止条件:1个SCL周期(含建立时间)。
9. 单字节写入总周期数:
• 最小:1(START)+ 8(地址)+ 1(地址ACK)+ 8(数据)+ 1(数据ACK)+ 1(STOP)= 20个SCL周期。
• 实际设计建议增加余量:25-30个SCL周期。
10. 时序余量设计原则:
• 建立时间:设计值 = 规范值 × 1.5倍余量。
• 保持时间:设计值 = 规范值 × 1.2倍余量。
• 高低电平时间:设计值 = 规范值 × 1.3倍余量。
• 总线空闲时间:设计值 = 规范值 × 2.0倍余量(确保可靠)。
11. 示例参数(100kHz标准模式):
SCL周期 = 10μs T_SU_STA = 0.5周期 = 5μs(规范4.7μs) T_HD_STA = 0.4周期 = 4μs(规范4.0μs) T_HIGH = 0.4周期 = 4μs(规范4.0μs) T_LOW = 0.5周期 = 5μs(规范4.7μs) T_SU_DAT = 0.025周期 = 250ns(规范250ns) T_BUF = 1.0周期 = 10μs(规范4.7μs,加倍余量)
---
<div style="height: 2em;"></div>
SPI 读寄存器时序(Mode0)
SPI读寄存器时序说明(Mode0):
1. 时钟与模式参数化:
• SPI工作模式为Mode0(CPOL=0,CPHA=0):空闲时SCLK为低,主从在上升沿采样数据。
• 时钟参数化建议:parameter SPI_CLK_DIV = N;,用于由系统时钟分频得到SCLK。
• 片选信号CS_N为低有效,读事务期间保持低电平。
2. 片选建立与结束时序:
• 事务开始:CS_N由高拉低,建立本次传输窗口。
• 建议满足:tCSS >= 0.5 * T_SCLK(片选到首个SCLK有效边沿建立时间)。
• 事务结束:最后一个bit完成后拉高CS_N,建议tCSH >= 0.5 * T_SCLK。
3. 指令与地址发送时序(MOSI):
• 主设备先发送读命令位R,再发送地址位A6..A0。
• 在SCLK下降沿后更新MOSI数据,在下一个SCLK上升沿被从设备采样。
• 命令+地址阶段共 8个SCLK周期(按图示模板)。
4. 空读/等待(Dummy)时序:
• 为满足从设备内部访问延迟,主设备继续输出Dummy位。
• Dummy期间MOSI可输出固定值(0或1),关键是维持时钟与片选连续。
• Dummy长度建议参数化:parameter DUMMY_CYCLES = M;。
5. 数据输出与采样时序(MISO):
• 从设备在MISO输出Q7..Q0,主设备在SCLK上升沿采样。
• 建议满足:tSU_DO >= 0.2 * T_SCLK、tH_DO >= 0.1 * T_SCLK。
• 单字节读取有效数据阶段通常为 8个SCLK周期。
6. 完整读事务周期估算:
1. CS_N拉低与建立:约1个SCLK周期。
2. 命令+地址:8个SCLK周期。
3. Dummy等待:DUMMY_CYCLES个SCLK周期。
4. 数据读取:8个SCLK周期(每字节)。
5. CS_N拉高与保持:约1个SCLK周期。
7. 设计余量建议:
• SCLK高/低电平时间建议各留 1.2~1.5倍余量。
• 对跨板走线场景,SCLK频率提升时优先验证MISO建立时间。
• 仿真中建议增加断言:CS_N低期间SCLK计数、Dummy长度、数据位对齐。
SPI 写寄存器时序(Mode0)
SPI写寄存器时序说明(Mode0):
1. 时钟与模式参数化:
• SPI工作模式为Mode0(CPOL=0,CPHA=0),CS_N低有效。
• 时钟由分频参数控制:parameter SPI_CLK_DIV = N;。
• 建议在开始写事务前确认总线空闲:CS_N=1, SCLK=0。
2. 片选与帧边界时序:
• 写事务开始时CS_N拉低,结束时CS_N拉高。
• 在CS_N有效窗口内保持SCLK连续,避免中途停钟造成从设备状态机错位。
• 建议满足tCSS与tCSH均不小于 0.5个SCLK周期。
3. 指令与地址发送时序:
• 主设备按W + A6..A0顺序在MOSI发送写命令与地址。
• 每bit在SCLK下降沿后更新,在SCLK上升沿由从设备采样。
• 命令+地址阶段共 8个SCLK周期。
4. 写数据发送时序:
• 地址后主设备继续发送写数据D7..D0。
• 多字节连续写时,后续字节按D15..D8、D23..D16递进发送。
• 每个字节占 8个SCLK周期。
5. MISO行为约束:
• 典型写事务中MISO可高阻或固定状态,不作为有效采样数据。
• 设计中建议屏蔽写事务下的MISO采样,避免误触发状态机。
6. 完整写事务周期估算:
1. CS_N建立:约1个SCLK周期。
2. 命令+地址:8个SCLK周期。
3. 数据写入:8个SCLK周期(每字节)。
4. CS_N结束保持:约1个SCLK周期。
7. 设计余量建议:
• MOSI数据建立/保持时间建议按规范值放大 1.2~1.5倍。
• 写多字节时建议增加字节计数断言与地址递增断言。
• 若器件要求写后内部编程时间,需在下一次访问前插入tWR等待。
---
<div style="height: 2em;"></div>
QSPI 读寄存器时序(1-1-4)
QSPI读寄存器时序说明(1-1-4):
1. 总线模式与阶段定义:
• 1-1-4表示:命令阶段1线、地址阶段1线、数据阶段4线。
• CS_N低有效,SCLK由主设备输出。
• 常见阶段:CMD -> ADDR -> DUMMY -> DATA[IO3:0]。
2. 命令与地址阶段(单线):
• 在IO0(MOSI)发送CMD和地址位(A23..A0)。
• 该阶段IO1/IO2/IO3保持高阻或输入状态。
• 主设备按Mode0规则驱动并采样时钟边沿。
3. Dummy阶段:
• 为覆盖存储器阵列访问延迟,需要插入Dummy周期。
• Dummy周期数建议参数化:parameter QSPI_DUMMY = K;。
• Dummy期间应保持CS_N不变、SCLK持续,避免事务中断。
4. 数据阶段(四线并行):
• 从设备在IO[3:0]并行输出数据,每个SCLK传输4bit。
• 以32bit读取为例,理论需要 8个SCLK周期。
• 主设备在采样边沿锁存IO[3:0]并按高低位规则重组字节。
5. 方向切换(Turnaround)要求:
• 从单线阶段切换到四线读阶段前,主设备必须及时释放数据线方向控制。
• 建议在RTL中明确oe切换点,并留至少 1个半周期缓冲。
6. 完整读事务周期估算:
1. CS_N建立:约1个SCLK周期。
2. 命令阶段:8个SCLK周期。
3. 地址阶段:24个SCLK周期。
4. Dummy阶段:QSPI_DUMMY个SCLK周期。
5. 数据阶段:每32bit约8个SCLK周期(按4bit/clk)。
6. CS_N结束保持:约1个SCLK周期。
7. 设计余量建议:
• 高速下优先校核IO线间偏斜(skew)与SCLK占空比。
• 对读取拼接逻辑增加位序断言(bit-order/byte-order)。
• 建议在门级或板级仿真中验证Dummy边界与首拍有效数据对齐。
QSPI 写寄存器时序(1-1-4)
QSPI写寄存器时序说明(1-1-4):
1. 总线模式与阶段定义:
• 写事务常见流程:CMD -> ADDR -> TURN -> DATA[IO3:0]。
• 命令/地址阶段由IO0串行输出,数据阶段由IO[3:0]并行发送。
• CS_N低有效,全事务保持有效。
2. 命令与地址发送阶段:
• 主设备先发送写命令CMD,后发送地址位A23..A0。
• 该阶段沿用单线Mode0时序,确保下降沿更新、上升沿采样。
3. TURN阶段(方向切换):
• 从单线转四线写之前插入TURN阶段。
• TURN用于切换IO复用器和输出使能,避免总线争用。
• 建议TURN长度参数化,典型 1~2个SCLK周期。
4. 四线并行写数据阶段:
• 主设备在IO[3:0]并行输出写数据。
• 每个SCLK传输4bit,字节/字重组需与器件协议一致。
• 连续写时保持CS_N有效并连续输出,避免地址窗口中断。
5. 事务结束时序:
• 数据最后一拍后拉高CS_N结束事务。
• 若目标器件存在内部编程周期,需等待tPP/tWR完成后再访问。
6. 完整写事务周期估算:
1. CS_N建立:约1个SCLK周期。
2. 命令阶段:8个SCLK周期。
3. 地址阶段:24个SCLK周期。
4. TURN阶段:TURN_CYCLES个SCLK周期。
5. 数据阶段:按4bit/clk计算。
6. CS_N结束保持:约1个SCLK周期。
7. 设计余量建议:
• 严格约束IO方向切换时序,防止主从同时驱动。
• 写路径建议增加字节计数与数据完整性断言。
• 板级调试时优先观察CS_N、SCLK与IO[3:0]首拍关系。
---
<div style="height: 2em;"></div>
UART 发送时序(TX)
UART发送时序说明(TX):
1. 波特率参数化:
• UART空闲线为高电平,发送帧格式通常为1起始位 + 8数据位 + 1停止位。
• 波特率分频参数化建议:parameter BAUD_DIV = SYS_CLK/BAUD;。
• baud_tick为发送状态机位时间基准。
2. 帧起始时序:
• 发送开始时,TXD由高拉低输出START位。
• START位持续 1个bit周期。
• 发送端应确保START边沿与baud_tick对齐。
3. 数据位发送时序:
• 数据位按LSB-first顺序发送:D0 -> D1 -> ... -> D7。
• 每位持续 1个bit周期。
• 位边界建议在baud_tick到达时更新。
4. 停止位时序:
• 数据位结束后发送STOP位(高电平)。
• 停止位持续 1个bit周期,完成后保持空闲高电平。
5. 单字节发送周期数:
1. START:1bit。
2. DATA:8bit。
3. STOP:1bit。
• 合计 10bit周期/字节(不含可选校验位)。
6. 设计余量建议:
• 波特率误差建议控制在双方总误差 < ±2%。
• 可在发送端增加空闲保护间隔,降低背靠背帧串扰风险。
• 仿真建议断言:位宽稳定、位序正确、帧长正确。
UART 接收时序(RX)
UART接收时序说明(RX):
1. 过采样与采样点参数化:
• 常用16倍过采样(baud_x16)实现抗抖动接收。
• 检测到RXD下降沿后,等待半位时间定位到位中心。
• 后续按每16个过采样tick采样1次数据位中心点。
2. 起始位检测时序:
• RXD由高到低触发START检测。
• 在半位中心再次确认仍为低,判定为有效起始位。
• 若半位复检失败,丢弃本次触发并回到空闲。
3. 数据位采样时序:
• 从D0开始按LSB-first采样至D7。
• 每位在中心采样点锁存,减少边沿抖动影响。
• 累计8位后形成接收字节。
4. 停止位校验时序:
• 数据位后采样STOP位,期望为高电平。
• STOP位异常可置帧错误标志(framing error)。
5. 单字节接收周期数:
1. START确认:1bit。
2. DATA采样:8bit。
3. STOP校验:1bit。
• 合计 10bit周期/字节。
6. 设计余量建议:
• 推荐加入数字去抖或多数投票提升噪声环境鲁棒性。
• 建议提供溢出、帧错、奇偶错等状态位。
• 仿真建议覆盖:波特率偏差、毛刺起始位、停止位错误。
---
<div style="height: 2em;"></div>
MDIO 写时序(Clause 22)
MDIO写时序说明(Clause 22):
1. 帧结构与参数化:
• Clause 22 写帧典型字段:PRE(32x1) + ST(01) + OP(01) + PHYAD(5) + REGAD(5) + TA(10) + WDATA(16)。
• 时钟MDC由主设备输出,MDIO在MDC上升沿采样。
• 建议参数化:PHY地址、寄存器地址、前导使能。
2. 前导与起始字段时序:
• PRE用于同步从设备,常见为32个连续1。
• ST=01标识Clause 22帧起始。
• OP=01表示写操作。
3. 地址字段时序:
• 依次发送PHYAD[4:0]和REGAD[4:0]。
• 每bit在MDC下降沿后更新,在MDC上升沿被采样。
4. 转向字段(TA)时序:
• 写事务TA为10,由主设备继续驱动MDIO。
• TA阶段应保持驱动稳定,避免位边界争用。
5. 数据字段时序:
• 主设备发送WDATA[15:0]。
• 每bit对应1个MDC周期,建议MSB-first与器件文档一致。
6. 完整写事务周期估算:
1. PRE:32个MDC周期(可按器件支持裁剪)。
2. ST+OP:4个MDC周期。
3. PHYAD+REGAD:10个MDC周期。
4. TA:2个MDC周期。
5. WDATA:16个MDC周期。
7. 设计余量建议:
• 保证MDC频率不超过PHY限制(常见2.5MHz)。
• 多PHY总线建议增加总线空闲检测与访问超时保护。
• 仿真建议断言字段长度、位序和TA值合法性。
MDIO 读时序(Clause 22)
MDIO读时序说明(Clause 22):
1. 帧结构与方向切换:
• 读帧字段:PRE + ST(01) + OP(10) + PHYAD + REGAD + TA(Z0) + RDATA[15:0]。
• 在TA阶段主设备需释放MDIO为高阻,再由从设备接管输出。
2. 前导、起始与操作码时序:
• PRE用于同步,ST=01标识Clause 22。
• OP=10表示读操作。
• 主设备在地址阶段持续驱动MDIO。
3. 地址阶段时序:
• 主设备发送PHYAD[4:0]与REGAD[4:0]。
• 采样规则与写事务一致:MDC上升沿采样。
4. 转向阶段(TA=Z0)时序:
• 第1个TA位主设备输出高阻Z。
• 第2个TA位从设备输出0作为应答。
• 若未检测到TA0,可判定设备未响应或总线异常。
5. 读数据阶段时序:
• 从设备输出RDATA[15:0],主设备逐位采样。
• 读取完成后主设备可拉高空闲并结束事务。
6. 完整读事务周期估算:
1. PRE:32个MDC周期。
2. ST+OP:4个MDC周期。
3. PHYAD+REGAD:10个MDC周期。
4. TA:2个MDC周期。
5. RDATA:16个MDC周期。
7. 设计余量建议:
• 必须严格控制MDIO输出使能切换时刻,避免主从冲突驱动。
• 增加TA检查、超时退出和读回校验机制。
• 仿真建议覆盖:无应答PHY、错误PHYAD、边界寄存器读。
---
<div style="height: 2em;"></div>
RGMII 发送时序(TX,DDR)
RGMII发送时序说明(TX,DDR):
1. 时钟与DDR接口定义:
• TXC为125MHz发送时钟,RGMII在时钟上升沿和下降沿各传输一次数据(DDR)。
• TXD[3:0]为4bit数据总线:上升沿发送低半字节(D[3:0]),下降沿发送高半字节(D[7:4])。
• TX_CTL在发送期间用于承载TX_EN与TX_EN^TX_ER语义。
2. 帧起始时序:
• 图示中TX_CTL由0拉高进入发送窗口,对应帧开始。
• 首字节D0在两个边沿完成发送:
• 上升沿发送D0[3:0]
• 下降沿发送D0[7:4]
• 发送状态机应确保TX_CTL与首字节半字节在同一DDR节拍对齐。
3. 字节发送映射时序:
• 图示TXD[3:0]按D0、D1、D2顺序传输,每字节占用1个TXC周期(2个边沿)。
• 映射关系固定:
• byte[n][3:0] -> TXC上升沿
• byte[n][7:4] -> TXC下降沿
• 因此RGMII以4bit物理线实现8bit等效吞吐。
4. TX_CTL语义时序:
• 在有效数据窗口内,TX_CTL上升沿语义等价于TX_EN。
• 在下降沿语义等价于TX_EN^TX_ER,可用于标识发送错误。
• 发送路径需保证TX_CTL与TXD同源同拍更新,避免对端解码歧义。
5. 帧结束与空闲时序:
• 最后一个字节高半字节发送完成后,TX_CTL回到空闲,表示帧结束。
• 空闲期间TXD可为无效值或保持稳定值,但不应被解释为有效帧数据。
• 与GMII一致,帧间应满足最小IFG要求。
6. 周期统计(按当前图示):
1. 起始进入有效窗口:1个边界周期。
2. 有效数据:3个字节(D0~D2),对应3个TXC周期。
3. 退出有效窗口:1个边界周期。
• 工程实现可推广为:N字节数据对应N个TXC周期。
7. 设计与验证建议:
• 增加断言:每个字节的低/高半字节必须在相邻上升/下降沿成对出现。
• 增加断言:TX_CTL有效窗口与TXD字节计数严格一致。
• 板级验证重点关注TXC相位偏移和DDR采样余量(setup/hold)。
RGMII 接收时序(RX,DDR)
RGMII接收时序说明(RX,DDR):
1. 时钟与DDR接口定义:
• RXC为125MHz接收时钟,接收端在RXC上升沿和下降沿各采样一次数据。
• RXD[3:0]为4bit总线:上升沿采样低半字节,下降沿采样高半字节。
• RX_CTL用于恢复RX_DV与RX_DV^RX_ER语义。
2. 帧起始时序:
• 图示RX_CTL由0拉高进入有效接收窗口,表示帧开始。
• 首字节Q0由两个边沿拼接得到:
• 上升沿采样Q0[3:0]
• 下降沿采样Q0[7:4]
• 接收状态机应在首个有效边沿锁存字节拼接起点。
3. 字节拼接映射时序:
• 图示数据按Q0、Q1、Q2顺序接收,每字节占1个RXC周期。
• 拼接关系固定:
• 上升沿样本 -> byte[n][3:0]
• 下降沿样本 -> byte[n][7:4]
• 只有低/高半字节成对到达,才形成完整有效字节。
4. RX_CTL语义时序:
• 上升沿语义等价于RX_DV,表示当前周期是否有效。
• 下降沿语义等价于RX_DV^RX_ER,用于恢复错误标志。
• 接收路径需同拍解析RX_CTL和RXD,避免误判帧边界。
5. 帧结束与空闲时序:
• 最后一个字节高半字节采样完成后,RX_CTL回到空闲,表示帧结束。
• 空闲期间RXD可变化,但不应写入接收数据通道。
• 建议在帧尾执行长度与FCS一致性检查。
6. 周期统计(按当前图示):
1. 进入有效窗口:1个边界周期。
2. 有效数据:3个字节(Q0~Q2),对应3个RXC周期。
3. 退出有效窗口:1个边界周期。
• 工程实现可推广为N字节对应N个RXC有效周期。
7. 设计与验证建议:
• 增加断言:每个字节必须由相邻上升/下降沿样本配对生成。
• 增加断言:RX_CTL有效窗口长度与拼接后的字节计数一致。
• 板级调试重点验证RXC相位与输入采样窗口裕量。
---
<div style="height: 2em;"></div>
GMII 发送时序(TX)
GMII发送时序说明(TX):
1. 时钟与接口定义:
• GTX_CLK为125MHz发送参考时钟,发送端在该时钟节拍下驱动TX_EN、TX_ER和TXD[7:0]。
• GMII发送为8bit并行总线,每个时钟周期发送1字节。
• 空闲状态通常为TX_EN=0,TXD不作为有效数据解释。
2. 帧起始时序:
• 按图示TX_EN波形01......0,起始时由0拉高进入发送窗口。
• TX_EN拉高后的首个有效周期开始发送首字节B0。
• 建议发送状态机在同拍锁存SOF与首字节,避免帧首错位。
3. 数据发送时序:
• 图示TXD[7:0]在有效窗口内依次输出B0到B6。
• 每个字节持续1个GTX_CLK周期,字节间无拆分与拼接。
• 若帧更长,后续字节按同样规则逐拍发送。
4. TX_ER错误指示时序:
• 图示TX_ER在发送窗口内可为0或1,用于标识对应周期是否存在发送错误。
• 当TX_ER=1时,表示对应周期的数据字节带有发送错误语义。
5. 帧结束与IFG时序:
• 最后一个有效字节发送完成后,TX_EN拉低结束帧发送。
• 帧间应插入IFG(Inter-Frame Gap)空闲周期,期间保持TX_EN=0。
• IFG长度应满足以太网最小要求(常用最小值12字节时间),避免背靠背帧边界冲突。
6. 周期统计(按当前图示):
1. 进入有效窗口:1个边界周期。
2. 有效数据:7个字节(B0~B6)。
3. 退出有效窗口:1个边界周期。
• 工程实现中可泛化为N字节对应N个GTX_CLK有效周期。
7. 设计与验证建议:
• 增加断言:TX_EN=1时TXD在整个周期内保持稳定。
• 增加断言:TX_ER=1仅允许出现在TX_EN=1有效窗口内。
• 联合FCS/CRC校验帧尾边界,防止多发或少发字节。
GMII 接收时序(RX)
GMII接收时序说明(RX):
1. 时钟与接口定义:
• RX_CLK为125MHz接收参考时钟,接收端在该时钟节拍下采样RX_DV、RX_ER和RXD[7:0]。
• GMII为8bit并行接收接口,每个RX_CLK周期接收1字节。
• 空闲状态通常RX_DV=0,RXD不计入有效帧数据。
2. 帧起始时序:
• 图示中RX_DV由0拉高进入接收窗口,表示帧开始。
• RX_DV拉高后的首个有效周期采样首字节B0。
• 接收状态机建议在同拍置位SOF并启动字节计数。
3. 数据接收时序:
• 图示RXD[7:0]在有效窗口按顺序为B0、B1、B2、B3。
• 每个字节持续1个RX_CLK周期,逐拍采样并写入接收缓存。
• 多字节帧按相同规则线性扩展。
4. RX_ER错误指示时序:
• RX_ER用于标识当前接收周期是否存在链路/编码错误。
• 当RX_ER=1时,当前周期字节应标记为错误字节或触发丢包策略。
• 建议同步记录RX_ER与字节序号,便于问题定位。
5. 帧结束与空闲时序:
• 最后一个有效字节采样后,RX_DV拉低,接收窗口结束。
• 帧结束后进入空闲周期,等待下一次RX_DV上升沿。
• 可在帧尾执行长度/FCS校验与错误计数更新。
6. 周期统计(按当前图示):
1. 进入有效窗口:1个边界周期。
2. 有效数据:4个字节(B0~B3)。
3. 退出有效窗口:1个边界周期。
• 工程实现中可推广为N字节对应N个RX_CLK有效周期。
7. 设计与验证建议:
• 增加断言:RX_DV=1时RXD满足整周期稳定采样。
• 增加断言:RX_ER=1仅在RX_DV=1有效窗口内计入错误事件。
• 与MAC接收状态机联调,确保帧边界与字节计数一致。
---
<div style="height: 2em;"></div>
MII 发送时序(TX)
MII发送时序说明(TX):
1. 时钟与接口定义:
• TX_CLK为25MHz的MII发送时钟,发送端在其有效采样边沿更新发送数据。
• TXD[3:0]为4bit并行发送总线,每个时钟周期发送1个半字节(nibble)。
• TX_EN为发送有效指示,TX_EN=1期间TXD表示有效帧数据。
2. 帧起始时序:
• 图示中TX_EN由0拉高进入发送窗口,对应帧开始。
• 首字节D0拆分为两个nibble发送:
• 先发送D0[3:0]
• 再发送D0[7:4]
• 发送状态机应在TX_EN拉高时对齐首个低半字节。
3. 数据发送映射时序:
• 图示TXD[3:0]依次为D0[3:0]、D0[7:4]、D1[3:0]、D1[7:4]、D2[3:0]、D2[7:4]。
• 每两个时钟周期构成1个完整字节。
• 对于任意长度帧,按“低4位在前、高4位在后”规则线性扩展。
4. 帧结束与空闲时序:
• 最后一个高半字节发送完成后,TX_EN拉低表示发送结束。
• 空闲期间TXD可保持任意值,但不应被解释为有效数据。
• 帧间应满足最小IFG约束,避免背靠背帧边界冲突。
5. 周期统计(按当前图示):
1. 进入有效窗口:1个边界周期。
2. 有效数据:3个字节(D0~D2),共6个TX_CLK周期。
3. 退出有效窗口:1个边界周期。
• 工程实现中可推广为N字节对应2N个TX_CLK周期。
6. 设计与验证建议:
• 增加断言:TX_EN=1时半字节顺序必须满足低位在前、高位在后。
• 增加断言:TX_EN有效窗口长度应与字节计数一致(2拍/字节)。
• 建议结合CRC/FCS结果校验帧尾,避免少发或多发半字节。
MII 接收时序(RX)
MII接收时序说明(RX):
1. 时钟与接口定义:
• RX_CLK为25MHz的MII接收时钟,接收端在其有效采样边沿锁存输入数据。
• RXD[3:0]为4bit并行接收总线,每个时钟周期接收1个半字节。
• RX_DV为接收有效指示,RX_DV=1期间RXD参与帧数据拼接。
2. 帧起始时序:
• 图示中RX_DV由0拉高进入接收窗口,表示帧开始。
• 首字节D0由两个nibble拼接得到:
• 先采样D0[3:0]
• 再采样D0[7:4]
• 接收状态机应在RX_DV上升后从低半字节开始拼接。
3. 数据接收映射时序:
• 图示RXD[3:0]依次接收D0[3:0]、D0[7:4]、D1[3:0]、D1[7:4]、D2[3:0]、D2[7:4]。
• 每两个时钟周期拼接为1个完整字节并写入接收缓存。
• 任意长度帧按同样规则扩展,保持低半字节优先。
4. 帧结束与空闲时序:
• 最后一个高半字节采样后,RX_DV拉低表示本帧结束。
• 空闲阶段RXD变化不应被计入有效帧数据。
• 帧尾建议执行长度/FCS一致性检查与错误统计更新。
5. 周期统计(按当前图示):
1. 进入有效窗口:1个边界周期。
2. 有效数据:3个字节(D0~D2),共6个RX_CLK周期。
3. 退出有效窗口:1个边界周期。
• 工程实现中可推广为N字节对应2N个RX_CLK周期。
6. 设计与验证建议:
• 增加断言:RX_DV=1时,接收nibble必须成对拼接为完整字节。
• 增加断言:RX_DV有效长度与拼接后的字节计数一致。
• 建议覆盖异常场景:RX_DV提前拉低、半字节丢失、边界抖动。
---
<div style="height: 2em;"></div>
RMII 发送时序(TX)
RMII发送时序说明(TX):
1. 时钟与接口定义(50MHz):
• RMII发送使用REF_CLK统一参考时钟,固定为 50MHz。
• 时钟周期为T_REF = 20ns,发送端在每个REF_CLK周期输出2bit数据。
• TX_EN为发送有效指示,TX_EN=1期间TXD[1:0]为有效帧数据。
2. 帧起始时序:
• 图示中TX_EN由0拉高进入发送窗口,表示发送帧开始。
• 首字节D0按2bit分拍发送,从低位开始。
• 发送状态机应在TX_EN拉高时对齐D0[1:0]首拍。
3. 数据发送映射时序:
• 图示TXD[1:0]顺序为:D0[1:0]、D0[3:2]、D0[5:4]、D0[7:6]、D1[1:0]...。
• 每4个REF_CLK周期构成1个完整字节。
• 任意长度帧可按“2bit从低到高”规则线性扩展。
4. 帧结束与空闲时序:
• 最后一个2bit片段发送后,TX_EN拉低表示发送结束。
• 空闲期间TXD[1:0]可保持任意值,但不应计入有效数据。
• 帧间应满足最小IFG要求,避免背靠背发送冲突。
5. 周期统计(按当前图示):
1. 进入有效窗口:1个边界周期。
2. 有效数据:2个字节(D0~D1),共8个REF_CLK周期。
3. 退出有效窗口:1个边界周期。
• 工程实现可推广为N字节对应4N个REF_CLK周期(50MHz)。
6. 设计与验证建议:
• 增加断言:TX_EN=1时2bit分拍顺序必须满足低位到高位。
• 增加断言:TX_EN有效长度与字节计数一致(4拍/字节)。
• 建议联合MAC长度/FCS校验,防止2bit边界错位。
RMII 接收时序(RX)
RMII接收时序说明(RX):
1. 时钟与接口定义(50MHz):
• RMII接收同样使用REF_CLK,固定为 50MHz,周期20ns。
• 接收端每个REF_CLK周期采样RXD[1:0]的2bit数据。
• CRS_DV用于指示接收数据有效窗口。
2. 帧起始时序:
• 图示中CRS_DV由0拉高,表示检测到接收帧开始。
• 首字节D0从D0[1:0]开始按2bit分拍拼接。
• 接收状态机应在CRS_DV拉高后立即进入拼接状态。
3. 数据接收映射时序:
• 图示RXD[1:0]顺序为:D0[1:0]、D0[3:2]、D0[5:4]、D0[7:6]、D1[1:0]...。
• 每4拍拼接为1个完整字节并写入接收缓存。
• 任意长度帧按相同规则扩展,保持低位优先拼接。
4. 帧结束与空闲时序:
• 最后一个2bit片段采样后,CRS_DV拉低表示帧结束。
• 空闲期间RXD[1:0]变化不应计入有效数据。
• 帧尾建议执行长度/FCS一致性检查与错误计数更新。
5. 周期统计(按当前图示):
1. 进入有效窗口:1个边界周期。
2. 有效数据:2个字节(D0~D1),共8个REF_CLK周期。
3. 退出有效窗口:1个边界周期。
• 工程实现中可推广为N字节对应4N个REF_CLK周期(50MHz)。
6. 设计与验证建议:
• 增加断言:CRS_DV=1时接收2bit必须连续且可按4拍拼接成字节。
• 增加断言:CRS_DV有效窗口长度与拼接后的字节计数一致。
• 建议覆盖异常场景:CRS_DV提前拉低、2bit片段丢失、边界抖动。
---
使用建议
1. SPI/QSPI 请在项目里固定 Mode(CPOL/CPHA)后再出最终评审图。
2. I2C/MDIO 建议在仿真中增加 ACK/TA 断言。
3. RGMII 建议额外补充 TXC/RXC 相位偏移(板级延时)说明。
4. 若用于代码实现,请将每个模板映射到状态机步骤(IDLE/CMD/ADDR/DATA/STOP)。