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

PCIe FPGA DDR3 PCIe

  • Upload
    others

  • View
    43

  • Download
    0

Embed Size (px)

Citation preview

Page 1: PCIe FPGA DDR3 PCIe

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

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

光纤项目

FPGAPC

GT4

GT3

GT2

GT1

DDR3

Page 2: PCIe FPGA DDR3 PCIe

GT1

GT2

GT3

GT4

PCIe

DDR3

PCIe_IP

DDR3_IP

GTX_IP

大小端转换

大小端转换

解析PCIE

光纤驱动

光纤驱动

光纤驱动

光纤驱动

选择六组

FIFO中的一组数据到

PCIe

DDR3IP时序

选择数据

到DDR3DDR3

读写地址和

突发长度

管理

光纤项目功能框图

FPGA

F8F8

55AA

PCIE时钟

光纤接收时钟

DDR时钟

光纤发送时钟

Page 3: PCIe FPGA DDR3 PCIe

模块名: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

框图

下一页

Page 4: PCIe FPGA DDR3 PCIe

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

Page 5: PCIe FPGA DDR3 PCIe

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核

框图

Page 6: PCIe FPGA DDR3 PCIe

框图

下一页

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

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

Page 7: PCIe FPGA DDR3 PCIe

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

Page 8: PCIe FPGA DDR3 PCIe

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

上一页

Page 9: PCIe FPGA DDR3 PCIe

模块名: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]

框图

Page 11: PCIe FPGA DDR3 PCIe

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 ];

上一页

Page 12: PCIe FPGA DDR3 PCIe

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];

大小端转换

上一页

Page 13: PCIe FPGA DDR3 PCIe

模块名 :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;

框图

Page 14: PCIe FPGA DDR3 PCIe

模块名: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

框图

Page 15: PCIe FPGA DDR3 PCIe

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

// 判断输入数据中,第几位被值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

上一页

Page 16: PCIe FPGA DDR3 PCIe

模块名 :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]

框图

Page 17: PCIe FPGA DDR3 PCIe

模块名: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

框图

Page 18: PCIe FPGA DDR3 PCIe

命令总线

读总线

上一页

下一页

Page 19: PCIe FPGA DDR3 PCIe

命令总线首页

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

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

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

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

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

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

写总线

Page 20: PCIe FPGA DDR3 PCIe

关于 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 就看得更清楚了

Page 21: PCIe FPGA DDR3 PCIe

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

Page 22: PCIe FPGA DDR3 PCIe

光纤打包0

4路光纤接口模块

光纤解包0

光纤打包1

光纤解包1

测试数据生成0

接收统计0

测试数据生成1

接收统计1

串口配置功能

寄存器软件(近物所)

电脑

FPGA

Page 23: PCIe FPGA DDR3 PCIe

PCIE上位机软件

(mdyPcieRelease)PCIE接口功能

测试数据生成功能

发送统计功能

接收统计功能

串口配置功能

寄存器软件(近物所)

电脑

FPGA

模式控制功能

Page 24: PCIe FPGA DDR3 PCIe

PCIE上位机软件

(mdyPcieRelease)PCIE接口功能

测试数据生成功能

发送统计功能

接收统计功能

FPGA

模式控制功能

Page 25: PCIe FPGA DDR3 PCIe

光纤打包0

4路光纤接口模块

光纤解包0

光纤打包1

光纤解包1

串口配置功能

寄存器软件(近物所)

电脑

接收卡FPGA

光纤打包0

2路光纤接口模块

光纤解包0

光纤打包1

光纤解包1

测试数据生成0

测试数据生成1

光纤配置功能0

发送卡FPGA

DDR3

PCIE

PCIE上位机软件

(mdyPcieRelease)

光纤配置功能1

电脑