PCIe FPGA DDR3 PCIe

Preview:

Citation preview

上位机通过PCIe把数据发送给FPGA,FPGA打包后通过光纤模块发送出去,同时FPGA保存光纤过来的数据到DDR3中,当DDR3中的数据存够一定数量,

把DDR3中的数据通过PCIe发送给上位机

光纤项目

FPGAPC

GT4

GT3

GT2

GT1

DDR3

GT1

GT2

GT3

GT4

PCIe

DDR3

PCIe_IP

DDR3_IP

GTX_IP

大小端转换

大小端转换

解析PCIE

光纤驱动

光纤驱动

光纤驱动

光纤驱动

选择六组

FIFO中的一组数据到

PCIe

DDR3IP时序

选择数据

到DDR3DDR3

读写地址和

突发长度

管理

光纤项目功能框图

FPGA

F8F8

55AA

PCIE时钟

光纤接收时钟

DDR时钟

光纤发送时钟

模块名:mem_burst_xilinx

例化名:u_mem_burst

作用 :按照DDR3_IP的驱动时序

把数据发送给DDR3的IP

app_addr[28:0]

app_cmd[2:0]

app_en

app_rdy

app_rd_data[511:0]

app_rd_data_end

app_rd_data_valib

app_wdf_data[511:0]

app_wdf_end

app_wdf_mask[63:0]

app_wdf_rdy

app_wdf_wren

控制

rd_burst_req

rd_burst_len[9:0]

rd_burst_addr[28:0]

rd_burst_valid

rd_burst_data[511:0]

rd_burst_finish

wr_burst_req

wr_burst_len[9:0]

wr_burst_addr[28:0]

wr_burst_data_req

wr_burst_data[511:0]

wr_burst_finish

burst_finish

框图

下一页

genvar ww;generate for (ww=0 ; ww<16; ww=ww+1 ) begin assign pcie_mty_rx[ww*8 +7 - :8] = pcie_mty_rx_fifo[127-ww*8 - : 8]; endEndgenerate

上述公式等价于:assign pcie_mty_rx[0*8 +7 - :8] = pcie_mty_rx_fifo[127-0*8 - : 8];assign pcie_mty_rx[1*8 +7 - :8] = pcie_mty_rx_fifo[127-1*8 - : 8];assign pcie_mty_rx[2*8 +7 - :8] = pcie_mty_rx_fifo[127-2*8 - : 8];assign pcie_mty_rx[3*8 +7 - :8] = pcie_mty_rx_fifo[127-3*8 - : 8]; . . . assign pcie_mty_rx[14*8 +7 - :8] = pcie_mty_rx_fifo[127-14*8 - : 8];assign pcie_mty_rx[15*8 +7 - :8] = pcie_mty_rx_fifo[127-15*8 - : 8];

// 解释 : [7 - : 8]

// 等价于: [a - : b ] == [a : a - b ] == [7 :0 ] / / 因为是从0 开始数的 ,7 6 5 4 3 2 1 0

上述公式等价于:assign pcie_mty_rx[ 7 : 0] = pcie_mty_rx_fifo [127 : 120];assign pcie_mty_rx[15 : 8] = pcie_mty_rx_fifo [119 : 112];assign pcie_mty_rx[23 :16] = pcie_mty_rx_fifo [111 : 104];assign pcie_mty_rx[31 :24] = pcie_mty_rx_fifo [103 : 96]; . . .

备注1:大小端转换//**********************

// 判断输入数据中,第几位被值1 (低位优先级高 )//**********************/

//举例:输入数据例子:if(din==5'b00001)if(din==5'b00010)if(din==5'b00100)if(din==5'b01000)if(din==5'b10000)

//计算:先计算哪一位有效:sel[0 ]=din[0 ];sel[1 ]=sel[0 :0]==0 && din[1 ];sel[2 ]=sel[1 :0]==0 && din[2 ];sel[3 ]=sel[2 :0]==0 && din[3 ];sel[4 ]=sel[3 :0]==0 && din[4 ];sel[5 ]=sel[4 :0]==0 && din[5 ];

