JESD204B/C协议学习笔记

news2024/11/16 9:35:03

JESD204B基础概念

204B包含传输层,链路层,物理层。
应用层是对 JESD204B 进行配置的接口,在标准协议中是不含此层,只是为了便于理解,添加的一个层。
协议层指工程中生成的IP核JESD204B,负责处理输入的用户数据。
传输层:采样数据映射为数据帧,将数据封装组包。在IP核JESD204B中实现
链路层:传输数据链路建立。IP核JESD204B与IP核JESDPHY之间的数据传输可以认为是链路建立
物理层(PHY):数据发送与接收。一端连接IP核JESD204B,另一端直接与AD/DA芯片相连接的物理端口

AD/DA采样率与信号频率关系

DAC:
在这里插入图片描述
ADC:
在这里插入图片描述

同步方式

子类1与子类2使用SYSREF(参考时钟)与SYNC(同步信号)进行数据同步,子类1与0支持确定性延迟。
SYSREF上升沿同时,发送一个或多个多帧。
子类1与子类2模式下的工作时钟如图所示(SYSREF_CLK为参考时钟,DEVICE_CLK为工作时钟,SYNC为同步信号):
在这里插入图片描述

SYNC信号为低表示正在同步(同步码),为高表示同步完成。当SYSREF_CLK信号在上升沿时,发送一个或多个多帧。

物理层

在工程中指生成的JESD204B_PHY的IP核,该IP核用来连接DAC的物理接口,配合JESD204B的IP核使用。如图所示:
在这里插入图片描述

传输层

在使用204B接口进行数据传输之前需要确定参数,如图所示:
在这里插入图片描述在这里插入图片描述

主要参数意义

F

每一帧数据中的字节个数,如图所示,F=7时,表示7列数据,每一列为8位宽数据。如图所示。(CCCC表示控制码)
在这里插入图片描述

N

AD/DA转换器分辨率。N=16时,表示一个采样点16bit。

M

AD/DA转换器中单元个数,M 个转换单元一共 M 个采样点,每一个采样点有 N 位数据,将 M 个采样点线性的排列在一横排高位在前,低位在后。一个AD/DA芯片转换M个通道。M=1表示一个芯片一个通道。
在这里插入图片描述
如图所示,M=16时,16个采样点Cr0~Cr15。

CS

控制位数,控制数据是几位。cs=2时,图中c1与c0即为控制位。

T

tail bit,单帧中每一个采样点的数据不满足8位时,在每个采样点后填充数据。

N’

N’=N+CS+T;多位数据扩展多个无效/封装位的位宽。若无封装和无效位,N=N’。实际传输的采样率为N’。

HD

HD=0低密度模式,一个采样点在一条链路Lane传输。HD=1高密度模式,一个采样点在多条链路Lane传输。 HD 的值决定了一个采样点最后是映射到一个单独的 LANE,还是映射到多个 LANE。
如下图所示,HD=0时,Cr0~Cr15共16个采样点每个点在一条线传输。
在这里插入图片描述
HD=1,采样点Cr2与Cr10在两条Lane线传输。
在这里插入图片描述
L个链路通道分为CF个组,每个组包含L/CF条链路通道,每组传输 M*S/CF 个采样点。

L

数据传输通道。(链路)设置Lane个数。(L个SERDES传输接口 )

S

每帧数据中的采样点数。JESD204B 数据映射按照 S 的取值分为两种情况:正常采样情况下的数据映射和过采样情况下的数据映射。当 S=1,是正常采样情况下的数据映射;当 S>1,是过采样情况下的数据映射。正常采样情况下,帧时钟等于采样时钟;过采样情况下,采样时钟是帧时钟的 S 倍。(一帧中包含S个采样点数)

CF

控制字个数,一个控制字8位。如上图所示,CF=1表示一列中一个8位宽控制字Cr0:3[c1:c0]。
如下图所示。CF=2表示一列中两个8位宽控制字Cr0:3[c1:c0]、Cr8:11[c1:c0]。
控制字的位数: MSCS/CF
[外链图片转存中...(img-CVpJ4Fpl-1663312811322)]

K

每个多帧的帧数, 1 到 32 之间的整数。(S个采样点组成一帧,K个帧组成多帧)。当SYSREF_CLK信号在上升沿时,发送一个或多个多帧(单位)。

F

将所有的数据按 8 位一个字节划分,共得到 F 个字节。这F字节的数据在通道内传输。

链路层

链路层包括扰码器加扰,链路建立, 8b/10b 编码。

码器加扰

可选,对数据进行0/1均衡。

链路建立

链路建立包含代码组同步,初始通道对齐,用户数据传输。此部分IP核做好直接使用即可。Sync信号为低(发送端发送同步码),接收端Sync为高表示同步完成。

代码组同步

使用 CDR 技术恢复位时钟,对每一个链路上的数据进行位同步和帧同步。

初始通道对齐

识别出每一个链路上数据的多帧开始,并使用缓存器对所有链路的数据进行缓存,使所有链路上的数据对齐。

JESD204B应用

信号时钟之间的关系。如图所示。
在这里插入图片描述
以下数据有点不对,仅供参考。
在这里插入图片描述
接口工作内核时钟 X 接口位宽 == FPGA内部数据处理时钟 X 存储位宽

在这里插入图片描述

查看AD/DA芯片手册,确定mode,如图所示。假设选择mode11。
在这里插入图片描述

假设设置DAC输出信号F:						     	 F=250M
采样率=信号周期点数*信号F:						输出信号采样率=16*250M=4G
设置转化单元个数M,几个DAC单元:					M=2。
设置Lane通道个数:										Lane=8
设置子类模式:												子类1
设置DAC插值interpolation个数					interpolation=2  (设置信号周期点数减半,输入信号周期点数=8,插值后DAC输出信号周期点数=16)
设置Link(AD/DA芯片手册设置)

确定Lane速率(求DAC每秒传多个bit)(FPGA输出数字信号传给DAC):Tx与PHY两个IP设置中LineRate速率一致。

假设DAC输出信号频率F=250M,DAC输出周期点数16个点。DAC芯片使用M=2个DAC转换单元,内插为2.
204B接口每秒传输给DAC点数:F*N/2个点(interpolation=2,F*N为实际采样率 )。(250M*8=2G)
DAC分辨率16bit,接口每秒传输F*N/2*16 bit。(2G*16bit=32Gbit)
M个DAC转换器,接口每秒传输M*[F*N/2*16 ]bit。(32Gbit*2=64Gbit)
数据通过接口传输前使用8b/10b编码,每秒传输{M*[F*N/2*16 ]}*10/8bit。(64G*10/8=80G)
mode11使用Lane=8条线路传输数据。每条线路每秒传输的数据量:10/8*{M*[F*N/2*16 ]}/8bit。(80G/8=10G)
可得物理LineRate=10G。

在这里插入图片描述

JESD204IP与PHY_IP(内核时钟tx_core_clk):lane速率/40。(10G/40=250M)
在这里插入图片描述
Device clock():204B工作时钟 时钟芯片输入
SYSREF:参考时钟 上升沿同步发数据 时钟芯片输入
Sync:同步完成信号 是否同步完成

JESD204B同步过程

配置204BIP: CPLL(线速率小于8G),QPLL(线速率大于8G)
这些同步阶段中的每一个都是使用32位同步字实现
没有码组同步(CGS)或初始通道对齐序列(ILAS)
传输层:帧边界会不与块边界对齐,存在帧不是恰好包括8个八位字的可能
参考添加链接描述
参考添加链接描述

同步报头同步

扩展多块同步

扩展多块对齐

AXI协议应用

主机(master)从机(slave)
AXI4:支持突发256长度传输。
AXI4-Lite:简单通信,低吞吐量,接口较少。不支持突发。
AXI4-Stream:高速流数据。不要地址,可以无限突发长度。
AXI4和AXI4-Lite有五个通道:
读写地址通道,读写数据通道,写响应通道。
基本示例参考:三个示例
接口参考:接口描述

JESD204C简单环回实验

在这里插入图片描述

JESD204C协议发送tx数据,rx解码恢复数据。

系统框图

txjesd_init: 初始化模块
JESD204_TxInitcode/JESD204_RxInitcode:初始化控制模块
JESD204_Interface_Axi : AXI接口转化模块
jesd204c_tx/jesd204c_rx : 例化两个JESD204C和JESD204PHY IP核
txinitcode_save/rxinitcode_save: 查找表;通过AXI协议读写JESD204C IP核地址完成初始化
在这里插入图片描述

初始化过程

JESD204_TxInitcode/JESD204_RxInitcode模块状态机
在这里插入图片描述

TX初始化过程

1:读操作:读AXI4-Lite Address 0X020 读IP核是否复位完成(或者jesd204c_0 IP核输出tx_aresetn高电平表示可以读写操作)
2:读操作:读AXI4-Lite Address 0X000 读IP核版本
3:写操作:写AXI4-Lite Address 0X030 设置扩展多块的E值
4:写操作:写AXI4-Lite Address 0X020 bit[0]位写1,使能IP核复位
5:写操作:写AXI4-Lite Address 0X020 bit[0]位写0,使能IP核复位恢复
6:读操作:读AXI4-Lite Address 0X020 读IP核是否复位完成
7:写操作:写AXI4-Lite Address 0X024 bit[0]位写1表示使能AXI4-Stream CMD接口 bit[1]位写1表示使能AXI4-Stream data接口
8:jesd204c_0 IP核tx_tready端口输出高电平表示可以发送数据

Rx初始化过程

1:读操作:读AXI4-Lite Address 0X020 读IP核是否复位完成(或者jesd204c_1 IP核输出rx_aresetn高电平表示可以读写操作)
2:读操作:读AXI4-Lite Address 0X000 读IP核版本
3:写操作:写AXI4-Lite Address 0X030 设置扩展多块的E值
4:写操作:写AXI4-Lite Address 0X044 设置接收buffer提前释放个数
在这里插入图片描述

5:写操作:写AXI4-Lite Address 0X020 bit[0]位写1,使能IP核复位
6:写操作:写AXI4-Lite Address 0X020 bit[0]位写0,使能IP核复位恢复
7:读操作:读AXI4-Lite Address 0X060 寄存器值h0x02 h0x12 h0x32
读到h0x32表示同步成功
在这里插入图片描述
8: 写操作:写AXI4-Lite Address 0X024 bit[0]位写1表示使能AXI4-Stream CMD接口 bit[1]位写1表示使能AXI4-Stream data接口    jesd204c_1 IP核rx_tvalid端口输出高电平表示可以接收数据
9:读操作:读AXI4-Lite Address 0X400 查看lan0 rx buffer缓冲区数据个数
读AXI4-Lite Address 0X480 查看lan1 rx buffer缓冲区数据个数
读AXI4-Lite Address 0X500 查看lan2 rx buffer缓冲区数据个数
读AXI4-Lite Address 0X580 查看lan3 rx buffer缓冲区数据个数
读AXI4-Lite Address 0X600 查看lan4 rx buffer缓冲区数据个数
读AXI4-Lite Address 0X680 查看lan5 rx buffer缓冲区数据个数
读AXI4-Lite Address 0X700 查看lan6 rx buffer缓冲区数据个数
读AXI4-Lite Address 0X780 查看lan7 rx buffer缓冲区数据个数

仿真

仿真文件

根据仿真过程编写仿真文件

`timescale 1ns/1ns
`define	CLK_PER 10

module jesd204txrx_tb();

reg								rst_n			;
reg								clk				;
wire			clk_out1		;
wire			clk_out2		;
wire			locked0			;
wire			locked1			;
wire			locked2			;
wire			clk_out3		;
wire			clk_out4		;
wire			ok				;
// wire			tx_init_done	;
wire			tx_tready		;
wire	[511:0]	rx_tdata		;
wire			rx_tvalid		;	
wire			rx_soemb		;
wire			rx_crc_err		;
wire			rx_emb_err		;
wire	[255 : 0]rx_cmd_tdata	;	
wire			rx_cmd_tvalid	;
wire	[7 : 0]	rx_cmd_tuser	;	
// wire			rx_inter_error	;
// wire			rx_init_done	;	
wire	[7:0]	txp_out         ;
wire	[7:0]   txn_out         ;
reg		[511:0]	tx_tdata		;
wire			tx_soemb		;
wire			tx_wr_done		;
wire			rx_wr_done		;
wire	[31:0]	tx_rd_data		;
wire	[31:0]	rx_rd_data		;
reg			tx_wr_op		;
reg			tx_rd_op		;
reg			rx_wr_op		;
reg	        rx_rd_op        ;
reg		[15:0]	tx_wrsa_addr	;
reg		[15:0]  tx_rdsa_addr	;
reg		[15:0]  rx_wrsa_addr	;
reg		[15:0]  rx_rdsa_addr	;
wire			rx_idle_signal	;
wire			tx_idle_signal	;
wire			rx_init_start	;
wire			tx_init_start	;
reg		[511:0]	rxrd_baladata	;
reg				rxrd_corrt		;
reg				correct;
reg		[15:0]	cnt	;




assign ok = locked0 && locked1 && locked2;
initial clk = 1;
always  #(`CLK_PER/2) clk = ~clk;

/*****************************inst*********************************/

 clk_wiz_0 clk_wiz_0_inst
   (
    .clk_in1(clk),		//100M
	
    .clk_out1(clk_out1),   	//187.5M
    .clk_out2(clk_out2),		//10M
	.locked(locked0)

	);  
	
  clk_wiz_1 clk_wiz_1_inst
   (
	.clk_in1(clk),
    .clk_out1(clk_out3),     // 82.5M
    .locked(locked1)       // output locked
	); 	
	
  clk_wiz_2 clk_wiz_2_inst
   (
	.clk_in1(clk),
    .clk_out1(clk_out4),     // 82.5M	140M??	300M??NO	160M??	200M??
    .locked(locked2)       // output locked
	); 		
	

