JESD204B及解扰模块

一、视频资料

学习视频可以参考下方两个系列:前一个主要讲原理,可以使用其附带的资料(视频中SYNC讲解部分内容可能不是很准确,以官方手册为准);后一个视频侧重代码设计,设计框架可以参考。

FPGA高速接口JESD204B:初识JESD204B_哔哩哔哩_bilibili

全网首发!【手撕JESD204B】part0. 视频内容介绍 & 框架设计 ——大毛_哔哩哔哩_bilibili

二、Xilinx IP及设计

Xilinx中提供两个IP,都可以调取官方的工程做参考设计,并进行仿真。PHY中收发一体,实现物理层。204或204C中需分开配置收或发,实现链路层、传输层。

使用IP PHY后不必关心8b10b已经由IP中GTH/GTE等自动完成,用户只用关心转出的8b即可。按照参考设计框架的左侧图设计。

接收侧LMFC的脉冲位置可以根据数据到达情况调整,即虽然被SYSREF复位计数器的值,但复位结果不必=0。

发送侧与接收侧的LMFC可以不在同一时刻,但要保持固定的相对位置关系,两侧的LMFC计数时钟频率必需相同,以实现完全同步,失调不同步后要用SYNC~申请再次同步。

确定性延时:每条LANE发送端到各自接收端的BUFFER弹出数据的时间,必需<一个多帧周期时间,是204B中增加的。

204C中增加了64B/66B编码,提高了传输速率,引入了LEMC,但仍可以向下兼容204B。

同步流程图,第一个来自Xilinx JESD204手册 PG066,是标准204B;

第二张来自204C手册,没有SYNC、SYSREF信号,可用于查看弹性buffer部分的内容。

AD9625手册中提供了简要的说明,也是对上第一流程图中的描述,方便理解。

J204B接口数据链路的建立_jesd204b建链的过程-优快云博客

JESD204B IP核的配置与使用-优快云博客

三、加解扰码的原理

【JESD204系列】六、加解扰模块的设计原理_加扰示意图-优快云博客

关于初始值手册中为'h7f80,实际使用时Xilinx IP中用的是之前ILAS中的最后2字节0x7e7c,完整的最后4字节是0x7c7e7d7c,左边的0x7c应该是多帧结束字符/A/。ILAS虽然不参与加扰,但其最后2字节留在了加扰器中。

四、代码及仿真

K码同步、ILAS阶段不做扰码,仅在数据段执行。延迟1clk输出。

module jesd204b_descrambler (
    input wire clk,        // 系统时钟
    input wire rst_n,      // 异步复位(低电平有效)
    input wire enable,     // 加扰使能
    input wire [31:0] data_in,  // 输入数据(假设位宽32,可调整)
    output     [31:0] data_out  // 输出加扰后数据,delay 1
);

// 解扰器状态寄存器(15-bit)
reg  [   14:0] lfsr_s_prev;
wire [31+15:0] lfsr_s;

reg  [31:0] R_data_out;
wire [31:0] W_data_out;
wire [31:0] W_data_in;
wire [31:0] W_feedback;
 

generate 
	genvar i;
	for(i = 0; i < 4; i = i + 1) begin:data_remap
		assign W_data_in  [31-i*8 : 31-i*8-7] = data_in   [i*8+7 : i*8];//输入字节反序,低字节的高bit先计算
		assign  data_out  [31-i*8 : 31-i*8-7] = R_data_out[i*8+7 : i*8];//输出字节反序,
	end
endgenerate

// 解扰过程
assign lfsr_s     = {lfsr_s_prev ,W_data_in};
assign W_feedback = lfsr_s[31+15:15] ^ lfsr_s[31+14:14] ^ W_data_in;//S0在高bit,S1次之 [46]^[45]^W_data_in[31]
//assign W_data_out = enable ? W_feedback : W_data_in;
always @(posedge clk )   R_data_out <= enable ? W_feedback : W_data_in;

always @(posedge clk ) begin              
       lfsr_s_prev <= enable ? lfsr_s[14:0] : 'h7e7c;//'h7e7c为ILAS第4个多帧的最后2字节。'h7f80是204B手册上建议的初始值;	
end

endmodule

仿真文件

// 测试激励
module tb_jesd204b_descrambler;

reg clk;
reg rst_n;
reg enable;
reg [31:0] data_in;
wire [31:0] data_out;

// 实例化解扰模块
jesd204b_descrambler u_descrambler (
    .clk(clk),
    .rst_n(rst_n),
    .enable(enable),
    .data_in(data_in),				
    .data_out(data_out)
);

// 时钟生成
initial begin
    clk = 0;
    forever #5 clk = ~clk; // 100MHz时钟
end

// 测试逻辑
initial begin
    // 复位初始化
    rst_n = 0;
    enable = 0;
    data_in = 32'h0000_0000; 
    #20;
    rst_n = 1;
    enable = 1;

    // 测试数据1
    data_in = 32'h933c2805;//data_out = 'h6322_2000;
    #10;
    $display("Input: 0x%h, deScrambled Output: 0x%h", data_in, data_out);

    // 测试数据2
    data_in = 32'h49ffcfb6;//data_out = 'he949_a63d;
    #10;
    $display("Input: 0x%h, deScrambled Output: 0x%h", data_in, data_out);

    // 测试数据2
    data_in = 32'h30989a3d;//data_out = 'h6f15_2c3e;
    #10;
    $display("Input: 0x%h,deScrambled Output: 0x%h", data_in, data_out);
    $finish;
end

endmodule

解扰仿真结果

结果验证。Xilinx 204C发送模块 IP的示例工程中,对输入数据加扰后的结果见下图,与上图中解扰结果一致。

以下是一个简单的Verilog代码实现: ```Verilog module parallel_scrambler ( input clk, input reset, input [7:0] data_in, output [7:0] data_out ); reg [7:0] shift_reg; reg [7:0] scrambler_poly = 8'b11001001; // Scrambling polynomial always @(posedge clk) begin if (reset) begin shift_reg <= 8'b00000000; end else begin // XOR the shift register with the scrambling polynomial shift_reg[7] <= shift_reg[6] ^ shift_reg[0] ^ data_in; shift_reg[6] <= shift_reg[5] ^ shift_reg[4] ^ shift_reg[0] ^ data_in; shift_reg[5] <= shift_reg[4] ^ shift_reg[3] ^ shift_reg[2] ^ shift_reg[0] ^ data_in; shift_reg[4] <= shift_reg[3] ^ shift_reg[2] ^ shift_reg[1] ^ data_in; shift_reg[3] <= shift_reg[2] ^ shift_reg[1] ^ shift_reg[0]; shift_reg[2] <= shift_reg[1] ^ shift_reg[0]; shift_reg[1] <= shift_reg[0]; shift_reg[0] <= data_in; end end assign data_out = shift_reg; endmodule ``` 这个模块有四个输入输出端口: - clk:时钟信号 - reset:复位信号 - data_in:输入数据 - data_out:输出数据 它使用一个8位移位寄存器(shift_reg)来存储数据,并且在时钟信号的上升沿触发。当reset为高电平时,移位寄存器清零。否则,它将使用一个特定的扰码多项式(scrambler_poly)对移位寄存器进行异或运算,并将结果输出到data_out端口。这个扰码多项式是8位二进制数11001001。 在每个时钟周期中,移位寄存器中的数据都会向左移动一个位置,同时将输入数据放在最右边的位置上。然后,使用扰码多项式对移位寄存器的不同位置进行异或运算,以产生输出数据。这将使原始数据变得更难以识别,并提高传输数据的安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值