//计算并输出:判断并输出dout_bin[0] = sel[1 ] | sel[3 ] | sel[5 ] ; dout_bin[1] = sel[2 ] | sel[3 ] ; dout_bin[2] = sel[4 ] | sel[5 ] ;

//参考:十进制表达法和二进制表达法 5'd1 == 3'b001 5'd2 == 3'b010 5'd3 == 3'b011 5'd4 == 3'b100 5'd5 == 3'b101

备注2:hot2bin

genvar ii;generate for (ii=0 ; ii<5; ii=ii+1 ) begin assign flag_id[ii] = flag_ctrl && din[110:96] ==i i; endEndgenerate

flag_id[0] = din[110:96] ==0;flag_id[1] = din[110:96] ==1;flag_id[2] = din[110:96] ==2;flag_id[3] = din[110:96] ==3;flag_id[4] = din[110:96] ==4;

备注3:判断读取哪个ID

dout[127:0]pcie_exp_rxp[7:0]

din[127:0]

wr_en

rd_en

empty

pcie_exp_txn[7:0]

pcie_exp_rxn[7:0]

pcie_exp_txp[7:0]

PCIe_IP核

框图

框图

下一页

所以:32'hf835d10c这个数据从FPGA中发送到大端

CPU是不需要转换的,发小端CPU则需要转换

din

112

127

==F8F8 表示数据头

111 ==0写 reg_wr ==1 ==1读 reg_rd ==1

110

96

表示ID

dout

dout_vld[4:0]

din[127:0] dout[127:0]

模块名 :cfg_pack_analy_rx

模块例化名字:u_cfg_rxb

作用 :解析PCI包头16'hF8F8

flag_id[4:0]

dout[127:0]

dout_vld[4:0]

dout_sop

dout_eop

dout_mty[3:0]

din_vld

组合电路

作用:判断ID值

&&

din__sop==1

din__eop==1

din__mty[3:0]==0

din[127:0]

框图

din[127:80]

reg_rd ? rdata : din[79:48]

din[47:0]

80

flag_get_addr

flag_get_data

genvar ii;generate for (ii=0 ; ii<5; ii=ii+1 ) begin assign flag_id[ii] = flag_ctrl && din[110:96] ==i i; endEndgenerate

等价于:flag_id[0] = din[110:96] ==0;flag_id[1] = din[110:96] ==1;flag_id[2] = din[110:96] ==2;flag_id[3] = din[110:96] ==3;flag_id[4] = din[110:96] ==4;

判断读取哪个ID

上一页

模块名:gtxPackAndCodeMode2

例化名:u_code

作用 :把PCIE发送过来的数据,打包发送给光纤IP。

把光纤IP发过来包文,拆包并发送出去

模块名 :mdyPackCommMode2

模块例化名:uMdyPackCommPack

作用 :缓存PCIE发过来的数据

并把FIFO中的数据做128bit转16bit

以包头+数据的形式发送出去(两个计数器)

包头就是管理FIFO

数据就是数据FIFO

管理FIFO格式:

16'h55d5+16'h数据长度+16'h校验+16'h0

模块名:afifo_134_1024

例化名:u_dfifo

作用 :数据FIFO

打拍

计算

校验和

模块名:afifo_32_64

例化名:u_mfifo

作用 :管理FIFO dout_vlddout_sopdout_eop

dout_mty

dout[15:0]

模块名:gtx_code_w16

例化名:u_gtx_coder

作用 :空闲做同步

有数据就发数据

模块名:mdy_bit_reversed

例化名:u_tx_data_reverse

作用 :大小端转换

dout[15:0]

char[1:0]

If(din_vld)begin dout<=din; char <=2'b00;endelse begin dout<=16'h50bc; char <=2'b01;end

模块名:mdy_bit_reversed

例化名:u_tx_ctrl_reverse

作用 :大小端转换

dout[15:0]

char[1:0]

data[15:0]

char[1:0]

模块名:mdy_bit_reversed

例化名:u_rx_data_reverse

作用 :大小端转换

模块名:mdy_bit_reversed

例化名:u_rx_ctrl_reverse

作用 :大小端转换

If(|ctrl_in==1)begin ctrl=ctrl_in;end