jesd204c_tx	#(
		.C_M_AXI_ADDR_WIDTH(12),			//12
		.C_M_AXI_DATA_WIDTH(32)				//32
    )jesd204c_tx_inst(

	.tx_wr_op(tx_wr_op)					,			
	.tx_rd_op(tx_rd_op)                 ,
	.tx_wrsa_addr(tx_wrsa_addr)             ,
	.tx_rdsa_addr(tx_rdsa_addr)             ,
	.tx_wr_done(tx_wr_done)		        ,
	.tx_rd_data(tx_rd_data)		        ,
	.tx_idle_signal(tx_idle_signal)	        ,
	
	.tx_init_start(tx_init_start)	        ,
	
	.tx_core_reset 		(~rst_n),		
	.tx_core_clk 		(clk_out1),		//187.5M
	.tx_sysref   		(clk_out3),		//82.5M
	.axi_clk 			(clk),		//100
	.rst				(~rst_n),
	.tx_tdata			(tx_tdata),
	.tx_cmd_tdata		(256'b0),
	.tx_cmd_tvalid		(1'b0),

	.refclk				(clk_out4),		//82.5M 
	.drpclk				(clk),		//100

	// .tx_init_done		(tx_init_done),
	.tx_soemb			(tx_soemb),
	.tx_tready			(tx_tready),
	.txp_out			(txp_out),
    .txn_out            (txn_out)

    );

jesd204c_rx	#(
		.C_M_AXI_ADDR_WIDTH(12),			//12
		.C_M_AXI_DATA_WIDTH(32)				//32
    ) jesd204c_rx_inst(
	
	.rx_wr_op(rx_wr_op)				,
	.rx_rd_op(rx_rd_op)             ,
	.rx_wrsa_addr(rx_wrsa_addr)         ,
	.rx_rdsa_addr(rx_rdsa_addr)         ,
	.rx_wr_done(rx_wr_done)	        ,
	.rx_rd_data(rx_rd_data)	        ,
	.rx_idle_signal(rx_idle_signal)       ,
	
	.rx_init_start(rx_init_start)       ,

	.rx_sysref		(clk_out3),			//82.5M
	.rx_core_clk	(clk_out1),			//187.5
	.axi_clk		(clk),			//100
	.rst			(~rst_n),
	.refclk			(clk_out4),			//82.5M
	.drpclk			(clk),			//100
		
	.rxp_in		(txp_out),	
	.rxn_in		(txn_out),	
		
	.rx_tdata		(rx_tdata),	
	.rx_tvalid		(rx_tvalid		),	
	.rx_soemb		(rx_soemb		),	
	.rx_crc_err		(rx_crc_err		),	
	.rx_emb_err		(rx_emb_err		),	
	.rx_cmd_tdata	(rx_cmd_tdata	),	
	.rx_cmd_tvalid	(rx_cmd_tvalid	),
	.rx_cmd_tuser	(rx_cmd_tuser	),
	.rx_cmd_tready	(1'b0)
	
	// .rx_inter_error	(rx_inter_error	),
	// .rx_init_done	(rx_init_done	)	


    );

/*****************************************************************/
always @(posedge clk_out1 or negedge rst_n)
	if(!rst_n)
		tx_tdata <= 512'b0;
	else if(tx_tready && rx_tvalid)
		tx_tdata <= tx_tdata + 'd1000;

//同步之后固定延迟
always @(posedge clk_out1 or negedge rst_n)
	if(!rst_n)
		rxrd_baladata <= 512'b0;
	else if(cnt == 16'd36)
		rxrd_baladata <= rxrd_baladata + 'd1000;		
		
always @(posedge clk_out1 or negedge rst_n)
	if(!rst_n)
		cnt <= 16'b0;
	else if(tx_tready && rx_tvalid)
	begin
		if(cnt == 'd36)
			cnt <= cnt;
		else
			cnt <= cnt + 'b1 ;	
	end
	else
		cnt <= 16'b0;
		
		
always @(posedge clk_out1 or negedge rst_n)
	if(!rst_n)		
		correct <= 1'b0;
	else if(rxrd_baladata == rx_tdata)
		correct <= 1'b0;
	else
		correct <= 1'b1;
	
	
always @(posedge clk_out1 or negedge rst_n)		
	if(!rst_n)
		rxrd_corrt <= 1'b0;
	else if(rx_rd_data == 32'h32)
		rxrd_corrt <= 1'b1;
	else
		rxrd_corrt <= rxrd_corrt;


initial
begin
	rst_n = 0;
	#(`CLK_PER*5 + 1);
	@(posedge ok)
	rst_n = 1;
	
	rx_wr_op	= 0;
	rx_rd_op	= 0;
	rx_wrsa_addr	= 0;
	rx_rdsa_addr	= 0;
	
	@(posedge rx_init_start)	
	#(`CLK_PER + 5);	
	rx_wr_op	= 1;			//写E值
	rx_wrsa_addr = 1;
	#(`CLK_PER);	
	rx_wr_op	= 0;
	@(posedge rx_idle_signal)	

	#(`CLK_PER*2);	
	rx_wr_op	= 1;			//写接收缓冲区0
	rx_wrsa_addr = 5;
	#(`CLK_PER);	
	rx_wr_op	= 0;
	@(posedge rx_idle_signal)		
	
	#(`CLK_PER*2);	
	rx_wr_op	= 1;			//复位
	rx_wrsa_addr = 42;
	#(`CLK_PER);	
	rx_wr_op	= 0;
	@(posedge rx_idle_signal)	
	
	#(`CLK_PER*2);	
	rx_wr_op	= 1;			//复位恢复
	rx_wrsa_addr = 43;
	#(`CLK_PER);	
	rx_wr_op	= 0;
	
	@(posedge rx_init_start)		
	
	#(`CLK_PER*2);	
	rx_rd_op	= 1;			//读通道状态 等待同步完成
	rx_rdsa_addr = 13;
	@(posedge rxrd_corrt)
	#(`CLK_PER);	
	rx_rd_op	= 0;	
	
	// @(posedge tx_tready)		//	test
	
	#(`CLK_PER*20);	
	rx_wr_op	= 1;			//使能读通道
	rx_wrsa_addr = 0;
	#(`CLK_PER);	
	rx_wr_op	= 0;	
	@(posedge rx_idle_signal)	
	
	#(`CLK_PER*2);	
	rx_rd_op	= 1;			//读每个通道接收缓冲器数据量lane0
	rx_rdsa_addr = 16;
	#(`CLK_PER);	
	rx_rd_op	= 0;
	@(posedge rx_idle_signal)	

	#(`CLK_PER*2);	
	rx_rd_op	= 1;			//读每个通道接收缓冲器数据量lane1
	rx_rdsa_addr = 23;
	#(`CLK_PER);	
	rx_rd_op	= 0;
	@(posedge rx_idle_signal)	

	#(`CLK_PER*2);	
	rx_rd_op	= 1;			//读每个通道接收缓冲器数据量lane2
	rx_rdsa_addr = 30;
	#(`CLK_PER);	
	rx_rd_op	= 0;
	@(posedge rx_idle_signal)	
	
	#(`CLK_PER*2);	
	rx_rd_op	= 1;			//读每个通道接收缓冲器数据量lane3
	rx_rdsa_addr = 37;
	#(`CLK_PER);	
	rx_rd_op	= 0;
	@(posedge rx_idle_signal)		

	#(`CLK_PER*2);	
	rx_rd_op	= 1;			//读每个通道接收缓冲器数据量lane4
	rx_rdsa_addr = 44;
	#(`CLK_PER);	
	rx_rd_op	= 0;
	@(posedge rx_idle_signal)		


	#(`CLK_PER*2);	
	rx_rd_op	= 1;			//读每个通道接收缓冲器数据量lane5
	rx_rdsa_addr = 51;
	#(`CLK_PER);	
	rx_rd_op	= 0;
	@(posedge rx_idle_signal)
	
	#(`CLK_PER*2);	
	rx_rd_op	= 1;			//读每个通道接收缓冲器数据量lane6
	rx_rdsa_addr = 58;
	#(`CLK_PER);	
	rx_rd_op	= 0;
	@(posedge rx_idle_signal)


	#(`CLK_PER*2);	
	rx_rd_op	= 1;			//读每个通道接收缓冲器数据量lane7
	rx_rdsa_addr = 65;
	#(`CLK_PER);	
	rx_rd_op	= 0;
	@(posedge rx_idle_signal)
	#(`CLK_PER*200);
	
	$stop;
	
end
initial
begin
	tx_rd_op = 0;
	tx_wr_op = 0;
	tx_rdsa_addr = 0;
	tx_wrsa_addr = 0;

	@(posedge tx_init_start)
	#(`CLK_PER + 5);	
	tx_rd_op = 1;		//读版本
	tx_rdsa_addr = 0 ;
	#(`CLK_PER);
	tx_rd_op = 0;
	
	@(posedge tx_idle_signal)	
	#(`CLK_PER*10);	
	
	tx_wr_op = 1;		//配置E值
	tx_wrsa_addr = 1 ;	
	#(`CLK_PER);
	tx_wr_op = 0;

	@(posedge tx_idle_signal)	
	#(`CLK_PER*10);

	tx_wr_op = 1;		//复位
	tx_wrsa_addr = 40 ;	
	#(`CLK_PER);
	tx_wr_op = 0;
	@(posedge tx_idle_signal)	
	#(`CLK_PER*2);
	
	tx_wr_op = 1;		//复位恢复
	tx_wrsa_addr = 41 ;	
	#(`CLK_PER);
	tx_wr_op = 0;

	@(posedge tx_init_start)	
	#(`CLK_PER*20);
	
	//等待rx同步完成
	@(posedge rxrd_corrt)	
	
	
	#(`CLK_PER*50);
	tx_wr_op = 1;		//使能AXI stram
	tx_wrsa_addr = 0 ;	
	#(`CLK_PER);
	tx_wr_op = 0;
	
	#(`CLK_PER*200);
	
	$stop;
	
end

endmodule

TX初始化主状态机文件

`timescale 1ns / 1ps

module JESD204_TxInitcode#(
	parameter integer M_AXI_ADDR_WIDTH	= 32,
    parameter integer M_AXI_DATA_WIDTH	= 32

)
(
	input 	rst		,
	input	clk		,
	
	//user interface
	input				wr_op			,
	input	[15:0]		tx_wrsa_addr	,
	
	input				rd_op			,
	input	[15:0]		tx_rdsa_addr	,
	output				wr_done			,
	output	reg	[M_AXI_DATA_WIDTH - 1 : 0]	tx_rd_data	,	
	

	//axi interface
	output	reg		[M_AXI_DATA_WIDTH - 1 : 0]	wr_data	,
	output	reg		[M_AXI_ADDR_WIDTH - 1 : 0]	wr_addr	,
	output	reg		waddate_valid ,
	input	wr_ok		,
	
	output	reg		[M_AXI_ADDR_WIDTH - 1 : 0]	rd_addr	,
	output	reg		rdaddr_valid ,
	
	input	[M_AXI_DATA_WIDTH - 1 : 0]	rd_data	,
	input	rdata_valid ,
	
	output	reg 	idle_signal 	
	

    );
	
	
	localparam
	idle		=		5'b0_0000,
	wrdata		=		5'b0_0001,
	waitwrdata	=		5'b0_0010,
	rdrdy		=		5'b0_0100,
	rddata		=		5'b0_1000,
	waitrddata	=		5'b1_0000;
	
	
	reg		[4:0]		state		;
	reg		[15:0]		wr_sa_addr	;
	reg		[15:0]		rd_sa_addr	;
	reg					sa_enable			;
	wire				initata_valid		;
	wire	[M_AXI_DATA_WIDTH-1 : 0]	initwr_data;
	wire    [M_AXI_ADDR_WIDTH-1 : 0]	initwr_addr;
	wire    [M_AXI_ADDR_WIDTH-1 : 0]	initrd_addr;
	reg		wr_op_reg	;
	reg		rd_op_reg	;
	
	assign 	wr_done = wr_ok	;
	
	always @(posedge clk or posedge rst)
	if(rst)
		wr_op_reg <= 1'b0;
	else 
		wr_op_reg <= wr_op;
		
	always @(posedge clk or posedge rst)
	if(rst)
		rd_op_reg <= 1'b0;
	else 
		rd_op_reg <= rd_op;	

	
	always @(posedge clk or posedge rst)
	begin
		if(rst)
		begin
			state <= idle ;
			wr_data <= 'b0;
			wr_addr <= 'b0;
			waddate_valid <= 1'b0;
			rd_addr <= 'b0;
			rdaddr_valid <= 1'b0;
			idle_signal  <= 1'b0;
			sa_enable <= 1'b0;
			wr_sa_addr <= 16'b0;
			rd_sa_addr <= 16'b0;
		
		end
		else
		begin
			case(state)
			
				idle :
				begin
				    wr_data <= wr_data;
				    wr_addr <= wr_addr;
				    waddate_valid <= 1'b0;
				    rd_addr <= rd_addr;
				    rdaddr_valid <= 1'b0;
				    idle_signal  <= 1'b1;
				    sa_enable <= 1'b0;
					wr_sa_addr <= 16'b0;
					rd_sa_addr <= 16'b0;
					if(wr_op_reg)
						state <= wrdata;
					else if(rd_op_reg)
						state <= rdrdy;
					else
						state <= idle  ;
				end

				wrdata :
				begin
					idle_signal <= 1'b0;
					sa_enable <= 1'b1;
					wr_sa_addr <= tx_wrsa_addr ;	
					state <= waitwrdata;
				end
				
				waitwrdata :
				begin
					if(wr_ok)
					begin
						state <= idle;
					end
					else
					begin
						sa_enable <= 1'b0;
						wr_sa_addr <= wr_sa_addr;
						waddate_valid <= initata_valid;
						wr_data	<= initwr_data;
						wr_addr	<= initwr_addr;	
					end
				
				end
				
				rdrdy :
				begin
					idle_signal <= 1'b0;
					sa_enable <= 1'b1;
					rd_sa_addr <= tx_rdsa_addr;
					state <= rddata;
				end
				
				rddata :
				begin
					rd_sa_addr <= rd_sa_addr ;
					sa_enable <= 1'b0;
					if(initata_valid)
					begin
						rd_addr <= initrd_addr;
						rdaddr_valid <= 1'b1;
						state <= waitrddata;
					end
					else
					state <= rddata;
				end
				
				waitrddata :
				begin
					if(rdata_valid)
					begin
						tx_rd_data <= rd_data ;
						state <= idle;
					end
					else
						rdaddr_valid <= 1'b0;
				end
				

				default :
				begin
					state <= idle ;	
				end
				
			endcase
		
		
		end
	end
	

txinitcode_save#(

	.M_AXI_ADDR_WIDTH(M_AXI_ADDR_WIDTH),
    .M_AXI_DATA_WIDTH(M_AXI_DATA_WIDTH)

)txinitcode_save_inst(
	.clk			(clk),
	.rst			(rst),
	.wr_sa_addr		(wr_sa_addr),
	.rd_sa_addr		(rd_sa_addr),
	.sa_enable		(sa_enable),

	.initwr_data	(initwr_data),
	.initwr_addr	(initwr_addr),
	.initrd_addr	(initrd_addr),
	.initata_valid	(initata_valid)

    );	
	

endmodule

初始化接口文件

将AXI接口简化对接初始化控制状态机


`timescale 1 ns / 1 ps

	module JESD204_Interface_Axi  #
	(
		//读写事务初始地址位宽
		parameter integer C_M_AXI_ADDR_WIDTH	= 32,
		// 主机读写数据位宽
		parameter integer C_M_AXI_DATA_WIDTH	= 32

	)
	(
		
		//wr address channel
		input 	[C_M_AXI_ADDR_WIDTH - 1 : 0] wr_addr,
		//wr data  channel
		input	[C_M_AXI_DATA_WIDTH - 1 : 0] wr_data,
		input	waddate_valid	,
		//wr ack  	one clock cycle
		output	wr_ok	,
		//rd address channel
		input	[C_M_AXI_ADDR_WIDTH - 1 : 0] rd_addr,
		input	rdaddr_valid	,
		//rd data channel	
		output	reg	[C_M_AXI_DATA_WIDTH-1 : 0] rd_data,
		output	rdata_valid	,		//one clock cycle
		
		output		reg  	error_reg	,
	
		input wire  M_AXI_ACLK,
		input wire  M_AXI_ARESETN,
		
		///写地址通道
		//主机发出的写地址通道端口
		output reg [C_M_AXI_ADDR_WIDTH-1 : 0] M_AXI_AWADDR,
		//写入通道保护类型。
		//该信号指示事务的特权和安全级别,以及事务是数据访问还是指令访问。0
		output wire [2 : 0] M_AXI_AWPROT,
		
		// 写地址通道有效  
		output wire  M_AXI_AWVALID,
		//写地址通道
		input wire  M_AXI_AWREADY,
		
		
		// 写数据通道
		output reg [C_M_AXI_DATA_WIDTH-1 : 0] M_AXI_WDATA,
		// 写入选通 all 1
		output wire [C_M_AXI_DATA_WIDTH/8-1 : 0] M_AXI_WSTRB,	
		// 写数据有效
		output wire  M_AXI_WVALID,
		// 写数据应答信号
		input wire  M_AXI_WREADY,
		
		
		
		//写响应通道 表示写传输状态0
		input wire [1 : 0] M_AXI_BRESP,
		//写响应有效
		input wire  M_AXI_BVALID,
		// 主机接收写响应信号后应答
		output wire  M_AXI_BREADY,
		
		
		
		//读地址通道
		output reg [C_M_AXI_ADDR_WIDTH-1 : 0] M_AXI_ARADDR,
		// 保护类型。该信号指示事务的特权和安全级别,以及事务是数据访问还是指令访问。
		output wire [2 : 0] M_AXI_ARPROT,
		//读地址有效
		output wire  M_AXI_ARVALID,
		//读地址应答信号
		input wire  M_AXI_ARREADY,
		
		
		// 读数据通道
		input wire [C_M_AXI_DATA_WIDTH-1 : 0] M_AXI_RDATA,
		// 读响应读状态
		input wire [1 : 0] M_AXI_RRESP,
		// 读数据有效
		input wire  M_AXI_RVALID,
		// 读数据应答
		output wire  M_AXI_RREADY
	);


	//write address valid
	reg  	axi_awvalid;
	//write data valid
	reg  	axi_wvalid;
	//read address valid
	reg  	axi_arvalid;
	//read data acceptance
	reg  	axi_rready;
	//write response acceptance
	reg  	axi_bready;
	wire  	write_resp_error;
	wire  	read_resp_error;

	assign M_AXI_AWPROT	= 3'b000;
	assign M_AXI_AWVALID	= axi_awvalid;
	//Write Data(W)
	assign M_AXI_WVALID	= axi_wvalid;
	//Set all byte strobes in this example
	assign M_AXI_WSTRB	= 4'b1111;
	//Write Response (B)
	assign M_AXI_BREADY	= axi_bready;
	assign wr_ok	= axi_bready;
	//Read Address (AR)
	assign M_AXI_ARVALID	= axi_arvalid;
	assign M_AXI_ARPROT	= 3'b001;
	//Read and Read Response (R)
	assign M_AXI_RREADY	= axi_rready;
	assign rdata_valid	= axi_rready;


	  always @(posedge M_AXI_ACLK)   
		if (M_AXI_ARESETN == 0)  	  
			error_reg <= 1'b0;
		else if(write_resp_error || read_resp_error)
			error_reg <= 1'b1;
		else
			error_reg <= 1'b0;
		
	//--------------------
	//Write Address Channel
	//--------------------
	  always @(posedge M_AXI_ACLK)										      
	  begin                                                                        
	    if (M_AXI_ARESETN == 0)                                                   
	      begin                                                                    
	        axi_awvalid <= 1'b0;                                                   
	      end                                                                              
	    else                                                                       
	      begin                                                                    
	        if (waddate_valid)                                                
	          begin                                                                
	            axi_awvalid <= 1'b1;                                               
	          end                                                                  
	        else if (M_AXI_AWREADY && axi_awvalid)                                 
	          begin                                                                
	            axi_awvalid <= 1'b0;                                               
	          end                                                                  
	      end                                                                      
	  end                                                                          
                                              
	  always @(posedge M_AXI_ACLK)                                                 
	  begin                                                                        
	    if (M_AXI_ARESETN == 0)                                                   
	      begin                                                                    
	        M_AXI_AWADDR <= 0;                                                      
	      end                                                                                                                  
	    else if (waddate_valid)                                               
	      begin                                                                    
	        M_AXI_AWADDR <= wr_addr	;                                        
	      end                                                                      
	  end                                                                          


	//--------------------
	//Write Data Channel
	//--------------------
	   always @(posedge M_AXI_ACLK)                                        
	   begin                                                                         
	     if (M_AXI_ARESETN == 0)                                                    
	       begin                                                                     
	         axi_wvalid <= 1'b0;                                                     
	       end                                                                                 
	     else if (waddate_valid)                                                
	       begin                                                                     
	         axi_wvalid <= 1'b1;                                                     
	       end                                                                        
	     else if (M_AXI_WREADY && axi_wvalid)                                        
	       begin                                                                     
	        axi_wvalid <= 1'b0;                                                      
	       end                                                                       
	   end                   

	   always @(posedge M_AXI_ACLK)                                        
	   begin  
	     if (M_AXI_ARESETN == 0)                                                    
	       begin                                                                     
	         M_AXI_WDATA <= 'b0;                                                     
	       end   
		 else if(waddate_valid)
			M_AXI_WDATA <= wr_data;  
	   end


	//----------------------------
	//Write Response (B) Channel
	//----------------------------
	  always @(posedge M_AXI_ACLK)                                    
	  begin                                                                
	    if (M_AXI_ARESETN == 0)                                           
	      begin                                                            
	        axi_bready <= 1'b0;                                            
	      end                                                                                       
	    else if (M_AXI_BVALID && ~axi_bready)                              
	      begin                                                            
	        axi_bready <= 1'b1;                                            
	      end                                                              
	    // deassert after one clock cycle                                  
	    else if (axi_bready)                                               
	      begin                                                            
	        axi_bready <= 1'b0;                                            
	      end                                                                                                
	    else                                                               
	      axi_bready <= axi_bready;                                        
	  end                                                                  
	                                                                       
	//Flag write errors                                                    
	assign write_resp_error = (axi_bready & M_AXI_BVALID & M_AXI_BRESP[1]);


	//----------------------------
	//Read Address Channel
	//----------------------------

	  always @(posedge M_AXI_ACLK)                                                     
	  begin                                                                            
	    if (M_AXI_ARESETN == 0)                                                       
	      begin                                                                        
	        M_AXI_ARADDR <= 0;                                                           
	      end                                                                                                                            
	    else if (rdaddr_valid)                                                    
	      begin                                                                        
	        M_AXI_ARADDR <= rd_addr	;                                              
	      end                                                                          
	  end                                                                              
	                                                                                   
                                                             
	  always @(posedge M_AXI_ACLK)                                                     
	  begin                                                                            
	    if (M_AXI_ARESETN == 0)                                                       
	      begin                                                                        
	        axi_arvalid <= 1'b0;                                                       
	      end                                                                                     
	    else if (rdaddr_valid)                                                    
	      begin                                                                        
	        axi_arvalid <= 1'b1;                                                       
	      end                                                                          
	    else if (M_AXI_ARREADY && axi_arvalid)                                         
	      begin                                                                        
	        axi_arvalid <= 1'b0;                                                       
	      end                                                                                                                        
	  end                                                                              


	//--------------------------------
	//Read Data (and Response) Channel
	//--------------------------------
	  always @(posedge M_AXI_ACLK)                                    
	  begin                                                                 
	    if (M_AXI_ARESETN == 0)                                            
	      begin                                                             
	        axi_rready <= 1'b0;                                             
	      end                                                                                        
	    else if (M_AXI_RVALID && ~axi_rready)                               
	      begin                                                             
	        axi_rready <= 1'b1;                                             
	      end                                                               
	    // deassert after one clock cycle                                   
	    else if (axi_rready)                                                
	      begin                                                             
	        axi_rready <= 1'b0;                                             
	      end                                                               
	    // retain the previous value                                        
	  end                                                                   
	                   
	  always @(posedge M_AXI_ACLK)                                    
	  begin                                                                 
	    if (M_AXI_ARESETN == 0)                                            
	      begin  
			rd_data <= 'b0;
		  end
		else if(M_AXI_RVALID)
		 begin
			rd_data <= M_AXI_RDATA;
		 end
		else
			rd_data <= 'b0;
	 end

	//Flag write errors                                                     
	assign read_resp_error = (axi_rready & M_AXI_RVALID & M_AXI_RRESP[1]);  



endmodule

TX查找表

读写操作需要读写寄存器地址和数据表。

module txinitcode_save#(

	parameter integer M_AXI_ADDR_WIDTH	= 32,
    parameter integer M_AXI_DATA_WIDTH	= 32

)(
	input	clk,
	input	rst,
	input	[15:0]	wr_sa_addr,
	input	[15:0]	rd_sa_addr,
	input	sa_enable,
	
	output	reg	[M_AXI_DATA_WIDTH-1 : 0]	initwr_data,
	output	reg	[M_AXI_ADDR_WIDTH-1 : 0]	initwr_addr,
	output	reg	[M_AXI_ADDR_WIDTH-1 : 0]	initrd_addr,
	output	reg		initata_valid

    );

always @(posedge clk)	
	initata_valid <= sa_enable;
	
	
always @(posedge clk)
	if(rst)
		initwr_data <= 32'h0000_0000;
	else
	if(sa_enable)
	begin
		case(wr_sa_addr)
			// 16'd0: initwr_data <= 32'h0000_0000;		//复位 
			16'd0: initwr_data <= 32'h0000_0002;		// AXI4 stream data yes
			16'd1: initwr_data <= 32'h0000_0001;		//扩展多块E = 1
			16'd2: initwr_data <= 32'h0000_0001;		//子类1
			16'd3: initwr_data <= 32'h0000_0001;		//Meta Mode N/A
			16'd4: initwr_data <= 32'h0000_0008;		//通道数
			16'd5: initwr_data <= 32'h0000_0000;		//GT loopback	TEST_MODE
			16'd6: initwr_data <= 32'h0000_0000;		//SYSREF always and ......
			16'd7: initwr_data <= 32'h0000_0000;		//中断NO	
			16'd8: initwr_data <= 32'h0000_0000;		//静止传输 空闲信号 TX断电 TX极性反转 NO lan0
			16'd9: initwr_data <= 32'h0000_0000;		//rx极性反转NO
			16'd10:initwr_data <= 32'h0000_0000;		//lan0
			16'd11:initwr_data <= 32'h0000_0000;		//lan0
			16'd12:initwr_data <= 32'h0000_0000;		
			16'd13:initwr_data <= 32'h0000_0000;
			16'd14:initwr_data <= 32'h0000_0000;
			16'd15:initwr_data <= 32'h0000_0000;
			16'd16:initwr_data <= 32'h0000_0000;
			16'd17:initwr_data <= 32'h0000_0000;
			16'd18:initwr_data <= 32'h0000_0000;
			16'd19:initwr_data <= 32'h0000_0000;
			16'd20:initwr_data <= 32'h0000_0000;
			16'd21:initwr_data <= 32'h0000_0000;
			16'd22:initwr_data <= 32'h0000_0000;
			16'd23:initwr_data <= 32'h0000_0000;
			16'd24:initwr_data <= 32'h0000_0000;
			16'd25:initwr_data <= 32'h0000_0000;
			16'd26:initwr_data <= 32'h0000_0000;
			16'd27:initwr_data <= 32'h0000_0000;
			16'd28:initwr_data <= 32'h0000_0000;
			16'd29:initwr_data <= 32'h0000_0000;
			16'd30:initwr_data <= 32'h0000_0000;
			16'd31:initwr_data <= 32'h0000_0000;
			16'd32:initwr_data <= 32'h0000_0000;
			16'd33:initwr_data <= 32'h0000_0000;
			16'd34:initwr_data <= 32'h0000_0000;
			16'd35:initwr_data <= 32'h0000_0000;
			16'd36:initwr_data <= 32'h0000_0000;
			16'd37:initwr_data <= 32'h0000_0000;
			16'd38:initwr_data <= 32'h0000_0000;
			16'd39:initwr_data <= 32'h0000_0000;
			16'd40:initwr_data <= 32'h0000_0001;		//复位IP
			16'd41:initwr_data <= 32'h0000_0000;		//复位IP
			
			default :  initwr_data <= 'd0;
		endcase
	end

always @(posedge clk)
	if(rst)
		initwr_addr <= 32'h0000_0000;
	else
	if(sa_enable)
	begin
		case(wr_sa_addr)
			// 16'd0: initwr_addr <= 32'h0000_0020;
			16'd0: initwr_addr <= 32'h0000_0024;
			16'd1: initwr_addr <= 32'h0000_0030;
			16'd2: initwr_addr <= 32'h0000_0034;
			16'd3: initwr_addr <= 32'h0000_0038;
			16'd4: initwr_addr <= 32'h0000_0040;
			16'd5: initwr_addr <= 32'h0000_0048;
			16'd6: initwr_addr <= 32'h0000_0050;
			16'd7: initwr_addr <= 32'h0000_0064;
			16'd8: initwr_addr <= 32'h0000_0460;		//lan0
			16'd9: initwr_addr <= 32'h0000_0464;		//lan0
			16'd10:initwr_addr <= 32'h0000_0468;		//lan0
			16'd11:initwr_addr <= 32'h0000_046C;		//lan0
			16'd12:initwr_addr <= 32'h0000_04E0;		//lan1
			16'd13:initwr_addr <= 32'h0000_04E4;		//lan1
			16'd14:initwr_addr <= 32'h0000_04E8;		//lan1
			16'd15:initwr_addr <= 32'h0000_04FC;		//lan1
			16'd16:initwr_addr <= 32'h0000_0560;		//lan2
			16'd17:initwr_addr <= 32'h0000_0564;		//lan2
			16'd18:initwr_addr <= 32'h0000_0568;		//lan2
			16'd19:initwr_addr <= 32'h0000_056C;		//lan2
			16'd20:initwr_addr <= 32'h0000_05E0;		//lan3
			16'd21:initwr_addr <= 32'h0000_05E4;		//lan3
			16'd22:initwr_addr <= 32'h0000_05E8;		//lan3
			16'd23:initwr_addr <= 32'h0000_05EC;		//lan3
			16'd24:initwr_addr <= 32'h0000_0660;		//lan4
			16'd25:initwr_addr <= 32'h0000_0664;     //lan4
			16'd26:initwr_addr <= 32'h0000_0668;     //lan4
			16'd27:initwr_addr <= 32'h0000_066C;     //lan4
			16'd28:initwr_addr <= 32'h0000_06E0;		//lan5
			16'd29:initwr_addr <= 32'h0000_06E4;     //lan5
			16'd30:initwr_addr <= 32'h0000_06E8;     //lan5
			16'd31:initwr_addr <= 32'h0000_06EC;     //lan5
			16'd32:initwr_addr <= 32'h0000_0760;		//lan6
			16'd33:initwr_addr <= 32'h0000_0764;     //lan6
			16'd34:initwr_addr <= 32'h0000_0768;     //lan6
			16'd35:initwr_addr <= 32'h0000_076C;     //lan6
			16'd36:initwr_addr <= 32'h0000_07E0;		//lan7
			16'd37:initwr_addr <= 32'h0000_07E4;     //lan7
			16'd38:initwr_addr <= 32'h0000_07E8;     //lan7
			16'd39:initwr_addr <= 32'h0000_07EC;     //lan7
			16'd40:initwr_addr <= 32'h0000_0020;     		//复位IP
			16'd41:initwr_addr <= 32'h0000_0020;     		//复位IP
			
			default :  initwr_addr <= 'd0;
		endcase
	end
	
	
always @(posedge clk)
	if(rst)
		initrd_addr <= 32'h0000_0000;
	else
	if(sa_enable)
	begin
		case(rd_sa_addr)
			// 16'd0: initwr_addr <= 32'h0000_0020;
			16'd0: initrd_addr <= 32'h0000_0000;
			16'd1: initrd_addr <= 32'h0000_0004;
			16'd2: initrd_addr <= 32'h0000_0020;
			16'd3: initrd_addr <= 32'h0000_0024;
			16'd4: initrd_addr <= 32'h0000_0030;
			16'd5: initrd_addr <= 32'h0000_0034;
			16'd6: initrd_addr <= 32'h0000_0038;
			16'd7: initrd_addr <= 32'h0000_0040;
			16'd8: initrd_addr <= 32'h0000_0048;
			16'd9: initrd_addr <= 32'h0000_0050;
			16'd10:initrd_addr <= 32'h0000_0060;
			16'd11:initrd_addr <= 32'h0000_0064;
			16'd12:initrd_addr <= 32'h0000_0068;
			16'd13:initrd_addr <= 32'h0000_0460;		//lan0
			16'd14:initrd_addr <= 32'h0000_0464;		//lan0
			16'd15:initrd_addr <= 32'h0000_0468;		//lan0
			16'd16:initrd_addr <= 32'h0000_046C;		//lan0
			16'd17:initrd_addr <= 32'h0000_04E0;		//lan1
			16'd18:initrd_addr <= 32'h0000_04E4;		//lan1
			16'd19:initrd_addr <= 32'h0000_04E8;		//lan1
			16'd20:initrd_addr <= 32'h0000_04FC;		//lan1
			16'd21:initrd_addr <= 32'h0000_0560;		//lan2
			16'd22:initrd_addr <= 32'h0000_0564;		//lan2
			16'd23:initrd_addr <= 32'h0000_0568;		//lan2
			16'd24:initrd_addr <= 32'h0000_056C;		//lan2
			16'd25:initrd_addr <= 32'h0000_05E0;		//lan3
			16'd26:initrd_addr <= 32'h0000_05E4;		//lan3
			16'd27:initrd_addr <= 32'h0000_05E8;		//lan3
			16'd28:initrd_addr <= 32'h0000_05EC;		//lan3
			16'd29:initrd_addr <= 32'h0000_0660;		//lan4
			16'd30:initrd_addr <= 32'h0000_0664;     //lan4
			16'd31:initrd_addr <= 32'h0000_0668;     //lan4
			16'd32:initrd_addr <= 32'h0000_066C;     //lan4
			16'd33:initrd_addr <= 32'h0000_06E0;		//lan5
			16'd34:initrd_addr <= 32'h0000_06E4;     //lan5
			16'd35:initrd_addr <= 32'h0000_06E8;     //lan5
			16'd36:initrd_addr <= 32'h0000_06EC;     //lan5
			16'd37:initrd_addr <= 32'h0000_0760;		//lan6
			16'd38:initrd_addr <= 32'h0000_0764;     //lan6
			16'd39:initrd_addr <= 32'h0000_0768;     //lan6
			16'd40:initrd_addr <= 32'h0000_076C;     //lan6
			16'd41:initrd_addr <= 32'h0000_07E0;		//lan7
			16'd42:initrd_addr <= 32'h0000_07E4;     //lan7
			16'd43:initrd_addr <= 32'h0000_07E8;     //lan7
			16'd44:initrd_addr <= 32'h0000_07EC;     //lan7
			16'd45:initrd_addr <= 32'h0000_0020;     		//复位IP
			
			default :  initrd_addr <= 'd0;
		endcase
	end
		

	
	
endmodule

TX JESD204CIP核文件

`timescale 1ns / 1ps
module jesd204_tx_core(

	input tx_core_reset	,
	input tx_core_clk 	,
	input tx_sysref   	,
	input axi_clk 		,
	input rst_n			,
	input [511 : 0] tx_tdata,
	input [255 : 0] tx_cmd_tdata,
	input tx_cmd_tvalid,

	input	refclk	,
	input	drpclk	,

	output 	tx_aresetn	,
	output	tx_tready	,
	output	tx_soemb	,
	output  [7 : 0] txp_out	,
    output  [7 : 0] txn_out ,

	input wire [11 : 0] s_axi_awaddr	,	
	input wire s_axi_awvalid            ,
	output wire s_axi_awready           ,
	input wire [31 : 0] s_axi_wdata     ,
	input wire [3 : 0] s_axi_wstrb      ,
	input wire s_axi_wvalid             ,
	output wire s_axi_wready            ,
	output wire [1 : 0] s_axi_bresp     ,
	output wire s_axi_bvalid            ,
	input wire s_axi_bready             ,
	input wire [11 : 0] s_axi_araddr    ,
	input wire s_axi_arvalid            ,
	output wire s_axi_arready           ,
	output wire [31 : 0] s_axi_rdata    ,
	output wire [1 : 0] s_axi_rresp     ,
	output wire s_axi_rvalid            ,
	input wire s_axi_rready             
	
    );
	
wire [63 : 0] gt0_txdata        ;
wire [3 : 0] gt0_txcharisk      ;
wire [1 : 0] gt0_txheader       ;
wire [63 : 0] gt1_txdata        ;
wire [3 : 0] gt1_txcharisk      ;
wire [1 : 0] gt1_txheader       ;
wire [63 : 0] gt2_txdata        ;
wire [3 : 0] gt2_txcharisk      ;
wire [1 : 0] gt2_txheader       ;
wire [63 : 0] gt3_txdata        ;
wire [3 : 0] gt3_txcharisk      ;
wire [1 : 0] gt3_txheader       ;
wire [63 : 0] gt4_txdata        ;
wire [3 : 0] gt4_txcharisk      ;
wire [1 : 0] gt4_txheader       ;
wire [63 : 0] gt5_txdata        ;
wire [3 : 0] gt5_txcharisk      ;
wire [1 : 0] gt5_txheader       ;
wire [63 : 0] gt6_txdata        ;
wire [3 : 0] gt6_txcharisk      ;
wire [1 : 0] gt6_txheader       ;
wire [63 : 0] gt7_txdata        ;
wire [3 : 0] gt7_txcharisk      ;
wire [1 : 0] gt7_txheader       ;
wire tx_reset_gt				;
wire tx_reset_done				;
wire tx_cmd_tready					;
wire irq						;
wire gt_powergood						;
	
	
jesd204c_0 	jesd204c_0_inst (			
  .s_axi_aclk(axi_clk),        // input wire s_axi_aclk
  .s_axi_aresetn(rst_n),  // input wire s_axi_aresetn								
  .s_axi_awaddr(s_axi_awaddr),    // input wire [11 : 0] s_axi_awaddr
  .s_axi_awvalid(s_axi_awvalid),  // input wire s_axi_awvalid
  .s_axi_awready(s_axi_awready),  // output wire s_axi_awready
  .s_axi_wdata(s_axi_wdata),      // input wire [31 : 0] s_axi_wdata
  .s_axi_wstrb(s_axi_wstrb),      // input wire [3 : 0] s_axi_wstrb
  .s_axi_wvalid(s_axi_wvalid),    // input wire s_axi_wvalid
  .s_axi_wready(s_axi_wready),    // output wire s_axi_wready
  .s_axi_bresp(s_axi_bresp),      // output wire [1 : 0] s_axi_bresp
  .s_axi_bvalid(s_axi_bvalid),    // output wire s_axi_bvalid
  .s_axi_bready(s_axi_bready),    // input wire s_axi_bready
  .s_axi_araddr(s_axi_araddr),    // input wire [11 : 0] s_axi_araddr
  .s_axi_arvalid(s_axi_arvalid),  // input wire s_axi_arvalid
  .s_axi_arready(s_axi_arready),  // output wire s_axi_arready
  .s_axi_rdata(s_axi_rdata),      // output wire [31 : 0] s_axi_rdata
  .s_axi_rresp(s_axi_rresp),      // output wire [1 : 0] s_axi_rresp
  .s_axi_rvalid(s_axi_rvalid),    // output wire s_axi_rvalid
  .s_axi_rready(s_axi_rready),    // input wire s_axi_rready
  .tx_core_clk(tx_core_clk),      // input wire tx_core_clk
  .tx_core_reset(tx_core_reset ||(~rst_n)),  // input wire tx_core_reset
  .tx_sysref(tx_sysref),          // input wire tx_sysref
  .irq(irq),                      // output wire irq
  .tx_tdata(tx_tdata),            // input wire [511 : 0] tx_tdata
  .tx_tready(tx_tready),          // output wire tx_tready
  .tx_aresetn(tx_aresetn),        // output wire tx_aresetn
  .tx_soemb(tx_soemb),            // output wire tx_soemb
  .tx_cmd_tdata(tx_cmd_tdata),    // input wire [255 : 0] tx_cmd_tdata
  .tx_cmd_tvalid(tx_cmd_tvalid),  // input wire tx_cmd_tvalid
  .tx_cmd_tready(tx_cmd_tready),  // output wire tx_cmd_tready
  .tx_reset_gt(tx_reset_gt),      // output wire tx_reset_gt
  .tx_reset_done(tx_reset_done),  // input wire tx_reset_done
  .gt0_txdata(gt0_txdata),        // output wire [63 : 0] gt0_txdata
  .gt0_txcharisk(gt0_txcharisk),  // output wire [3 : 0] gt0_txcharisk
  .gt0_txheader(gt0_txheader),    // output wire [1 : 0] gt0_txheader
  .gt1_txdata(gt1_txdata),        // output wire [63 : 0] gt1_txdata
  .gt1_txcharisk(gt1_txcharisk),  // output wire [3 : 0] gt1_txcharisk
  .gt1_txheader(gt1_txheader),    // output wire [1 : 0] gt1_txheader
  .gt2_txdata(gt2_txdata),        // output wire [63 : 0] gt2_txdata
  .gt2_txcharisk(gt2_txcharisk),  // output wire [3 : 0] gt2_txcharisk
  .gt2_txheader(gt2_txheader),    // output wire [1 : 0] gt2_txheader
  .gt3_txdata(gt3_txdata),        // output wire [63 : 0] gt3_txdata
  .gt3_txcharisk(gt3_txcharisk),  // output wire [3 : 0] gt3_txcharisk
  .gt3_txheader(gt3_txheader),    // output wire [1 : 0] gt3_txheader
  .gt4_txdata(gt4_txdata),        // output wire [63 : 0] gt4_txdata
  .gt4_txcharisk(gt4_txcharisk),  // output wire [3 : 0] gt4_txcharisk
  .gt4_txheader(gt4_txheader),    // output wire [1 : 0] gt4_txheader
  .gt5_txdata(gt5_txdata),        // output wire [63 : 0] gt5_txdata
  .gt5_txcharisk(gt5_txcharisk),  // output wire [3 : 0] gt5_txcharisk
  .gt5_txheader(gt5_txheader),    // output wire [1 : 0] gt5_txheader
  .gt6_txdata(gt6_txdata),        // output wire [63 : 0] gt6_txdata
  .gt6_txcharisk(gt6_txcharisk),  // output wire [3 : 0] gt6_txcharisk
  .gt6_txheader(gt6_txheader),    // output wire [1 : 0] gt6_txheader
  .gt7_txdata(gt7_txdata),        // output wire [63 : 0] gt7_txdata
  .gt7_txcharisk(gt7_txcharisk),  // output wire [3 : 0] gt7_txcharisk
  .gt7_txheader(gt7_txheader)    // output  wire [1 : 0] gt7_txheader
);
	
jesd204_phy_0 	jesd204_phy_0_inst (
  .qpll0_refclk(refclk),                          // input wire qpll0_refclk
  .drpclk(drpclk),                                      // input wire drpclk
  .tx_reset_gt(tx_reset_gt),                            // input wire tx_reset_gt
  .rx_reset_gt(tx_reset_gt),                            // input wire rx_reset_gt
  .tx_sys_reset(~rst_n),                          // input wire tx_sys_reset
  .rx_sys_reset(~rst_n),                          // input wire rx_sys_reset
  .txp_out(txp_out),                                    // output wire [7 : 0] txp_out
  .txn_out(txn_out),                                    // output wire [7 : 0] txn_out
  .rxp_in(8'b0),                                      // input wire [7 : 0] rxp_in
  .rxn_in(8'b0),                                      // input wire [7 : 0] rxn_in
  .tx_core_clk(tx_core_clk),                            // input wire tx_core_clk
  .rx_core_clk(tx_core_clk),                            // input wire rx_core_clk
  .txoutclk(),                                  // output wire txoutclk
  .rxoutclk(),                                  // output wire rxoutclk
  .gt0_txdata(gt0_txdata),                              // input wire [63 : 0] gt0_txdata
  .gt0_txcharisk(gt0_txcharisk),                        // input wire [3 : 0] gt0_txcharisk
  .gt0_txheader(gt0_txheader),                          // input wire [1 : 0] gt0_txheader
  .gt1_txdata(gt1_txdata),                              // input wire [63 : 0] gt1_txdata
  .gt1_txcharisk(gt1_txcharisk),                        // input wire [3 : 0] gt1_txcharisk
  .gt1_txheader(gt1_txheader),                          // input wire [1 : 0] gt1_txheader
  .gt2_txdata(gt2_txdata),                              // input wire [63 : 0] gt2_txdata
  .gt2_txcharisk(gt2_txcharisk),                        // input wire [3 : 0] gt2_txcharisk
  .gt2_txheader(gt2_txheader),                          // input wire [1 : 0] gt2_txheader
  .gt3_txdata(gt3_txdata),                              // input wire [63 : 0] gt3_txdata
  .gt3_txcharisk(gt3_txcharisk),                        // input wire [3 : 0] gt3_txcharisk
  .gt3_txheader(gt3_txheader),                          // input wire [1 : 0] gt3_txheader
  .gt4_txdata(gt4_txdata),                              // input wire [63 : 0] gt4_txdata
  .gt4_txcharisk(gt4_txcharisk),                        // input wire [3 : 0] gt4_txcharisk
  .gt4_txheader(gt4_txheader),                          // input wire [1 : 0] gt4_txheader
  .gt5_txdata(gt5_txdata),                              // input wire [63 : 0] gt5_txdata
  .gt5_txcharisk(gt5_txcharisk),                        // input wire [3 : 0] gt5_txcharisk
  .gt5_txheader(gt5_txheader),                          // input wire [1 : 0] gt5_txheader
  .gt6_txdata(gt6_txdata),                              // input wire [63 : 0] gt6_txdata
  .gt6_txcharisk(gt6_txcharisk),                        // input wire [3 : 0] gt6_txcharisk
  .gt6_txheader(gt6_txheader),                          // input wire [1 : 0] gt6_txheader
  .gt7_txdata(gt7_txdata),                              // input wire [63 : 0] gt7_txdata
  .gt7_txcharisk(gt7_txcharisk),                        // input wire [3 : 0] gt7_txcharisk
  .gt7_txheader(gt7_txheader),                          // input wire [1 : 0] gt7_txheader
  .tx_reset_done(tx_reset_done),                        // output wire tx_reset_done
  .gt_powergood(gt_powergood),                          // output wire gt_powergood
  .gt0_rxdata(),                              // output wire [63 : 0] gt0_rxdata
  .gt0_rxcharisk(),                        // output wire [3 : 0] gt0_rxcharisk
  .gt0_rxdisperr(),                        // output wire [3 : 0] gt0_rxdisperr
  .gt0_rxnotintable(),                  // output wire [3 : 0] gt0_rxnotintable
  .gt0_rxheader(),                          // output wire [1 : 0] gt0_rxheader
  .gt0_rxmisalign(),                      // output wire gt0_rxmisalign
  .gt0_rxblock_sync(),                  // output wire gt0_rxblock_sync
  .gt1_rxdata(),                              // output wire [63 : 0] gt1_rxdata
  .gt1_rxcharisk(),                        // output wire [3 : 0] gt1_rxcharisk
  .gt1_rxdisperr(),                        // output wire [3 : 0] gt1_rxdisperr
  .gt1_rxnotintable(),                  // output wire [3 : 0] gt1_rxnotintable
  .gt1_rxheader(),                          // output wire [1 : 0] gt1_rxheader
  .gt1_rxmisalign(),                      // output wire gt1_rxmisalign
  .gt1_rxblock_sync(),                  // output wire gt1_rxblock_sync
  .gt2_rxdata(),                              // output wire [63 : 0] gt2_rxdata
  .gt2_rxcharisk(),                        // output wire [3 : 0] gt2_rxcharisk
  .gt2_rxdisperr(),                        // output wire [3 : 0] gt2_rxdisperr
  .gt2_rxnotintable(),                  // output wire [3 : 0] gt2_rxnotintable
  .gt2_rxheader(),                          // output wire [1 : 0] gt2_rxheader
  .gt2_rxmisalign(),                      // output wire gt2_rxmisalign
  .gt2_rxblock_sync(),                  // output wire gt2_rxblock_sync
  .gt3_rxdata(),                              // output wire [63 : 0] gt3_rxdata
  .gt3_rxcharisk(),                        // output wire [3 : 0] gt3_rxcharisk
  .gt3_rxdisperr(),                        // output wire [3 : 0] gt3_rxdisperr
  .gt3_rxnotintable(),                  // output wire [3 : 0] gt3_rxnotintable
  .gt3_rxheader(),                          // output wire [1 : 0] gt3_rxheader
  .gt3_rxmisalign(),                      // output wire gt3_rxmisalign
  .gt3_rxblock_sync(),                  // output wire gt3_rxblock_sync
  .gt4_rxdata(),                              // output wire [63 : 0] gt4_rxdata
  .gt4_rxcharisk(),                        // output wire [3 : 0] gt4_rxcharisk
  .gt4_rxdisperr(),                        // output wire [3 : 0] gt4_rxdisperr
  .gt4_rxnotintable(),                  // output wire [3 : 0] gt4_rxnotintable
  .gt4_rxheader(),                          // output wire [1 : 0] gt4_rxheader
  .gt4_rxmisalign(),                      // output wire gt4_rxmisalign
  .gt4_rxblock_sync(),                  // output wire gt4_rxblock_sync
  .gt5_rxdata(),                              // output wire [63 : 0] gt5_rxdata
  .gt5_rxcharisk(),                        // output wire [3 : 0] gt5_rxcharisk
  .gt5_rxdisperr(),                        // output wire [3 : 0] gt5_rxdisperr
  .gt5_rxnotintable(),                  // output wire [3 : 0] gt5_rxnotintable
  .gt5_rxheader(),                          // output wire [1 : 0] gt5_rxheader
  .gt5_rxmisalign(),                      // output wire gt5_rxmisalign
  .gt5_rxblock_sync(),                  // output wire gt5_rxblock_sync
  .gt6_rxdata(),                              // output wire [63 : 0] gt6_rxdata
  .gt6_rxcharisk(),                        // output wire [3 : 0] gt6_rxcharisk
  .gt6_rxdisperr(),                        // output wire [3 : 0] gt6_rxdisperr
  .gt6_rxnotintable(),                  // output wire [3 : 0] gt6_rxnotintable
  .gt6_rxheader(),                          // output wire [1 : 0] gt6_rxheader
  .gt6_rxmisalign(),                      // output wire gt6_rxmisalign
  .gt6_rxblock_sync(),                  // output wire gt6_rxblock_sync
  .gt7_rxdata(),                              // output wire [63 : 0] gt7_rxdata
  .gt7_rxcharisk(),                        // output wire [3 : 0] gt7_rxcharisk
  .gt7_rxdisperr(),                        // output wire [3 : 0] gt7_rxdisperr
  .gt7_rxnotintable(),                  // output wire [3 : 0] gt7_rxnotintable
  .gt7_rxheader(),                          // output wire [1 : 0] gt7_rxheader
  .gt7_rxmisalign(),                      // output wire gt7_rxmisalign
  .gt7_rxblock_sync(),                  // output wire gt7_rxblock_sync
  .rx_reset_done(),                        // output wire rx_reset_done
  .common0_qpll0_clk_out(),        // output wire common0_qpll0_clk_out
  .common0_qpll0_refclk_out(),  // output wire common0_qpll0_refclk_out
  .common0_qpll0_lock_out(),      // output wire common0_qpll0_lock_out
  .common1_qpll0_clk_out(),        // output wire common1_qpll0_clk_out
  .common1_qpll0_refclk_out(),  // output wire common1_qpll0_refclk_out
  .common1_qpll0_lock_out()      // output wire common1_qpll0_lock_out
);
	
endmodule

TX初始化顶层文件


module rxjesd_init #(
		parameter integer C_M_AXI_ADDR_WIDTH	= 32,
		parameter integer C_M_AXI_DATA_WIDTH	= 32
    )
	(
	
		input	clk,
		input   rst,
		
		input	rx_wr_op		,
		input	rx_rd_op		,
		input [15:0] rx_wrsa_addr ,
		input [15:0] rx_rdsa_addr ,
		output	rx_wr_done		,
		output	[C_M_AXI_DATA_WIDTH-1 : 0] rx_rd_data		,
		
		output rx_idle_signal,
		output inter_error,

	
		///写地址通道
		output  [C_M_AXI_ADDR_WIDTH-1 : 0] M_AXI_AWADDR,
		output  [2 : 0] M_AXI_AWPROT,
		output   M_AXI_AWVALID,
		input    M_AXI_AWREADY,
	
		// 写数据通道
		output  [C_M_AXI_DATA_WIDTH-1 : 0] M_AXI_WDATA,
		output  [C_M_AXI_DATA_WIDTH/8-1 : 0] M_AXI_WSTRB,	
		output   M_AXI_WVALID,
		input    M_AXI_WREADY,
		
		//写响应通道 表示写传输状态0
		input  [1 : 0] M_AXI_BRESP,
		input   M_AXI_BVALID,
		output  M_AXI_BREADY,
		
		//读地址通道
		output  [C_M_AXI_ADDR_WIDTH-1 : 0] M_AXI_ARADDR,
		output  [2 : 0] M_AXI_ARPROT,
		output   M_AXI_ARVALID,
		input    M_AXI_ARREADY,
		
		// 读数据通道
		input  [C_M_AXI_DATA_WIDTH-1 : 0] M_AXI_RDATA,
		input  [1 : 0] M_AXI_RRESP,
		input   M_AXI_RVALID,
		output  M_AXI_RREADY	
	
	);
	

wire	[C_M_AXI_DATA_WIDTH-1 : 0] wr_data;
wire	[C_M_AXI_DATA_WIDTH-1 : 0] rd_data;
wire	[C_M_AXI_ADDR_WIDTH-1 : 0] wr_addr;
wire	[C_M_AXI_ADDR_WIDTH-1 : 0] rd_addr;
wire	waddate_valid;
wire	wr_ok;
wire	rdaddr_valid;
wire	rdata_valid;
	
	
JESD204_RxInitcode#(
	.M_AXI_ADDR_WIDTH(C_M_AXI_ADDR_WIDTH),
    .M_AXI_DATA_WIDTH(C_M_AXI_DATA_WIDTH)
)
JESD204_RxInitcode_inst(
	.rst			(rst),
	.clk			(clk),
	.wr_op			(rx_wr_op),
	.rx_wrsa_addr	(rx_wrsa_addr),
	
	.rd_op			(rx_rd_op),
	.rx_rdsa_addr	(rx_rdsa_addr),
	.wr_done		(rx_wr_done),
	.rx_rd_data		(rx_rd_data),

	
	
	.wr_data		(wr_data),
	.wr_addr		(wr_addr),
	.waddate_valid	(waddate_valid),
	.wr_ok			(wr_ok),
	               
	.rd_addr		(rd_addr),
	.rdaddr_valid	(rdaddr_valid),
	              
	.rd_data		(rd_data),
	.rdata_valid	(rdata_valid),
		           
	.idle_signal	(rx_idle_signal)
	

    );	
	
	
JESD204_Interface_Axi  #
	(
		.C_M_AXI_ADDR_WIDTH(C_M_AXI_ADDR_WIDTH),
		.C_M_AXI_DATA_WIDTH(C_M_AXI_DATA_WIDTH)
		
	)JESD204_Interface_Axi_inst(
		.wr_addr			(wr_addr),
		.wr_data			(wr_data),
		.waddate_valid		(waddate_valid),
		//wr ack  one clock cycle
		.wr_ok				(wr_ok),
		//rd address channel
		.rd_addr			(rd_addr),
		.rdaddr_valid		(rdaddr_valid),
		//rd data channel	
		.rd_data			(rd_data),
		.rdata_valid		(rdata_valid),		//one clock cycle
			                
		.error_reg			(inter_error),
		                    
		.M_AXI_ACLK			(clk),
		.M_AXI_ARESETN		(~rst),
		
		///写地址通道
		.M_AXI_AWADDR		(M_AXI_AWADDR),
		.M_AXI_AWPROT		(M_AXI_AWPROT),
		.M_AXI_AWVALID		(M_AXI_AWVALID),
		.M_AXI_AWREADY		(M_AXI_AWREADY),
		// 写数据通道       
		.M_AXI_WDATA		(M_AXI_WDATA),
		.M_AXI_WSTRB		(M_AXI_WSTRB),	
		.M_AXI_WVALID		(M_AXI_WVALID),
		.M_AXI_WREADY		(M_AXI_WREADY),
		//写响应通道 表示写传输状态0
		.M_AXI_BRESP		(M_AXI_BRESP),
		.M_AXI_BVALID		(M_AXI_BVALID),
		.M_AXI_BREADY		(M_AXI_BREADY),
		//读地址通道        
		.M_AXI_ARADDR		(M_AXI_ARADDR),
		.M_AXI_ARPROT		(M_AXI_ARPROT),
		.M_AXI_ARVALID		(M_AXI_ARVALID),
		.M_AXI_ARREADY		(M_AXI_ARREADY),	
		// 读数据通道       
		.M_AXI_RDATA		(M_AXI_RDATA),
		.M_AXI_RRESP		(M_AXI_RRESP),
		.M_AXI_RVALID		(M_AXI_RVALID),
		.M_AXI_RREADY       (M_AXI_RREADY)
	);
endmodule

RX查找表

RX初始化主状态机、初始化顶层文件、AXI接口转化与TX一致,这里不在赘述。

module rxinitcode_save#(

	parameter integer M_AXI_ADDR_WIDTH	= 32,
    parameter integer M_AXI_DATA_WIDTH	= 32

)(
	input	clk,
	input	rst,
	input	[15:0]	wr_sa_addr,
	input	[15:0]	rd_sa_addr,
	input	sa_enable,
	
	output	reg	[M_AXI_DATA_WIDTH-1 : 0]	initwr_data,
	output	reg	[M_AXI_ADDR_WIDTH-1 : 0]	initwr_addr,
	output	reg	[M_AXI_ADDR_WIDTH-1 : 0]	initrd_addr,
	output	reg		initata_valid

    );

always @(posedge clk)	
	initata_valid <= sa_enable;
	
	
always @(posedge clk)
	if(rst)
		initwr_data <= 32'h0000_0000;
	else
	if(sa_enable)
	begin
		case(wr_sa_addr)
			// 16'd0: initwr_data <= 32'h0000_0000;		//复位 
			16'd0 :initwr_data <= 32'h0000_0002;		// AXI4 stream data yes
			16'd1 :initwr_data <= 32'h0000_0001;		//扩展多块E = 1
			16'd2 :initwr_data <= 32'h0000_0001;		//子类1
			16'd3 :initwr_data <= 32'h0000_0001;		//Meta Mode N/A
			16'd4 :initwr_data <= 32'h0000_0008;		//通道数
			16'd5 :initwr_data <= 32'h0000_0000;		//no release receiver buffer	
			16'd6 :initwr_data <= 32'h0000_0000;		//GT loopback	TEST_MODE
			16'd7 :initwr_data <= 32'h0000_0000;		//MB 需要多少正确/不正确的多块对齐标记才能实现/丢失多块。实际使用的值是1加上此寄存器中的数字。
			16'd8 :initwr_data <= 32'h0000_0000;		//SYSREF always and ......
			16'd9 :initwr_data <= 32'h0000_0000;		//中断NO	
			16'd10:initwr_data <= 32'h0000_0000;		//静止传输 空闲信号 TX断电 TX极性反转 NO lan0
			16'd11:initwr_data <= 32'h0000_0000;		//rx极性反转NO
			16'd12:initwr_data <= 32'h0000_0000;		//lan0
			16'd13:initwr_data <= 32'h0000_0000;		//lan0
			16'd14:initwr_data <= 32'h0000_0000;		
			16'd15:initwr_data <= 32'h0000_0000;
			16'd16:initwr_data <= 32'h0000_0000;
			16'd17:initwr_data <= 32'h0000_0000;
			16'd18:initwr_data <= 32'h0000_0000;
			16'd19:initwr_data <= 32'h0000_0000;
			16'd20:initwr_data <= 32'h0000_0000;
			16'd21:initwr_data <= 32'h0000_0000;
			16'd22:initwr_data <= 32'h0000_0000;
			16'd23:initwr_data <= 32'h0000_0000;
			16'd24:initwr_data <= 32'h0000_0000;
			16'd25:initwr_data <= 32'h0000_0000;
			16'd26:initwr_data <= 32'h0000_0000;
			16'd27:initwr_data <= 32'h0000_0000;
			16'd28:initwr_data <= 32'h0000_0000;
			16'd29:initwr_data <= 32'h0000_0000;
			16'd30:initwr_data <= 32'h0000_0000;
			16'd31:initwr_data <= 32'h0000_0000;
			16'd32:initwr_data <= 32'h0000_0000;
			16'd33:initwr_data <= 32'h0000_0000;
			16'd34:initwr_data <= 32'h0000_0000;
			16'd35:initwr_data <= 32'h0000_0000;
			16'd36:initwr_data <= 32'h0000_0000;
			16'd37:initwr_data <= 32'h0000_0000;
			16'd38:initwr_data <= 32'h0000_0000;
			16'd39:initwr_data <= 32'h0000_0000;
			16'd40:initwr_data <= 32'h0000_0000;
			16'd41:initwr_data <= 32'h0000_0000;
			16'd42:initwr_data <= 32'h0000_0001;		//复位IP
			16'd43:initwr_data <= 32'h0000_0000;		//复位IP
			default :  initwr_data <= 'd0;
		endcase
	end
	

always @(posedge clk)
	if(rst)
		initwr_addr <= 32'h0000_0000;
	else
	if(sa_enable)
	begin
		case(wr_sa_addr)
			// 16'd0: initwr_addr <= 32'h0000_0020;
			16'd0 :initwr_addr <= 32'h0000_0024;
			16'd1 :initwr_addr <= 32'h0000_0030;
			16'd2 :initwr_addr <= 32'h0000_0034;
			16'd3 :initwr_addr <= 32'h0000_0038;
			16'd4 :initwr_addr <= 32'h0000_0040;
			16'd5 :initwr_addr <= 32'h0000_0044;
			16'd6 :initwr_addr <= 32'h0000_0048;
			16'd7 :initwr_addr <= 32'h0000_004C;
			16'd8 :initwr_addr <= 32'h0000_0050;
			16'd9 :initwr_addr <= 32'h0000_0064;
			16'd10:initwr_addr <= 32'h0000_0460;		//lan0
			16'd11:initwr_addr <= 32'h0000_0464;		//lan0
			16'd12:initwr_addr <= 32'h0000_0468;		//lan0
			16'd13:initwr_addr <= 32'h0000_046C;		//lan0
			16'd14:initwr_addr <= 32'h0000_04E0;		//lan1
			16'd15:initwr_addr <= 32'h0000_04E4;		//lan1
			16'd16:initwr_addr <= 32'h0000_04E8;		//lan1
			16'd17:initwr_addr <= 32'h0000_04FC;		//lan1
			16'd18:initwr_addr <= 32'h0000_0560;		//lan2
			16'd19:initwr_addr <= 32'h0000_0564;		//lan2
			16'd20:initwr_addr <= 32'h0000_0568;		//lan2
			16'd21:initwr_addr <= 32'h0000_056C;		//lan2
			16'd22:initwr_addr <= 32'h0000_05E0;		//lan3
			16'd23:initwr_addr <= 32'h0000_05E4;		//lan3
			16'd24:initwr_addr <= 32'h0000_05E8;		//lan3
			16'd25:initwr_addr <= 32'h0000_05EC;		//lan3
			16'd26:initwr_addr <= 32'h0000_0660;		//lan4
			16'd27:initwr_addr <= 32'h0000_0664;     //lan4
			16'd28:initwr_addr <= 32'h0000_0668;     //lan4
			16'd29:initwr_addr <= 32'h0000_066C;     //lan4
			16'd30:initwr_addr <= 32'h0000_06E0;		//lan5
			16'd31:initwr_addr <= 32'h0000_06E4;     //lan5
			16'd32:initwr_addr <= 32'h0000_06E8;     //lan5
			16'd33:initwr_addr <= 32'h0000_06EC;     //lan5
			16'd34:initwr_addr <= 32'h0000_0760;		//lan6
			16'd35:initwr_addr <= 32'h0000_0764;     //lan6
			16'd36:initwr_addr <= 32'h0000_0768;     //lan6
			16'd37:initwr_addr <= 32'h0000_076C;     //lan6
			16'd38:initwr_addr <= 32'h0000_07E0;		//lan7
			16'd39:initwr_addr <= 32'h0000_07E4;     //lan7
			16'd40:initwr_addr <= 32'h0000_07E8;     //lan7
			16'd41:initwr_addr <= 32'h0000_07EC;     //lan7
			16'd42:initwr_addr <= 32'h0000_0020;     		//复位IP
			16'd43:initwr_addr <= 32'h0000_0020;     		//复位IP
			    
			default :  initwr_addr <= 'd0;
		endcase
	end
	
	
always @(posedge clk)
	if(rst)
		initrd_addr <= 32'h0000_0000;
	else
	if(sa_enable)
	begin
		case(rd_sa_addr)
			// 16'd0: initwr_addr <= 32'h0000_0020;
			16'd0 :initrd_addr <= 32'h0000_0000;
			16'd1 :initrd_addr <= 32'h0000_0004;
			16'd2 :initrd_addr <= 32'h0000_0020;
			16'd3 :initrd_addr <= 32'h0000_0024;
			16'd4 :initrd_addr <= 32'h0000_0030;
			16'd5 :initrd_addr <= 32'h0000_0034;
			16'd6 :initrd_addr <= 32'h0000_0038;
			16'd7 :initrd_addr <= 32'h0000_0040;
			16'd8 :initrd_addr <= 32'h0000_0044;
			16'd9 :initrd_addr <= 32'h0000_0048;
			16'd10:initrd_addr <= 32'h0000_004C;
			16'd11:initrd_addr <= 32'h0000_0050;
			16'd12:initrd_addr <= 32'h0000_0054;
			16'd13:initrd_addr <= 32'h0000_0060;
			16'd14:initrd_addr <= 32'h0000_0064;
			16'd15:initrd_addr <= 32'h0000_0068;
			16'd16:initrd_addr <= 32'h0000_0400;		//lan0
			16'd17:initrd_addr <= 32'h0000_0410;        //lan0
			16'd18:initrd_addr <= 32'h0000_0414;        //lan0
			16'd19:initrd_addr <= 32'h0000_0460;		//lan0
			16'd20:initrd_addr <= 32'h0000_0464;		//lan0
			16'd21:initrd_addr <= 32'h0000_0468;		//lan0
			16'd22:initrd_addr <= 32'h0000_046C;		//lan0
			16'd23:initrd_addr <= 32'h0000_0480;		//lan1
			16'd24:initrd_addr <= 32'h0000_0490;		//lan1
			16'd25:initrd_addr <= 32'h0000_0494;		//lan1
			16'd26:initrd_addr <= 32'h0000_04E0;		//lan1
			16'd27:initrd_addr <= 32'h0000_04E4;		//lan1
			16'd28:initrd_addr <= 32'h0000_04E8;		//lan1
			16'd29:initrd_addr <= 32'h0000_04FC;		//lan1	
			16'd30:initrd_addr <= 32'h0000_0500;		//lan2
			16'd31:initrd_addr <= 32'h0000_0510;		//lan2
			16'd32:initrd_addr <= 32'h0000_0514;		//lan2
			16'd33:initrd_addr <= 32'h0000_0560;		//lan2
			16'd34:initrd_addr <= 32'h0000_0564;		//lan2
			16'd35:initrd_addr <= 32'h0000_0568;		//lan2
			16'd36:initrd_addr <= 32'h0000_056C;		//lan2
			16'd37:initrd_addr <= 32'h0000_0580;		//lan3
			16'd38:initrd_addr <= 32'h0000_0590;		//lan3
			16'd39:initrd_addr <= 32'h0000_0594;		//lan3
			16'd40:initrd_addr <= 32'h0000_05E0;		//lan3
			16'd41:initrd_addr <= 32'h0000_05E4;		//lan3
			16'd42:initrd_addr <= 32'h0000_05E8;		//lan3
			16'd43:initrd_addr <= 32'h0000_05EC;		//lan3
			16'd44:initrd_addr <= 32'h0000_0600;		//lan4
			16'd45:initrd_addr <= 32'h0000_0610;		//lan4
			16'd46:initrd_addr <= 32'h0000_0614;		//lan4
			16'd47:initrd_addr <= 32'h0000_0660;		//lan4
			16'd48:initrd_addr <= 32'h0000_0664;     //lan4
			16'd49:initrd_addr <= 32'h0000_0668;     //lan4
			16'd50:initrd_addr <= 32'h0000_066C;     //lan4
			16'd51:initrd_addr <= 32'h0000_0680;		//lan5
			16'd52:initrd_addr <= 32'h0000_0690;		//lan5
			16'd53:initrd_addr <= 32'h0000_0694;		//lan5
			16'd54:initrd_addr <= 32'h0000_06E0;		//lan5
			16'd55:initrd_addr <= 32'h0000_06E4;     //lan5
			16'd56:initrd_addr <= 32'h0000_06E8;     //lan5
			16'd57:initrd_addr <= 32'h0000_06EC;     //lan5
			16'd58:initrd_addr <= 32'h0000_0700;		//lan6
			16'd59:initrd_addr <= 32'h0000_0710;		//lan6
			16'd60:initrd_addr <= 32'h0000_0714;		//lan6
			16'd61:initrd_addr <= 32'h0000_0760;		//lan6
			16'd62:initrd_addr <= 32'h0000_0764;     //lan6
			16'd63:initrd_addr <= 32'h0000_0768;     //lan6
			16'd64:initrd_addr <= 32'h0000_076C;     //lan6
			16'd65:initrd_addr <= 32'h0000_0780;		//lan7
			16'd66:initrd_addr <= 32'h0000_0790;		//lan7
			16'd67:initrd_addr <= 32'h0000_0794;		//lan7
			16'd68:initrd_addr <= 32'h0000_07E0;		//lan7
			16'd69:initrd_addr <= 32'h0000_07E4;     //lan7
			16'd70:initrd_addr <= 32'h0000_07E8;     //lan7
			16'd71:initrd_addr <= 32'h0000_07EC;     //lan7
			16'd72:initrd_addr <= 32'h0000_0020;     		//复位IP
			
			default :  initrd_addr <= 'd0;
		endcase
	end
endmodule

RX JESD204CIP文件

`timescale 1ns / 1ps
module jesd204c_rx_core(
input		rx_sysref				,
input		rx_core_clk				,
input		axi_clk					,
input		rst_n					,



input					refclk		,
input					drpclk		,


output	[511 : 0] rx_tdata			,
output	rx_tvalid                   ,
output	rx_aresetn                  ,
output	rx_soemb                    ,
output	rx_crc_err                  ,
output	rx_emb_err                  ,
output	[255 : 0] rx_cmd_tdata      ,
output	rx_cmd_tvalid               ,
output	[7 : 0] rx_cmd_tuser        ,
input	rx_cmd_tready               ,


input			[7 : 0] rxp_in		,
input			[7 : 0] rxn_in		,


input wire [11 : 0] s_axi_awaddr        ,
input wire s_axi_awvalid                ,
output wire s_axi_awready               ,
input wire [31 : 0] s_axi_wdata         ,
input wire [3 : 0]	s_axi_wstrb			,
input wire s_axi_wvalid                 ,
output wire s_axi_wready                ,
output wire [1 : 0] s_axi_bresp         ,
output wire s_axi_bvalid                ,
input wire s_axi_bready                 ,
input wire [11 : 0] s_axi_araddr        ,
input wire s_axi_arvalid                ,
output wire s_axi_arready               ,
output wire [31 : 0] s_axi_rdata        ,
output wire [1 : 0] s_axi_rresp         ,
output wire s_axi_rvalid                ,
input wire s_axi_rready                 
    );

wire		rx_reset_done			;
wire		gt_powergood			;
wire 		rx_reset_gt				;
wire [63 : 0] gt0_rxdata			;
wire [3 : 0] gt0_rxcharisk          ;
wire [3 : 0] gt0_rxdisperr          ;
wire [3 : 0] gt0_rxnotintable       ;
wire [1 : 0] gt0_rxheader           ;
wire gt0_rxmisalign                 ;
wire gt0_rxblock_sync               ;
wire [63 : 0] gt1_rxdata            ;
wire [3 : 0] gt1_rxcharisk          ;
wire [3 : 0] gt1_rxdisperr          ;
wire [3 : 0] gt1_rxnotintable       ;
wire [1 : 0] gt1_rxheader           ;
wire gt1_rxmisalign                 ;
wire gt1_rxblock_sync               ;
wire [63 : 0] gt2_rxdata            ;
wire [3 : 0] gt2_rxcharisk          ;
wire [3 : 0] gt2_rxdisperr          ;
wire [3 : 0] gt2_rxnotintable       ;
wire [1 : 0] gt2_rxheader           ;
wire gt2_rxmisalign                 ;
wire gt2_rxblock_sync               ;
wire [63 : 0] gt3_rxdata            ;
wire [3 : 0] gt3_rxcharisk          ;
wire [3 : 0] gt3_rxdisperr          ;
wire [3 : 0] gt3_rxnotintable       ;
wire [1 : 0] gt3_rxheader           ;
wire gt3_rxmisalign                 ;
wire gt3_rxblock_sync               ;
wire [63 : 0] gt4_rxdata            ;
wire [3 : 0] gt4_rxcharisk          ;
wire [3 : 0] gt4_rxdisperr          ;
wire [3 : 0] gt4_rxnotintable       ;
wire [1 : 0] gt4_rxheader           ;
wire gt4_rxmisalign                 ;
wire gt4_rxblock_sync               ;
wire [63 : 0] gt5_rxdata            ;
wire [3 : 0] gt5_rxcharisk          ;
wire [3 : 0] gt5_rxdisperr          ;
wire [3 : 0] gt5_rxnotintable       ;
wire [1 : 0] gt5_rxheader           ;
wire gt5_rxmisalign                 ;
wire gt5_rxblock_sync               ;
wire [63 : 0] gt6_rxdata            ;
wire [3 : 0] gt6_rxcharisk          ;
wire [3 : 0] gt6_rxdisperr          ;
wire [3 : 0] gt6_rxnotintable       ;
wire [1 : 0] gt6_rxheader           ;
wire gt6_rxmisalign                 ;
wire gt6_rxblock_sync               ;
wire [63 : 0] gt7_rxdata            ;
wire [3 : 0] gt7_rxcharisk          ;
wire [3 : 0] gt7_rxdisperr          ;
wire [3 : 0] gt7_rxnotintable       ;
wire [1 : 0] gt7_rxheader           ;
wire gt7_rxmisalign                 ;
wire gt7_rxblock_sync               ;

jesd204c_1 	jesd204c_1_inst (
  .s_axi_aclk(axi_clk),              // input wire s_axi_aclk
  .s_axi_aresetn(rst_n),        // input wire s_axi_aresetn
  .s_axi_awaddr(s_axi_awaddr),          // input wire [11 : 0] s_axi_awaddr
  .s_axi_awvalid(s_axi_awvalid),        // input wire s_axi_awvalid/
  .s_axi_awready(s_axi_awready),        // output wire s_axi_awready
  .s_axi_wdata(s_axi_wdata),            // input wire [31 : 0] s_axi_wdata
  .s_axi_wstrb(s_axi_wstrb),            // input wire [3 : 0] s_axi_wstrb
  .s_axi_wvalid(s_axi_wvalid),          // input wire s_axi_wvalid
  .s_axi_wready(s_axi_wready),          // output wire s_axi_wready
  .s_axi_bresp(s_axi_bresp),            // output wire [1 : 0] s_axi_bresp
  .s_axi_bvalid(s_axi_bvalid),          // output wire s_axi_bvalid
  .s_axi_bready(s_axi_bready),          // input wire s_axi_bready
  .s_axi_araddr(s_axi_araddr),          // input wire [11 : 0] s_axi_araddr
  .s_axi_arvalid(s_axi_arvalid),        // input wire s_axi_arvalid
  .s_axi_arready(s_axi_arready),        // output wire s_axi_arready
  .s_axi_rdata(s_axi_rdata),            // output wire [31 : 0] s_axi_rdata
  .s_axi_rresp(s_axi_rresp),            // output wire [1 : 0] s_axi_rresp
  .s_axi_rvalid(s_axi_rvalid),          // output wire s_axi_rvalid
  .s_axi_rready(s_axi_rready),          // input wire s_axi_rready
  .rx_core_clk(rx_core_clk),            // input wire rx_core_clk
  .rx_core_reset(!rst_n),        // input wire rx_core_reset
  .rx_sysref(rx_sysref),                // input wire rx_sysref
  .irq(),                            // output wire irq
  .rx_tdata(rx_tdata),                  // output wire [511 : 0] rx_tdata
  .rx_tvalid(rx_tvalid),                // output wire rx_tvalid
  .rx_aresetn(rx_aresetn),              // output wire rx_aresetn
  .rx_soemb(rx_soemb),                  // output wire rx_soemb
  .rx_crc_err(rx_crc_err),              // output wire rx_crc_err
  .rx_emb_err(rx_emb_err),              // output wire rx_emb_err
  .rx_cmd_tdata(rx_cmd_tdata),          // output wire [255 : 0] rx_cmd_tdata
  .rx_cmd_tvalid(rx_cmd_tvalid),        // output wire rx_cmd_tvalid
  .rx_cmd_tuser(rx_cmd_tuser),          // output wire [7 : 0] rx_cmd_tuser
  .rx_cmd_tready(rx_cmd_tready),        // input wire rx_cmd_tready
  .rx_reset_gt(rx_reset_gt),            // output wire rx_reset_gt
  .rx_reset_done(rx_reset_done),        // input wire rx_reset_done
  .gt0_rxdata(gt0_rxdata),              // input wire [63 : 0] gt0_rxdata
  .gt0_rxcharisk(gt0_rxcharisk),        // input wire [3 : 0] gt0_rxcharisk
  .gt0_rxdisperr(gt0_rxdisperr),        // input wire [3 : 0] gt0_rxdisperr
  .gt0_rxnotintable(gt0_rxnotintable),  // input wire [3 : 0] gt0_rxnotintable
  .gt0_rxheader(gt0_rxheader),          // input wire [1 : 0] gt0_rxheader
  .gt0_rxmisalign(gt0_rxmisalign),      // input wire gt0_rxmisalign
  .gt0_rxblock_sync(gt0_rxblock_sync),  // input wire gt0_rxblock_sync
  .gt1_rxdata(gt1_rxdata),              // input wire [63 : 0] gt1_rxdata
  .gt1_rxcharisk(gt1_rxcharisk),        // input wire [3 : 0] gt1_rxcharisk
  .gt1_rxdisperr(gt1_rxdisperr),        // input wire [3 : 0] gt1_rxdisperr
  .gt1_rxnotintable(gt1_rxnotintable),  // input wire [3 : 0] gt1_rxnotintable
  .gt1_rxheader(gt1_rxheader),          // input wire [1 : 0] gt1_rxheader
  .gt1_rxmisalign(gt1_rxmisalign),      // input wire gt1_rxmisalign
  .gt1_rxblock_sync(gt1_rxblock_sync),  // input wire gt1_rxblock_sync
  .gt2_rxdata(gt2_rxdata),              // input wire [63 : 0] gt2_rxdata
  .gt2_rxcharisk(gt2_rxcharisk),        // input wire [3 : 0] gt2_rxcharisk
  .gt2_rxdisperr(gt2_rxdisperr),        // input wire [3 : 0] gt2_rxdisperr
  .gt2_rxnotintable(gt2_rxnotintable),  // input wire [3 : 0] gt2_rxnotintable
  .gt2_rxheader(gt2_rxheader),          // input wire [1 : 0] gt2_rxheader
  .gt2_rxmisalign(gt2_rxmisalign),      // input wire gt2_rxmisalign
  .gt2_rxblock_sync(gt2_rxblock_sync),  // input wire gt2_rxblock_sync
  .gt3_rxdata(gt3_rxdata),              // input wire [63 : 0] gt3_rxdata
  .gt3_rxcharisk(gt3_rxcharisk),        // input wire [3 : 0] gt3_rxcharisk
  .gt3_rxdisperr(gt3_rxdisperr),        // input wire [3 : 0] gt3_rxdisperr
  .gt3_rxnotintable(gt3_rxnotintable),  // input wire [3 : 0] gt3_rxnotintable
  .gt3_rxheader(gt3_rxheader),          // input wire [1 : 0] gt3_rxheader
  .gt3_rxmisalign(gt3_rxmisalign),      // input wire gt3_rxmisalign
  .gt3_rxblock_sync(gt3_rxblock_sync),  // input wire gt3_rxblock_sync
  .gt4_rxdata(gt4_rxdata),              // input wire [63 : 0] gt4_rxdata
  .gt4_rxcharisk(gt4_rxcharisk),        // input wire [3 : 0] gt4_rxcharisk
  .gt4_rxdisperr(gt4_rxdisperr),        // input wire [3 : 0] gt4_rxdisperr
  .gt4_rxnotintable(gt4_rxnotintable),  // input wire [3 : 0] gt4_rxnotintable
  .gt4_rxheader(gt4_rxheader),          // input wire [1 : 0] gt4_rxheader
  .gt4_rxmisalign(gt4_rxmisalign),      // input wire gt4_rxmisalign
  .gt4_rxblock_sync(gt4_rxblock_sync),  // input wire gt4_rxblock_sync
  .gt5_rxdata(gt5_rxdata),              // input wire [63 : 0] gt5_rxdata
  .gt5_rxcharisk(gt5_rxcharisk),        // input wire [3 : 0] gt5_rxcharisk
  .gt5_rxdisperr(gt5_rxdisperr),        // input wire [3 : 0] gt5_rxdisperr
  .gt5_rxnotintable(gt5_rxnotintable),  // input wire [3 : 0] gt5_rxnotintable
  .gt5_rxheader(gt5_rxheader),          // input wire [1 : 0] gt5_rxheader
  .gt5_rxmisalign(gt5_rxmisalign),      // input wire gt5_rxmisalign
  .gt5_rxblock_sync(gt5_rxblock_sync),  // input wire gt5_rxblock_sync
  .gt6_rxdata(gt6_rxdata),              // input wire [63 : 0] gt6_rxdata
  .gt6_rxcharisk(gt6_rxcharisk),        // input wire [3 : 0] gt6_rxcharisk
  .gt6_rxdisperr(gt6_rxdisperr),        // input wire [3 : 0] gt6_rxdisperr
  .gt6_rxnotintable(gt6_rxnotintable),  // input wire [3 : 0] gt6_rxnotintable
  .gt6_rxheader(gt6_rxheader),          // input wire [1 : 0] gt6_rxheader
  .gt6_rxmisalign(gt6_rxmisalign),      // input wire gt6_rxmisalign
  .gt6_rxblock_sync(gt6_rxblock_sync),  // input wire gt6_rxblock_sync
  .gt7_rxdata(gt7_rxdata),              // input wire [63 : 0] gt7_rxdata
  .gt7_rxcharisk(gt7_rxcharisk),        // input wire [3 : 0] gt7_rxcharisk
  .gt7_rxdisperr(gt7_rxdisperr),        // input wire [3 : 0] gt7_rxdisperr
  .gt7_rxnotintable(gt7_rxnotintable),  // input wire [3 : 0] gt7_rxnotintable
  .gt7_rxheader(gt7_rxheader),          // input wire [1 : 0] gt7_rxheader
  .gt7_rxmisalign(gt7_rxmisalign),      // input wire gt7_rxmisalign
  .gt7_rxblock_sync(gt7_rxblock_sync)  	// input wire gt7_rxblock_sync
);	
	
jesd204_phy_0		jesd204_phy_0_inst (
  .qpll0_refclk(refclk),                          // input wire qpll0_refclk
  .drpclk(drpclk),                                      // input wire drpclk
  .tx_reset_gt(rx_reset_gt),                            // input wire tx_reset_gt
  .rx_reset_gt(rx_reset_gt),                            // input wire rx_reset_gt
  .tx_sys_reset(!rst_n),                          // input wire tx_sys_reset
  .rx_sys_reset(!rst_n),                          // input wire rx_sys_reset
  .txp_out(),                                    // output wire [7 : 0] txp_out
  .txn_out(),                                    // output wire [7 : 0] txn_out
  .rxp_in(rxp_in),                                      // input wire [7 : 0] rxp_in
  .rxn_in(rxn_in),                                      // input wire [7 : 0] rxn_in
  .tx_core_clk(rx_core_clk),                            // input wire tx_core_clk
  .rx_core_clk(rx_core_clk),                            // input wire rx_core_clk
  .txoutclk(),                                  // output wire txoutclk
  .rxoutclk(),                                  // output wire rxoutclk
  .gt0_txdata(),                              // input wire [63 : 0] gt0_txdata
  .gt0_txcharisk(),                        // input wire [3 : 0] gt0_txcharisk
  .gt0_txheader(),                          // input wire [1 : 0] gt0_txheader
  .gt1_txdata(),                              // input wire [63 : 0] gt1_txdata
  .gt1_txcharisk(),                        // input wire [3 : 0] gt1_txcharisk
  .gt1_txheader(),                          // input wire [1 : 0] gt1_txheader
  .gt2_txdata(),                              // input wire [63 : 0] gt2_txdata
  .gt2_txcharisk(),                        // input wire [3 : 0] gt2_txcharisk
  .gt2_txheader(),                          // input wire [1 : 0] gt2_txheader
  .gt3_txdata(),                              // input wire [63 : 0] gt3_txdata
  .gt3_txcharisk(),                        // input wire [3 : 0] gt3_txcharisk
  .gt3_txheader(),                          // input wire [1 : 0] gt3_txheader
  .gt4_txdata(),                              // input wire [63 : 0] gt4_txdata
  .gt4_txcharisk(),                        // input wire [3 : 0] gt4_txcharisk
  .gt4_txheader(),                          // input wire [1 : 0] gt4_txheader
  .gt5_txdata(),                              // input wire [63 : 0] gt5_txdata
  .gt5_txcharisk(),                        // input wire [3 : 0] gt5_txcharisk
  .gt5_txheader(),                          // input wire [1 : 0] gt5_txheader
  .gt6_txdata(),                              // input wire [63 : 0] gt6_txdata
  .gt6_txcharisk(),                        // input wire [3 : 0] gt6_txcharisk
  .gt6_txheader(),                          // input wire [1 : 0] gt6_txheader
  .gt7_txdata(),                              // input wire [63 : 0] gt7_txdata
  .gt7_txcharisk(),                        // input wire [3 : 0] gt7_txcharisk
  .gt7_txheader(),                          // input wire [1 : 0] gt7_txheader
  .tx_reset_done(),                        // output wire tx_reset_done
  .gt_powergood(gt_powergood),                          // output wire gt_powergood
  .gt0_rxdata(gt0_rxdata),                              // output wire [63 : 0] gt0_rxdata
  .gt0_rxcharisk(gt0_rxcharisk),                        // output wire [3 : 0] gt0_rxcharisk
  .gt0_rxdisperr(gt0_rxdisperr),                        // output wire [3 : 0] gt0_rxdisperr
  .gt0_rxnotintable(gt0_rxnotintable),                  // output wire [3 : 0] gt0_rxnotintable
  .gt0_rxheader(gt0_rxheader),                          // output wire [1 : 0] gt0_rxheader
  .gt0_rxmisalign(gt0_rxmisalign),                      // output wire gt0_rxmisalign
  .gt0_rxblock_sync(gt0_rxblock_sync),                  // output wire gt0_rxblock_sync
  .gt1_rxdata(gt1_rxdata),                              // output wire [63 : 0] gt1_rxdata
  .gt1_rxcharisk(gt1_rxcharisk),                        // output wire [3 : 0] gt1_rxcharisk
  .gt1_rxdisperr(gt1_rxdisperr),                        // output wire [3 : 0] gt1_rxdisperr
  .gt1_rxnotintable(gt1_rxnotintable),                  // output wire [3 : 0] gt1_rxnotintable
  .gt1_rxheader(gt1_rxheader),                          // output wire [1 : 0] gt1_rxheader
  .gt1_rxmisalign(gt1_rxmisalign),                      // output wire gt1_rxmisalign
  .gt1_rxblock_sync(gt1_rxblock_sync),                  // output wire gt1_rxblock_sync
  .gt2_rxdata(gt2_rxdata),                              // output wire [63 : 0] gt2_rxdata
  .gt2_rxcharisk(gt2_rxcharisk),                        // output wire [3 : 0] gt2_rxcharisk
  .gt2_rxdisperr(gt2_rxdisperr),                        // output wire [3 : 0] gt2_rxdisperr
  .gt2_rxnotintable(gt2_rxnotintable),                  // output wire [3 : 0] gt2_rxnotintable
  .gt2_rxheader(gt2_rxheader),                          // output wire [1 : 0] gt2_rxheader
  .gt2_rxmisalign(gt2_rxmisalign),                      // output wire gt2_rxmisalign
  .gt2_rxblock_sync(gt2_rxblock_sync),                  // output wire gt2_rxblock_sync
  .gt3_rxdata(gt3_rxdata),                              // output wire [63 : 0] gt3_rxdata
  .gt3_rxcharisk(gt3_rxcharisk),                        // output wire [3 : 0] gt3_rxcharisk
  .gt3_rxdisperr(gt3_rxdisperr),                        // output wire [3 : 0] gt3_rxdisperr
  .gt3_rxnotintable(gt3_rxnotintable),                  // output wire [3 : 0] gt3_rxnotintable
  .gt3_rxheader(gt3_rxheader),                          // output wire [1 : 0] gt3_rxheader
  .gt3_rxmisalign(gt3_rxmisalign),                      // output wire gt3_rxmisalign
  .gt3_rxblock_sync(gt3_rxblock_sync),                  // output wire gt3_rxblock_sync
  .gt4_rxdata(gt4_rxdata),                              // output wire [63 : 0] gt4_rxdata
  .gt4_rxcharisk(gt4_rxcharisk),                        // output wire [3 : 0] gt4_rxcharisk
  .gt4_rxdisperr(gt4_rxdisperr),                        // output wire [3 : 0] gt4_rxdisperr
  .gt4_rxnotintable(gt4_rxnotintable),                  // output wire [3 : 0] gt4_rxnotintable
  .gt4_rxheader(gt4_rxheader),                          // output wire [1 : 0] gt4_rxheader
  .gt4_rxmisalign(gt4_rxmisalign),                      // output wire gt4_rxmisalign
  .gt4_rxblock_sync(gt4_rxblock_sync),                  // output wire gt4_rxblock_sync
  .gt5_rxdata(gt5_rxdata),                              // output wire [63 : 0] gt5_rxdata
  .gt5_rxcharisk(gt5_rxcharisk),                        // output wire [3 : 0] gt5_rxcharisk
  .gt5_rxdisperr(gt5_rxdisperr),                        // output wire [3 : 0] gt5_rxdisperr
  .gt5_rxnotintable(gt5_rxnotintable),                  // output wire [3 : 0] gt5_rxnotintable
  .gt5_rxheader(gt5_rxheader),                          // output wire [1 : 0] gt5_rxheader
  .gt5_rxmisalign(gt5_rxmisalign),                      // output wire gt5_rxmisalign
  .gt5_rxblock_sync(gt5_rxblock_sync),                  // output wire gt5_rxblock_sync
  .gt6_rxdata(gt6_rxdata),                              // output wire [63 : 0] gt6_rxdata
  .gt6_rxcharisk(gt6_rxcharisk),                        // output wire [3 : 0] gt6_rxcharisk
  .gt6_rxdisperr(gt6_rxdisperr),                        // output wire [3 : 0] gt6_rxdisperr
  .gt6_rxnotintable(gt6_rxnotintable),                  // output wire [3 : 0] gt6_rxnotintable
  .gt6_rxheader(gt6_rxheader),                          // output wire [1 : 0] gt6_rxheader
  .gt6_rxmisalign(gt6_rxmisalign),                      // output wire gt6_rxmisalign
  .gt6_rxblock_sync(gt6_rxblock_sync),                  // output wire gt6_rxblock_sync
  .gt7_rxdata(gt7_rxdata),                              // output wire [63 : 0] gt7_rxdata
  .gt7_rxcharisk(gt7_rxcharisk),                        // output wire [3 : 0] gt7_rxcharisk
  .gt7_rxdisperr(gt7_rxdisperr),                        // output wire [3 : 0] gt7_rxdisperr
  .gt7_rxnotintable(gt7_rxnotintable),                  // output wire [3 : 0] gt7_rxnotintable
  .gt7_rxheader(gt7_rxheader),                          // output wire [1 : 0] gt7_rxheader
  .gt7_rxmisalign(gt7_rxmisalign),                      // output wire gt7_rxmisalign
  .gt7_rxblock_sync(gt7_rxblock_sync),                  // output wire gt7_rxblock_sync
  .rx_reset_done(rx_reset_done),                        // output wire rx_reset_done
  .common0_qpll0_clk_out(),        // output wire common0_qpll0_clk_out
  .common0_qpll0_refclk_out(),  // output wire common0_qpll0_refclk_out
  .common0_qpll0_lock_out(),      // output wire common0_qpll0_lock_out
  .common1_qpll0_clk_out(),        // output wire common1_qpll0_clk_out
  .common1_qpll0_refclk_out(),  // output wire common1_qpll0_refclk_out
  .common1_qpll0_lock_out()      // output wire common1_qpll0_lock_out
);
endmodule

仿真结果

在这里插入图片描述
TX输出的数据依次是1000;2000;3000
在这里插入图片描述RX接收并解析的数据依次是1000;2000;3000在这里插入图片描述
TX与RX数据一致。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1992216.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pod详解 list-watch机制 预选优选策略 如何指定节点调度pod

K8S是通过 list-watch 机制实现每个组件的协同工作 controller-manager、scheduler、kubelet 通过 list-watch 机制监听 apiserver 发出的事件&#xff0c;apiserver 也会监听 etcd 发出的事件 scheduler的调度策略&#xff1a; 预选策略&#xff08;Predicates&#xff09;…

JavaScript中的__setitem__方法

1、问题背景 Python中存在一个名为__setitem__的方法&#xff0c;该方法能够在向对象中设置值时对其进行处理。例如&#xff0c;以下代码演示了如何在Python中使用__setitem__方法对一个字典中的键值对进行平方处理&#xff1a; class CustomDict(dict):def __setitem__(self…

PMP证书3A一次通过攻略(内含血泪教训和踩过的坑,避雷必看)

手把手教你如何3A速通PMP证书 首先&#xff1a;你考PMP到底图什么&#xff1f; 清晰、强烈的动机是意志力的基础&#xff0c;你是想要加薪升职&#xff1f;转行转岗&#xff1f;还是只是为了知识&#xff1f;无论什么理由都可以&#xff0c;当搞明白到底图什么&#xff0c;学习…

URDF在线可视化网站

​ URDF全称&#xff08;United Robotics Description Format&#xff09;统一机器人描述格式&#xff0c;是一个XML语法框架下用来描述机器人的语言格式&#xff0c;URDF在ROS界很流行。 关于URDF的详细介绍&#xff0c;请参考博文URDF学习&#xff08;一&#xff09;什么是U…

海康gige工业相机无驱动取像突破(c#实现,版本更新,你也可以移植到linux下去用)

我们前面有一个版本&#xff0c;没有整理&#xff0c;只能是500万海康gige工业相机无驱动取像成功&#xff08;黑白相机gm&#xff09;。 这里&#xff0c;版本更新了&#xff0c;可以不是500万&#xff0c;200万&#xff0c;80万也可以&#xff0c;你可以去试一试&#xff0c…

【C++二分查找 树状数组】2424. 最长上传前缀

本文涉及的基础知识点 C二分查找 树状数组 LeetCode2424. 最长上传前缀 给你一个 n 个视频的上传序列&#xff0c;每个视频编号为 1 到 n 之间的 不同 数字&#xff0c;你需要依次将这些视频上传到服务器。请你实现一个数据结构&#xff0c;在上传的过程中计算 最长上传前缀…

“AI+Security”系列第2期(一):对抗!大模型自身安全的攻防博弈

近日&#xff0c;由安全极客、Wisemodel 社区和 InForSec 网络安全研究国际学术论坛联合主办的“AISecurity”系列第 2 期——对抗&#xff01;大模型自身安全的攻防博弈线上活动如期举行。本次活动邀请了君同未来创始人兼 CEO 韩蒙、前阿里云高级安全专家郑瀚、ChaMd5 AI 组负…

浏览器突然无法正常访问网页的解决方案

文章目录 1.问题描述&#xff1a;2.解决方案3.总结 1.问题描述&#xff1a; 浏览器之前是可以正常搜索的&#xff0c;但是这次打开显示无法正常访问&#xff0c;但是部分网页又是可以正常访问的 2.解决方案 1.搜索控制面板 2.点击网络和Internet 3.点击网络共享中心 4.点击…

大数据面试SQL(五):查询最近一笔有效订单

文章目录 查询最近一笔有效订单 一、题目 二、分析 三、SQL实战 四、样例数据参考 查询最近一笔有效订单 一、题目 现有订单表t5_order&#xff0c;包含订单ID&#xff0c;订单时间&#xff0c;下单用户&#xff0c;当前订单是否有效。 请查询出每笔订单的上一笔有效订…

Fanuc机床的数据采集解决方案

对于制造业而言随着工业数字化的发展&#xff0c;完善工厂信息化管理&#xff0c;消除信息孤岛是越来越多工控人关注的事情。其中不得不提到的就是CNC系统&#xff0c;科学的程序管理和规范可以减少机床辅助时间&#xff0c;提高机床利用效率&#xff1b;及时准确的获取机床实时…

线程池c代码实现

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、线程池是什么&#xff1f;二、代码示例总结 前言 线程池c代码简单实现&#xff1a; 大致思路如下&#xff1a; 一个管理线程轮询工作线程是否空闲&#xf…

程序员如何在人工智能时代保持核心竞争力

目录 1.概述 1.1. 技术深度与广度的平衡 1.2. 软技能的培养 1.3. 持续学习和适应性 1.4. 理解和应用AI 1.5. 伦理和责任意识 2.AI辅助编程对程序员工作的影响 2.1.AI工具对编码实践的积极影响 2.2.AI工具的潜在风险 2.3.如何平衡利与弊 3.程序员应重点发展的核心能力…

RabbitMQ docker安装

后台配置文件 rabbitmq:image: rabbitmq:latestcontainer_name: rabbitmqports:- "5672:5672" # RabbitMQ server port- "15672:15672" # RabbitMQ management console portenvironment:RABBITMQ_DEFAULT_USER: adminRABBITMQ_DEFAULT_PASS: admin 若要打…

使用 Mojo 中的 Mandelbrot 和 Python 绘图

Mojo不仅非常适合编写高性能代码,而且还允许我们利用庞大的Python生态系统中的库和工具。通过无缝的Python互操作性,Mojo可以使用Python来做它擅长的事情,特别是gui,而不会牺牲关键代码的性能。让我们使用经典的Mandelbrot集合算法并在Mojo中实现它。 本教程展示了Mojo的两…

UE 选中框

【UE】框选功能_ue框选-CSDN博客 虚幻4 小功能教程系列-P33 覆盖物框选(框选场景里的物体)_哔哩哔哩_bilibili 步骤 先重载 UI中函数 OnPaint Position&#xff1a;起始位置 Size&#xff1a;大小 Brush: 选中框样式设置 在内容浏览器中新建一个“Slate笔刷” Tint&#x…

2023 江苏省第一届数据安全技术应用职业技能竞赛 决赛 部分wp

文章目录 一、前言比赛平台全貌题目附件及工具下载&#xff08;123网盘&#xff09; 二、参考文章三、题目&#xff08;解析&#xff09;一、内存取证-MemoryLife1、请给出内存镜像中黑客使用工具对外连接的IP地址及端口号是___________。&#xff08;格式为IP_PORT&#xff09…

Windows Server Backup(2016) 备份

Windows Server Backup(2016) 备份 1.使用 Windows Server Backup 备份 点击添加角色和功能&#xff0c;根据向导&#xff0c;添加 Windows Server Backup 功能。 添加完成后可通过 控制面板\系统和安全\管理工具 找到 Windows Server Backup&#xff0c;如下图 打开后如图&…

Openlayers6之地图覆盖物Overlay详解及使用,地图标注及弹窗查看详情(结合React)

demo案例&#xff1a;用户实现地图加载人员位置定位&#xff0c;并设置人员图片文字等标注&#xff0c;点击定位点查看人员详情。 主要通过ol/geom Point设置Style和ol/Overlay实现。主要实现步骤&#xff1a; 实现图文标注的实质是添加点时设置Ponit的样式&#xff0c;图片标…

浅谈安科瑞智慧用电系统在电气火灾中的应用

摘要&#xff1a;为了对电气火灾事故进行预测和预警&#xff0c;同时为了对电气火灾事故的应急救援提供 支持&#xff0c;将智慧用电监控系统应用于电气火灾中。该系统利用物联网、移动互联网、云平台、大数据技术&#xff0c;实现对电气线路电流、漏电、温度、谐波等参数进行…

leetcode日记(66)子集

实际上和上一题差不多&#xff0c;可以直接套用上一题回溯递归的函数写出来&#xff0c;复杂度比较高&#xff0c;因为是按照数字个数依次代入函数&#xff0c;然后通通放入一个vector中。 class Solution { public:vector<vector<int>> subsets(vector<int>…