基于FPGA设计PCIE接口设计(数据有效位判定)
PCIE和CPU之间通信,当FPGA发送一个存储器读请求(MRd)后,将收到CPU返回的带数据读完成报文(Cpld)。根据带宽的不同,接口数据位宽可以选择为64bit、128bit、256bit。在PCIE协议中,数据传输最小单位是双字(DW),所以FPGA收到Cpld报文后需要判断数据的哪个双字有效。Cpld报文的TLP头部长度为3DW。
1. 接口数据位宽为64bit
根据s_axi_rx_tkeep信号来判断哪个双字有效。
(1)判断最后64bit数据有效双字:
当s_axi_rx_tlast信号和s_axi_rx_tvalid信号同时拉高时,表示为最后一拍数据,根据s_axi_rx_tkeep[7:0](0xFF或0x0F)信号来判断哪个双字有效;其它情况下,s_axi_rx_tkeep[7:0]=0xFF,根据s_axi_rx_tvalid信号来判断64bit数据是否有效。
s_axi_rx_tdata[63:0] | D1D0 | --D0 |
s_axi_rx_tlast | 1 | 1 |
s_axi_rx_tkeep[7:0] | 0xFF | 0x0F |
(2)判断起始64bit数据有效双字:
Cpld报文的TLP头部长度为3DW(64bit+32bit,H1H0+D0H2),起始有效双字为D0--。
2. 接口数据位宽为128bit
根据m_axi_rx_tuser信号来判断哪个双字有效。
(1)判断最后128bit数据有效双字:m_axi_rx_tuser[21:17](rx_is_eof[4:0])
5'b1_0011 —— EOF located at byte3(DWORD 0),-- -- -- D0
5'b1_0111 —— EOF located at byte3(DWORD 1),-- -- D1 D0
5'b1_1011 —— EOF located at byte3(DWORD 2),-- D2 D1 D0
5'b1_1111 —— EOF located at byte3(DWORD 3),D3 D2 D1 D0
5'b0_xxxx —— EOF not present
(2)判断起始128bit数据有效双字:m_axi_rx_tuser[14:0](rx_is_sof[4:0])
5'b1_0000 —— SOF located at byte0(DWORD 0)
5'b1_1000 —— SOF located at byte8(DWORD 2)
5'b0_xxxx —— SOF not present
Cpld报文的TLP头部长度为3DW(128bit-32bit):
rx_is_sof[4:0]=5'b1_0000:D0H2H1H0
rx_is_sof[4:0]=5'b1_1000:H1H0--,D2D1D0H3,如果数据长度小于3DW,则还需要结合rx_is_eof[4:0]一起来判断有效双字。