常用LRIP接口时序
> 说明:以下为工程常用“自定义接口模板时序”,用于文档、评审和 RTL 设计对齐。
> 具体器件的 setup/hold、时钟频率、空闲电平请以芯片手册和 PHY 规范为准。
LCPU读寄存器时序(Master)
LCPU读寄存器时序说明:
• CLK为系统的CPU操作时钟,默认为50Mhz时钟,除非特别说明CLK的时钟频率。为INPUT信号。
• 主设备发送一个时钟周期的REQ=1的读请求操作信号。为INPUT信号。
• 在REQ请求的这个时钟周期,RH_WL为高电平,REQ请求操作的其他时候,RH_WL可为任意状态。为INPUT信号。
• ADDR为32位宽的地址总线,在REQ请求的这个时钟周期,Master发出的ADDR为有效的读操作地址。REQ请求操作的其他时候,ADDR可为任意状态。为INPUT信号。
• 在主设备发送一个时钟周期的REQ=1的请求操作信号后,从设备开始响应相应的读操作,当从设备操作完成后,会给主设备一个响应信号ACK。所以不同从设备,从主设备的REQ发起,到从设备的ACK响应,中间的延迟是不确定的,有的为几个周期,有时候会有数十个甚至数百个周期以上。为OUTPUT信号。
• RDATA为32位宽的读数据总线,在从设备ACK响应的这个时钟周期,RDATA是有效的,主设备应该在判断ACK=1的情况下,获取RDATA的值,即为读操作所读到的值。其他时候,RDATA可为任意状态。为OUTPUT信号。
• WDATA为32位宽的写数据总线,在读操作情况下,WDATA可为任意状态。为INPUT信号。
LCPU写寄存器时序(Master)
LCPU写寄存器时序说明:
• CLK为系统的CPU操作时钟,默认为50Mhz时钟,除非特别说明CLK的时钟频率。
• 主设备发送一个时钟周期的REQ=1的写请求操作信号。
• 在REQ请求的这个时钟周期,RH_WL为低电平,REQ请求操作的其他时候,RH_WL可为任意状态。
• ADDR为32位宽的地址总线,在REQ请求的这个时钟周期,Master发出的ADDR为有效的写操作地址。REQ请求操作的其他时候,ADDR可为任意状态。
• WDATA为32位宽的写数据总线,在REQ请求的这个时钟周期,Master发出的WDATA为有效的写数据。REQ请求操作的其他时候,WDATA可为任意状态。
• 在主设备发送一个时钟周期的REQ=1的请求操作信号后,从设备开始响应相应的写操作,当从设备操作完成后,会给主设备一个响应信号ACK。所以不同从设备,从主设备的REQ发起,到从设备的ACK响应,中间的延迟是不确定的,有的为几个周期,有时候会有数十个甚至数百个周期以上。
• RDATA为32位宽的读数据总线,在写操作情况下,RDATA可为任意状态。
包FIFO写时序
包FIFO写时序说明:
• wclk为写侧时钟,可为任意频率。wclk_en为写时钟使能,所有写操作需在wclk_en=1时有效。
• 写数据时,wen=1有效,同时waddr给出当前数据在包内的偏移地址(0起始,递增),wdata给出对应的数据。一个包的数据需在wpkt_push之前逐字写入。
• 当包内最后一个数据写入后,紧接着在下一个时钟周期发送一个时钟周期的wpkt_push=1信号(与wen=0同一周期),表示一个完整包写入结束。此时wpkt_len需给出该包的总数据长度(单位为word),wpkt_para为该包的附带参数信息(如通道号、类型等)。
• full为包FIFO满标志,高有效。当full=1时,表示FIFO内部剩余空间不足以容纳一个最大包(max_pkt_length),此时不应再写入新包。写数据及wpkt_push在full=1时会被忽略。
• wpkt_len和wpkt_para仅在wpkt_push=1时有效,其余时刻可为任意状态。
• waddr位宽由addr_width决定,wpkt_len位宽为addr_width+1。
包FIFO读时序
包FIFO读时序说明:
• rclk为读侧时钟,可为任意频率(支持与wclk不同的双时钟操作)。rclk_en为读时钟使能,所有读操作需在rclk_en=1时有效。
• empty为包FIFO空标志,高有效。当empty=0时,表示FIFO中至少有一个完整的包可供读取。
• 当empty=0时,发送一个时钟周期的rpkt_pop=1信号,表示从FIFO中弹出一个包。
• rpkt_pop发出后2个时钟周期,rpkt_len和rpkt_para输出有效值(参数FIFO读延迟1周期 + 输出寄存器锁存1周期)。rpkt_len为包的数据长度(word数),rpkt_para为该包的附带参数信息。
• 获得rpkt_len后,即可通过ren=1逐字读取包数据。raddr给出当前读取数据在包内的偏移地址(0至rpkt_len-1),rdata在raddr给出的下一个时钟周期返回对应数据(simple_dual_port_ram的1周期读延迟)。
• rpkt_len位宽为addr_width+1,rpkt_para位宽由para_width决定。
• 当dual_clock=1时,读写时钟可独立;当dual_clock=0时,读写需使用同一时钟。
包FIFO相关参数说明
| 参数 | 说明 | 典型值 |
|------|------|--------|
| dual_clock | 双时钟支持:1=读写独立时钟,0=单时钟 | 1 |
| addr_width | 每个数据块的地址位宽(2^addr_width words/block) | 8 |
| block_addr_width | 数据块数量位宽(2^block_addr_width blocks) | 4 |
| data_width | 数据位宽(bits) | 32 |
| para_width | 附带参数位宽(bits) | 16 |
| max_pkt_length | 最大包长(words),用于none block模式满判断 | 1518 |
| block_mode | 存储模式:"true"=分块模式,"false"=连续缓冲模式 | "true" |
CRC校验模块时序
CRC校验模块时序说明:
• clk为系统操作时钟,clk_en=1时模块工作。
• data_in_en=1表示当前时钟周期输入的数据data_in有效。CRC计算从data_in_en的第一个有效时钟开始,初始值由crc_type决定(CRC32初始值为0xFFFFFFFF,其余为全0)。
• data_in为输入数据,位宽由data_in_width参数决定(支持1/8/16/32bit)。对于多字节位宽,输入数据需按字节做bit-reverse(CRC32/CRC16-CCITT/CRC16-IBM)或不翻转(CRC8系列)。
• data_byte_en为字节有效标志,位宽=data_in_width/8,指示data_in中哪些字节参与本次CRC计算。当data_in_en=1的第一个周期,data_byte_en决定哪些字节用crc_init初始化;当data_in_en=1的后续周期,data_byte_en决定哪些字节参与迭代计算。对于8bit位宽且全部字节有效的场景,data_byte_en可以恒为1。
• 当data_in_en由1变为0后的下一个时钟周期,crc_done=1(持续一个时钟周期),同时crc_out输出最终的CRC校验值。应在crc_done=1时锁存crc_out。
• crc_out位宽由crc_type决定:CRC32→32bit, CRC16→16bit, CRC8→8bit, CRC7→7bit。输出结果已经过bit-reverse和最终XOR处理(与标准协议一致)。
CRC校验模块常用参数配置
| 参数 | 说明 | 常用值 |
|------|------|--------|
| data_in_width | 输入数据位宽(1/8/16/32) | 8 |
| crc_type | CRC类型 | 0=CRC32, 1=CRC16-CCITT, 2=CRC16-IBM, 3=CRC8, 4=CRC8-ITU, 7=CRC7 |
dual_clock_fifo读写时序
dual_clock_fifo读写时序说明:
• wclk为写侧时钟,rclk为读侧时钟,两者可为任意频率的独立时钟。
• 写操作:write_en=1时,write_data被写入FIFO。full=1时FIFO已满,write_en无效(内部自动屏蔽)。
• 读操作:当empty=0时,FIFO中有数据可读。read_en=1时弹出当前数据,read_data在下一个rclk时钟周期更新为下一笔数据。empty=1时FIFO为空,read_en无效。
• full标志在wclk域有效(输出),由rclk域的读指针通过2级格雷码同步器跨时钟域后判断产生,因此full的解除(变为0)有约2~3个wclk周期的延迟。
• empty标志在rclk域有效(输出),由wclk域的写指针通过2级格雷码同步器跨时钟域后判断产生,因此empty的解除(变为0)有约2~3个rclk周期的延迟。
dual_clock_fifo参数说明
| 参数 | 说明 | 典型值 |
|------|------|--------|
| addr_width | FIFO深度地址位宽(深度=2^addr_width) | 4 |
| data_width | 数据位宽(bits) | 8 |
| ram_type | RAM实现类型:"M9K"=Block RAM,"registers"=分布式RAM | "registers" |
gmii2mac接口时序
GMII RX(TX Same with Rx)
GMII RX说明:
• Eth_RXC为GMII接收参考时钟(125MHz/25MHz/2.5MHz,由PHY提供)。为INPUT信号。
• Eth_RXDV为接收数据有效标志,高有效。Eth_RXDV=1期间Eth_RXD[7:0]上的数据有效。为INPUT信号。
• Eth_RXD[7:0]为接收的8bit GMII数据总线。在Eth_RXDV=1期间,Data上为有效的报文数据。为INPUT信号。
• Eth_RXER为接收错误标志。当Eth_RXDV=1且Eth_RXER=1时,表示当前接收数据有错误。为INPUT信号。
• RX通路内部经过一个深度为8的dual_clock_fifo实现Eth_RXC→clk域的跨时钟域切换,再经eth_presemble进行前导码剥离和帧对齐,最后由mac_top完成MAC层解析。
MAC侧包流接口时序
MAC侧采用sop/eop包流接口,时钟为clk(系统时钟),clk_en=1有效。
MAC包流接口说明:
• mac_rx_sop(RX Start Of Packet,OUTPUT):RX方向包开始标志,高有效,持续一个时钟周期。mac_rx_sop=1的同一周期mac_rx_en=1且mac_rx_data有效(第一个数据字节)。
• mac_rx_en(OUTPUT):RX方向数据有效标志,高有效。mac_rx_en=1期间mac_rx_data上的数据有效。
• mac_rx_data[7:0](OUTPUT):RX方向包数据总线,在mac_rx_en=1时有效。
• mac_rx_eop(RX End Of Packet,OUTPUT):RX方向包结束标志,高有效,持续一个时钟周期。mac_rx_eop=1的同一周期mac_rx_data为包的最后一个有效数据字节。
• mac_rx_err(RX Error,OUTPUT):高有效时表示当前包接收异常(如CRC校验失败),在mac_rx_eop时有效。
• TX方向(mac_tx_sop、mac_tx_en、mac_tx_data、mac_tx_eop、mac_tx_err)为INPUT信号,时序与RX方向完全对称,sop/eop均为一个时钟周期脉冲,mac_tx_err=1时强制产生错误的FCS。不再单独画时序图。
pulse_clock_region_pass跨时钟域脉冲传递时序
pulse_clock_region_pass时序说明:
• clk_a为源时钟域的时钟,pulse_a为源时钟域的单周期脉冲信号(高有效,持续1个clk_a周期)。
• clk_b为目标时钟域的时钟,pulse_b为目标时钟域输出的单周期脉冲信号(高有效,持续1个clk_b周期)。
• 工作原理:在clk_a域,pulse_a=1时翻转内部电平信号pulse_as。pulse_as的电平转换经过clk_b域的2级同步器(消除亚稳态),再通过边沿检测(pulse_b = pulse_bss ^ pulse_bsss)产生1个clk_b周期的脉冲pulse_b。
• 从pulse_a到pulse_b的延迟约为3~4个clk_b周期(2级同步器 + 1级延迟 + 边沿检测),加上两个时钟域的相位不确定性。
• 约束条件:相邻两次pulse_a脉冲之间的间隔必须大于clk_b域的同步+检测时间(至少4~5个clk_b周期),否则pulse_b可能丢失。
• 典型应用场景:将读时钟域的单周期pop/ack信号传递到写时钟域,用于package_fifo的dual_clock模式中的包管理。