If(ctrl==1)begin flag_sel=0;endelse begin flag_sel=1;

end

模块名 :word_align_w16

例化名: u_rx_align

作用 :根据K码纠正数据

data[15:0]

ctrl[1:0]

If(ctrl==0)begin dout=din; dout_vld=1;endelse begin dout_vld=0;end

data[15:0]

ctrl[1:0]

模块名:gtx_decoder

例化名:u_gtx_decoder

作用 :把数据加dout_vld

dout[15:0]

dout_vld

模块名:mdyUnpackCommMode2

例化名:u_UnpackComm

作用 :去包头,校验对比

只输出数据段

dout_vld

dout[15:0]

dout_sop

dout_eop

dout_mty[1:0]

dout_err

模块名 :pack_s2p

例化名:pack_s2p

作用 :din[15:0]转成din[63:0]

dout_vld

dout_sop

dout_eop

dout_mty[3:0]

dout[127:0]

dout_vld

dout[63:0]

dout_sop

dout_eop

dout_mty[3:0]

框图

for( ii =0; ii<2; ii++ ) for( jj=0; jj<8; jj++) dout_tmp [ ii*8 + jj ] = din[ (2-ii-1)*8+ jj ];

ii=0; ii=1; dout_tmp [0] = din[ 8+0 ]; dout_tmp [8] = din[ 0 ]; dout_tmp [1] = din[ 8+1 ]; dout_tmp [9] = din[ 1 ]; dout_tmp [2] = din[ 8+2 ]; dout_tmp [10] = din[ 2 ]; dout_tmp [3] = din[ 8+3 ]; dout_tmp [11] = din[ 3 ]; dout_tmp [4] = din[ 8+4 ]; dout_tmp [12] = din[ 4 ]; dout_tmp [5] = din[ 8+5 ]; dout_tmp [13] = din[ 5 ]; dout_tmp [6] = din[ 8+6 ]; dout_tmp [14] = din[ 6 ]; dout_tmp [7] = din[ 8+7 ]; dout_tmp [15] = din[ 7 ];

上一页

genvar ww;generate for (ww=0 ; ww<16; ww=ww+1 ) begin assign pcie_mty_rx[ww*8 +7 - :8] = pcie_mty_rx_fifo[127-ww*8 - : 8]; endEndgenerate

上述公式等价于:assign pcie_mty_rx[0*8 +7 - :8] = pcie_mty_rx_fifo[127-0*8 - : 8];assign pcie_mty_rx[1*8 +7 - :8] = pcie_mty_rx_fifo[127-1*8 - : 8];assign pcie_mty_rx[2*8 +7 - :8] = pcie_mty_rx_fifo[127-2*8 - : 8];assign pcie_mty_rx[3*8 +7 - :8] = pcie_mty_rx_fifo[127-3*8 - : 8]; .assign pcie_mty_rx[14*8 +7 - :8] = pcie_mty_rx_fifo[127-14*8 - : 8];assign pcie_mty_rx[15*8 +7 - :8] = pcie_mty_rx_fifo[127-15*8 - : 8];

// 解释 : [7 - : 8]

// 等价于: [a - : b ] == [a : a - b ] == [7 :0 ] // 因为是从0 开始数的 ,7 6 5 4 3 2 1 0

上述公式等价于:assign pcie_mty_rx[ 7 : 0] = pcie_mty_rx_fifo [127 : 120];assign pcie_mty_rx[15 : 8] = pcie_mty_rx_fifo [119 : 112];assign pcie_mty_rx[23 :16] = pcie_mty_rx_fifo [111 : 104];assign pcie_mty_rx[31 :24] = pcie_mty_rx_fifo [103 : 96];

大小端转换

上一页

模块名 :mdy_pack_pick_by_head_guangqian

模块例化名:u_rx_cpack_analy

作用 :判断数据头是不是16'hF8F8

光纤转存DDR3

dout_vld

dout[63:0]

dout_sop

dout_eop

dout_mty[3:0]

dout_vld

dout[63:0]

dout_sop

dout_eop

dout_mty[3:0]

If( flag_add ==0 && din_sop && din_vld && din[63:48] == 16'hf8f8 ) flag_add<=1;else if( flag_add==1 && din_eop && din_vld ) flag_add<=0;

dout <=din; dout_sop <=din_sop; dout_eop <=din_eop; dout_vld <= dout_vld && flag_add;

框图

模块名:afifo_134_64

例化名:u_gxt_fifo

作用 :光纤3数据FIFO

empty[4:0]Empty_4_nor[4:0]

ddr_fifo_th

模块名:u_tx_sp

作用:6个FIFO选择一个输出到PCEI的TX

同时对不满128位的数据包做64

位转128位

模块名 :pack_s2p

模块例化名:pack_s2p

作用 :64位din转128位

模块名:afifo_134_64

例化名:u_gxt_fifo

作用 :光纤3数据FIFO

模块名 :pack_s2p

模块例化名:pack_s2p

作用 :64位din转128位

模块名:afifo_134_64

例化名:u_gxt_fifo

作用 :光纤3数据FIFO

模块名 :pack_s2p

模块例化名:pack_s2p

作用 :64位din转128位

模块名:afifo_134_64

例化名:u_gxt_fifo

作用 :光纤3数据FIFO

模块名 :pack_s2p

模块例化名:pack_s2p

作用 :64位din转128位

模块名: mdy_flag_sel

例化名:u_gxt_fifo

作用 :判断输入数据中,

第几位被值1

操做:对empty取反

作用:FIFO有数据后边对应位

就输出一个1

FIFO空 empty==1

FIFO有数据 empty==0

模块名:afifo_520_512

例化名:u_ddr_fifo

作用 :DDR3数据FIFO

ddr_rdusedw>=256

模块名:afifo_134_64

例化名:u_pci_fifo

作用 :PCIE数据FIFO

dout[127:0]

dout_vld

gtx_din_vld

gtx_din[63:0]

gtx_din_sop

gtx_din_eop

gtx_din_mty[3:0]

pcie_din_vld[4:0]

pcie_din[127:0]

pcie_din_sop

pcie_din_eop

pcie_din_mty[3:0]

ddr3_din_vld

ddr3_din[511:0]

ddr3_din_sop

ddr3_din_eop

框图

//**********************

// 判断输入数据中,第几位被值1 //**********************/

//举例:输入数据例子:1.if(din==5'b00001)2.if(din==5'b00010)3.if(din==5'b00100)4.if(din==5'b01000)5.if(din==5'b10000)

//计算:先计算哪一位有效:sel[0 ]=din[0 ];sel[1 ]=sel[0 :0]==0 && din[1 ];sel[2 ]=sel[1 :0]==0 && din[2 ];sel[3 ]=sel[2 :0]==0 && din[3 ];sel[4 ]=sel[3 :0]==0 && din[4 ];sel[5 ]=sel[4 :0]==0 && din[5 ];

//计算并输出:判断并输出dout_bin[0] = sel[1 ] | sel[3 ] | sel[5 ] ; dout_bin[1] = sel[2 ] | sel[3 ] ; dout_bin[2] = sel[4 ] | sel[5 ] ;

//参考:十进制表达法和二进制表达法 5'd1 == 3'b001 5'd2 == 3'b010 5'd3 == 3'b011 5'd4 == 3'b100 5'd5 == 3'b101

上一页

模块名 :pack_s2p

模块例化名:u_pack_s2p

作用 :64位din转512位

模块名 :gtx2ddrSp

模块例化名:rx_sp

作用 :四路光纤选择哪一路写入到DDR中

数据FIFO_520_512

管理FIFO_1_64

mfifo_empty[3:0]

dout_vld

dout[511:0]

dout_sop

dout_eop

dout_mty[6:0]

dout_rdy

dout_cha[1:0] flag_sel

模块名 :pack_s2p

模块例化名:u_pack_s2p

作用 :64位din转512位

数据FIFO_520_512

管理FIFO_1_64

模块名 :pack_s2p

模块例化名:u_pack_s2p

作用 :64位din转512位

数据FIFO_520_512

管理FIFO_1_64

模块名 :pack_s2p

模块例化名:u_pack_s2p

作用 :64位din转512位

数据FIFO_520_512

管理FIFO_1_64

gtx_din_vld

gtx_din[63:0]

gtx_din_sop

gtx_din_eop

gtx_din_mty[3:0]

框图

模块名:afifo_512_1024

例化名:u_fifo_x

作用 :缓存光纤数据的FIFO

din[511:0]

din_vld

data

wrreq

rdreq

qwfifo_q

wfifo_empty

IDLE

ADDR

REQQ

DATA rfifo_empty

模块名:fifo_29_4096

例化名:u_rfifo

作用 :

empty

empty

wr_burst_addrdin

wr_en

wfifo_rdreq

rfifo_rdcnt

rfifo_rdcnt

rdusedw

rdusedw

wfifo_qq

rd_enrfifo_rdreq

dout_eop

dout_err

dout_vld

dou[511:0]

dout_sop

模块名:ddr_mem_intf_guangxian

例化名:u_ddr_men_intf

作用 :把光纤过来的数据,缓存到FIFO中,

达到一定数量(DDR3_IP核的突发长度)。就把数据写入到DDR3中。

写达到设定数量后,开始读取DDR3中的数据。

给 PCIE发送过去

wr_en

rd_burst_req

rd_burst_len[9:0]

rd_burst_addr[28:0]

rd_burst_valid

rd_burst_data[511:0]

rd_burst_finish

wr_burst_req

wr_burst_len[9:0]

wr_burst_addr[28:0]

wr_burst_data_req

wr_burst_data[511:0]

wr_burst_finish

burst_finish

wfifo_q

wfifo_q

wr_burst_len

rd_burst_len

wr_burst

rd_burst

wr_burst_addr

burst_finish

rd_burst_valid

wr_burst_data_req

框图

命令总线

读总线

上一页

下一页

命令总线首页

写总线(表格黄色部分),其时序图如下所示。共有 3 种传输模式。

模式 1 指的是命令和数据同时发送到 IP 核,模式 2 指的是数据提前于命令发送到 IP 核,

模式 3 指的是数据落后于命令发送到 IP 核。模式 1 和 2 均可稳定传输,

而模式 3 必须满足一个条件,即数据落后命令的时间不能超过两个时钟周期。

一般来说,模式 2 比较常用,时序设计相对容易

读总线读总线(表格黄色部分),也分为两种速率,4:1 和 2:1。

写总线

关于 app_wdf_end 信号,该信号表示:当前突发写的最后一个数据。我们此次 DDR3 IP 核的突发长度为 8 ,1 个的长度是 16bit。

本次 DDR3 IP 核调取时,我们选取的 物理层 - 用户端 的速率为 4:1,每次发送的有效数据为 128 bit,app_wdf_data 本就是128 bit的,

因此 1 次突发写就完成了数据的写入,app_wdf_end 和 app_wdf_en 时序上同步了。

而如果选取的 物理层 - 用户端 的速率为 2:1,那每次发送的有效数据为 64 bit,

app_wdf_data 本是128 bit的,因此需要 2 次突发才能完成数据的写入,app_wdf_end 就看得更清楚了

112

127

==F8F8 表示数据头

111==0写PCIE_reg ==1读PCIE_reg

110

96

表示ID

dout

dout_vld[4:0]

din[127:0] dout[127:0]

模块名:cfg_pack_analy_rx

例化名:u_cfg_rxb

作用 :解析PCI包头16 h8f8f

flag_id[4:0]

pcie_mty_rx[127:0]pcie_mty_rx_fifo[127:0]

模块名 :xdma_adc_wrapper

模块例化名字:xdma_adc_wrapper1

作用 :PCIE的IP核

pcie_exp_rxp[7:0]

组合电路

作用:大小端转换(详见:备注1)

cfg_rx_dout[127:0]

cfg_rx_dout_vld[4:0]

cfg_rx_dout_sop

cfg_rx_dout_eop

cfg_rx_dout_mty[3:0]

BLK[3]

BLK[1]

BLK[0

模块名 :gtxPackAndCodeMode2

模块例化名:u_code

作用 :把PCIE发送过来的数据,打包发送给光纤IP。

把光纤IP发过来包文,拆包并发送出去

BLK[3]

模块名 :mdyPackCommMode2

模块例化名:uMdyPackCommPack

作用 :缓存PCIE发过来的数据

并把FIFO中的数据做128bit转16bit

以包头+数据的形式发送出去(两个计数器)

包头就是管理FIFO

数据就是数据FIFO

管理FIFO格式:

16'h55d5+16'h数据长度+16'h校验+16'h0

模块名:gtx_exdes

例化名:gtx_m0

作用 :四路GTX光纤的IP核

模块名 :afifo_134_1024

模块例化名:u_dfifo

作用 :数据FIFO

打三拍

计算

校验和

dout_vld

dout_sopdout_eop

dout_mty[3:0]

模块名 :afifo_32_64

模块例化名字:u_mfifo

作用 :管理FIFO

dout_vlddout_sopdout_eop

dout_mty

dout[15:0]

dout_vld

dout_sop

dout_eop

dout_mty[3:0]

dout[127:0]模块名 :gtx_code_w16

模块例化名:u_gtx_coder

作用 :空闲做同步

有数据就发数据

模块名 :mdy_bit_reversed

模块例化名:u_tx_data_reverse

作用 :大小端转换

coder_gtx_dout[15:0]

coder_gtx_char[1:0]

If(din_vld)begin dout<=din; char <=2'b00;endelse begin dout<=16'h50bc; char <=2'b01;end 模块名 :mdy_bit_reversed

模块例化名:u_tx_ctrl_reverse

作用 :大小端转换

gtx_dout[15:0]

gtx_char[1:0]

gtx0_txp

gtx0_txn

dout_vld[4]==1

gtx0_rxp

gtx0_rxn

gtx_rx_data[15:0]

gtx_rx_char[1:0]

模块名 :mdy_bit_reversed

模块例化名:u_rx_data_reverse

作用 :大小端转换

模块名 :mdy_bit_reversed

模块例化名:u_rx_ctrl_reverse

作用 :大小端转换模块名 :word_align_w16

例化名: u_rx_align

作用 :根据K码纠正数据

br_rx_data[15:0]

br_rx_ctrl[15:0]

align_rx_data[15:0]

align_rx_ctrl[1:0]模块名:gtx_decoder

例化名:u_gtx_decoder

作用 :把数据加dout_vld

gtx_decoder_dout[15:0]

gtx_decoder_dout_vld模块名:mdyUnpackCommMode2

例化名:u_UnpackComm

作用 :去包头,校验对比

只输出数据段

dout_vld

dout[15:0]

dout_sop

dout_eop

dout_mty[1:0]

dout_err

dout_vld

dout[63:0]

dout_sop

dout_eop

dout_mty[3:0]

模块名 :mdy_pack_pick_by_head_guangqian

模块例化名:u_rx_dpack_analy

作用 :判断数据头是不是16'h55AA

光纤转存到DDR

模块名 :mdy_pack_pick_by_head_guangqian

模块例化名:u_rx_cpack_analy

作用 :判断数据头是不是16'hF8F8

光纤转存到PCIE

模块名 :mdy_pack_pick_by_head_guangqian

模块例化名:u_rx_dpack_analy

作用 :判断数据头是不是16'h55AA

光纤转存到DDR

模块名 :mdy_pack_pick_by_head_guangqian

模块例化名:u_rx_cpack_analy

作用 :判断数据头是不是16'hF8F8

光纤转存到PCIE

模块名 :mdy_pack_pick_by_head_guangqian

模块例化名:u_rx_dpack_analy

作用 :判断数据头是不是16'h55AA

光纤转存到DDR

模块名 :mdy_pack_pick_by_head_guangqian

模块例化名:u_rx_cpack_analy

作用 :判断数据头是不是16'hF8F8

光纤转存到PCIE

模块名 :mdy_pack_pick_by_head_guangqian

模块例化名:u_rx_dpack_analy

作用 :判断数据头是不是16'h55AA

光纤转存到DDR

模块名 :mdy_pack_pick_by_head_guangqian

模块例化名:u_rx_cpack_analy

作用 :判断数据头是不是16'hF8F8

光纤转存到PCIE

GTX0

模块名:afifo_134_64

例化名:u_gxt_fifo

作用 :光纤3数据FIFO

empty[4:0]Empty_4_nor[4:0]

ddr_fifo_th

模块名:u_tx_sp

作用:6个FIFO选择一个输出到PCEI的TX

dout_vlddout[63:0]dout_sopdout_eop

dout_mty[3:0]

模块名 :pack_s2p

模块例化名:u_pack_s2p

作用 :64位din转512位

模块名 :gtx2ddrSp

模块例化名:rx_sp

作用 :四路光纤选择哪一路写入到DDR中

数据FIFO_520_512

管理FIFO_1_64

mfifo_empty[3:0]

dout_vld

dout[511:0]

dout_sop

dout_eop

dout_mty[6:0]

dout_rdy

dout_cha[1:0] flag_sel

模块名 :pack_s2p

模块例化名:pack_s2p

作用 :64位din转128位

模块名:afifo_134_64

例化名:u_gxt_fifo

作用 :光纤3数据FIFO

模块名 :pack_s2p

模块例化名:pack_s2p

作用 :64位din转128位

模块名:afifo_134_64

例化名:u_gxt_fifo

作用 :光纤3数据FIFO

模块名 :pack_s2p

模块例化名:pack_s2p

作用 :64位din转128位

模块名:afifo_134_64

例化名:u_gxt_fifo

作用 :光纤3数据FIFO

模块名 :pack_s2p

模块例化名:pack_s2p

作用 :64位din转128位

模块名: mdy_flag_sel

例化名:u_gxt_fifo

作用 :判断输入数据中,

第几位被值1

操做:对empty取反

作用:FIFO有数据后边对应位

就输出一个1

FIFO空 empty==1

FIFO有数据 empty==0

模块名 :pack_s2p

模块例化名:u_pack_s2p

作用 :64位din转512位

数据FIFO_520_512

管理FIFO_1_64

模块名 :pack_s2p

模块例化名:u_pack_s2p

作用 :64位din转512位

数据FIFO_520_512

管理FIFO_1_64

模块名 :pack_s2p

模块例化名:u_pack_s2p

作用 :64位din转512位

数据FIFO_520_512

管理FIFO_1_64

模块名:ddr_mem_intf_guangxian

例化名:u_ddr_men_intf

作用 :把光纤过来的数据,缓存到FIFO中,

达到一定数量(DDR3_IP核的突发长度)。

就把数据写入到DDR3中。

写一定数量后,开始读取DDR3中的数据。

给 PCIE发送过去

模块名:afifo_512_1024

例化名:u_fifo_x

作用 :缓存光纤数据的FIFO

wr_burst_data_req

din[511:0]

din_vld

data

wrreq

rdreq

qwfifo_q

wfifo_empty

IDLE

ADDR

REQQ

DATA

|

rfifo_empty

模块名:fifo_29_4096

例化名:u_rfifo

作用 :chan_wr_rdy

dou_rdy

chan_rdy

&&

empty

&&

&&

empty

wr_burst_addrdin

wr_en

data2idle_start

模块名:mem_burst_xilinx

例化名:u_mem_burst

作用 :按照DDR3_IP的驱动

时序把数据发送给

DDR3的IP

app_addr[28:0]

app_cmd[2:0]

app_en

app_rdy

app_rd_data[511:0]

app_rd_data_end

app_rd_data_valib

app_wdf_data[511:0]

app_wdf_end

app_wdf_mask[63:0]

app_wdf_rdy

app_wdf_wren

控制

rd_burst_req

rd_burst_len[9:0]

rd_burst_addr[28:0]

rd_burst_valid

rd_burst_data[511:0]

rd_burst_finish

wr_burst_req

wr_burst_len[9:0]

wr_burst_addr[28:0]

wr_burst_data_req

wr_burst_data[511:0]

wr_burst_finish

burst_finish

wfifo_rdreq

cfg_rd_thd

cfg_rd_thd<=

rfifo_rdcnt

<=

rfifo_rdcnt

rdusedw

rdusedw

h

h

h

burst_finish

1

wr_burst flag_sel_rw

rd_burst

|

flag_sel_rw==0是写

flag_sel_rw==1是读

wr_burst_data_req&&flag_sel_rw==0

rd_burst_data_valid&&flag_sel_rw==1

wfifo_qq

wr_burst_data

wfifo_q

wr_burst_addr <= addr_wr_cnt *cfg_burst_len

rd_burst_addr<=rfifo_q

cfg_chan_start_addr :

从DDR3中哪个地址开始写,基地址

addr_wr_cnt :

每突发写完一次加一

cfg_burst_len :

突发长度,

&&flag_sel_rw==0

rfifo_rdcnt<4000&&

chan_rd_rdy==0

chan_rd_rdy==1

&&

chan_rd_rdy==1chan_rd_rdy==0

flag_sel_rw==1

wfifo_q

wr_burst_len

rd_burst_len

wr_burst

rd_burst

wr_burst_addr

burst_finish

rd_burst_valid

wr_burst_data_req

rd_en&&reqq2data_start

rfifo_rdreq

dout_eop

dout_err

dout_vld

dou[511:0]

dout_sop

dout_vld

dout[63:0]

dout_sop

dout_eop

dout_mty[3:0]

模块名:afifo_520_512

例化名:u_gxt_fifo

作用 :光纤3数据FIFOassign ddr_fifo_th = ddr_rdusedw>=256

备注2:hot2bin

模块名:afifo_520_512

例化名:u_gxt_fifo

作用 :光纤3数据FIFO

pcie_din_fifo

wr_en_0

pcie_tx[127:0]

pcie_tx_vld

dout

rd_en_0

empty

pcie_exp_txn[7:0]

pcie_exp_rxn[7:0]

pcie_exp_txp[7:0]

模块名 :pack_s2p

例化名:pack_s2p

作用 :din[15:0]转成din[63:0]

GTX1

GTX2

GTX3

pcie_mty_rx_vldFIFO_READ_1_empty

组合电路

作用:大小端转换(详见:备注1)

pcie_din[127:0]

组合电路

作用:判断ID值(详见:备注3)

&&

cfg_rx_dout_sop==1

cfg_rx_dout_eop==1

cfg_rx_dout_mty[3:0]==0

dout_vld[0]==1

dout_vld[1]==1

dout_vld[2]==1

dout_vld[3]==1

模块名:mig_7series_0

例化名:u_ddr3

作用 :DDR3的IP

ddr3_addr[14:0]

ddr3_ba[2:0]

ddr3_cas_n

ddr3_ck_n

ddr3_ck_p

ddr3_cke

ddr3_cs_n

ddr3_dm[7:0]

ddr3_odt

ddr3_ras_n

ddr3_reset_n

ddr3_we_n

ddr3_dq[63:0]

ddr3_dqs_n[7:0]

ddr3_dqs_p[7:0]

din[127:80]

reg_rd ? rdata : din[79:48]

din[47:0]

80

49

flag_get_addr

flag_get_data

光纤打包0

4路光纤接口模块

光纤解包0

光纤打包1

光纤解包1

测试数据生成0

接收统计0

测试数据生成1

接收统计1

串口配置功能

寄存器软件(近物所)

电脑

FPGA

PCIE上位机软件

(mdyPcieRelease)PCIE接口功能

测试数据生成功能

发送统计功能

接收统计功能

串口配置功能

寄存器软件(近物所)

电脑

FPGA

模式控制功能

PCIE上位机软件

(mdyPcieRelease)PCIE接口功能

测试数据生成功能

发送统计功能

接收统计功能

FPGA

模式控制功能

光纤打包0

4路光纤接口模块

光纤解包0

光纤打包1

光纤解包1

串口配置功能

寄存器软件(近物所)

电脑

接收卡FPGA

光纤打包0

2路光纤接口模块

光纤解包0

光纤打包1

光纤解包1

测试数据生成0

测试数据生成1

光纤配置功能0

发送卡FPGA

DDR3

PCIE

PCIE上位机软件

(mdyPcieRelease)

光纤配置功能1

电脑

Recommended