DP 32bit位宽数据扰码实现和仿真
关于DisplayPort 1.4协议中扰码用的16-bit LFSR的移位8个时钟周期后的输出表达式我们已经用迭代的方法推导过,那么移位32个时钟周期的输出表达式同样可以迭代32次推导出,或者将移位8个时钟的输出表达式迭代3次也可以得到。以下就是移位32个时钟周期的输出表达式。
R0 = b10 x b8 x b6 x b0
R1 = b11 x b9 x b7 x b1
R2 = b12 x b10 x b8 x b2
R3 = b13 x b11 x b10 x b9 x b8 x b6 x b3
R4 = b14 x b12 x b11 x b9 x b8 x b7 x b6 x b4
R5 = b15 x b13 x b12 x b9 x b7 x b6 x b5
R6 = b14 x b13 x b10 x b8 x b7 x b6 x b0
R7 = b15 x b14 x b11 x b9 x b8 x b7 x b1
R8 = b15 x b12 x b10 x b9 x b8 x b2 x b0
R9 = b13 x b11 x b10 x b9 x b3 x b1
R10 = b14 x b12 x b11 x b10 x b4 x b2 x b0
R11 = b15 x b13 x b12 x b11 x b5 x b3 x b1
R12 = b14 x b13 x b12 x b6 x b4 x b2
R13 = b15 x b14 x b13 x b7 x b5 x b3
R14 = b15 x b14 x b8 x b6 x b4
R15 = b15 x b9 x b7 x b5
根据上述表达式,我们可以实现32bit输入数据的扰码和解码。我们用示意图说明32bit数据扰码和8bit数据扰码的区别。8bit数据扰码,每个时钟输入数据位宽为8bit,LFSR输出为移位8个时钟周期后的输出表达式,然后根据DP协议规则按位异或输出,输出数据也是8bit,如下图。
32bit数据扰码,每个时钟输入数据位宽为32bit,LFSR需要有四组,分别是移位8个时钟周期后输出,移位16个时钟周期后的输出,移位24个时钟周期后的输出,移位32个时钟周期后的输出,再根据DP协议规则分别与32bit数据中的4个字节按位异或输出,输出数据为32bit,如下图。
加扰scramble模块中的LFSR采用按上述迭代32个时钟周期的输出表达式方式实现。一共四组LFSR,分别与32bit数据的4个字节相异或处理。但因为LFSR是移位32个时钟周期的输出表达式,所以只能利用不同的复位初始值来分别对应4个字节。注:此代码只是用于仿真,可以方便调整输出数据中SR符号的位置,实际模块中无此功能。
module scramble #
(parameter SEQUENCY = 2'd0 //output sequency, 0:{SR,xx,xx,xx}// 1:{xx,SR,xx,xx}// 2:{xx,xx,SR,xx}// 3:{xx,xx,xx,SR}
)
( input I_rst_n ,//low activeinput I_sr_rst ,input I_clk ,input [3:0] I_kcode ,input [31:0] I_data ,//low byte firstoutput [3:0] O_kcode , output [31:0] O_data //scramble
);//=====================
reg [15:0] sr8_0;
reg [15:0] sr8_1;
reg [15:0] sr8_2;
reg [15:0] sr8_3; reg [7:0] scrm_byte0;//data[7:0] first
reg [7:0] scrm_byte1;//data[15:8] second
reg [7:0] scrm_byte2;//data[23:16] third
reg [7:0] scrm_byte3;//data[31:24] forthreg [3:0] I_kcode_d1;reg [3:0] scrm_kcode_d1;
reg [3:0] scrm_kcode_d2;
reg [31:0] scrm_data_d1;
reg [31:0] scrm_data_d2;//====================
always@(posedge I_clk or negedge I_rst_n)
begin if(!I_rst_n) beginI_kcode_d1 <= 4'b0;endelsebeginI_kcode_d1 <= I_kcode;end
end//=====================
//LFSR 并行结构,32次移位后
always@(posedge I_clk or negedge I_rst_n)
begin if(!I_rst_n) sr8_0 <= 16'hffff ; //16'hfffe ;16'hffff ;else if(I_sr_rst)sr8_0 <= 16'hffff ; //16'hfffe ;16'hffff ;elsebegin sr8_0[ 0] <= sr8_0[10] ^ sr8_0[ 8] ^ sr8_0[ 6] ^ sr8_0[ 0]; sr8_0[ 1] <= sr8_0[11] ^ sr8_0[ 9] ^ sr8_0[ 7] ^ sr8_0[ 1]; sr8_0[ 2] <= sr8_0[12] ^ sr8_0[10] ^ sr8_0[ 8] ^ sr8_0[ 2]; sr8_0[ 3] <= sr8_0[13] ^ sr8_0[11] ^ sr8_0[10] ^ sr8_0[ 9] ^ sr8_0[ 8] ^ sr8_0[ 6] ^ sr8_0[ 3]; sr8_0[ 4] <= sr8_0[14] ^ sr8_0[12] ^ sr8_0[11] ^ sr8_0[ 9] ^ sr8_0[ 8] ^ sr8_0[ 7] ^ sr8_0[ 6] ^ sr8_0[ 4]; sr8_0[ 5] <= sr8_0[15] ^ sr8_0[13] ^ sr8_0[12] ^ sr8_0[ 9] ^ sr8_0[ 7] ^ sr8_0[ 6] ^ sr8_0[ 5]; sr8_0[ 6] <= sr8_0[14] ^ sr8_0[13] ^ sr8_0[10] ^ sr8_0[ 8] ^ sr8_0[ 7] ^ sr8_0[ 6] ^ sr8_0[ 0]; sr8_0[ 7] <= sr8_0[15] ^ sr8_0[14] ^ sr8_0[11] ^ sr8_0[ 9] ^ sr8_0[ 8] ^ sr8_0[ 7] ^ sr8_0[ 1]; sr8_0[ 8] <= sr8_0[15] ^ sr8_0[12] ^ sr8_0[10] ^ sr8_0[ 9] ^ sr8_0[ 8] ^ sr8_0[ 2] ^ sr8_0[ 0]; sr8_0[ 9] <= sr8_0[13] ^ sr8_0[11] ^ sr8_0[10] ^ sr8_0[ 9] ^ sr8_0[ 3] ^ sr8_0[ 1]; sr8_0[10] <= sr8_0[14] ^ sr8_0[12] ^ sr8_0[11] ^ sr8_0[10] ^ sr8_0[ 4] ^ sr8_0[ 2] ^ sr8_0[ 0]; sr8_0[11] <= sr8_0[15] ^ sr8_0[13] ^ sr8_0[12] ^ sr8_0[11] ^ sr8_0[ 5] ^ sr8_0[ 3] ^ sr8_0[ 1]; sr8_0[12] <= sr8_0[14] ^ sr8_0[13] ^ sr8_0[12] ^ sr8_0[ 6] ^ sr8_0[ 4] ^ sr8_0[ 2]; sr8_0[13] <= sr8_0[15] ^ sr8_0[14] ^ sr8_0[13] ^ sr8_0[ 7] ^ sr8_0[ 5] ^ sr8_0[ 3]; sr8_0[14] <= sr8_0[15] ^ sr8_0[14] ^ sr8_0[ 8] ^ sr8_0[ 6] ^ sr8_0[ 4]; sr8_0[15] <= sr8_0[15] ^ sr8_0[ 9] ^ sr8_0[ 7] ^ sr8_0[ 5]; end
end always@(posedge I_clk or negedge I_rst_n)
begin if(!I_rst_n) sr8_1 <= 16'he817 ; //16'he917 ;16'he817 ;else if(I_sr_rst)sr8_1 <= 16'he817 ; //16'he917 ;16'he817 ;elsebegin sr8_1[ 0] <= sr8_1[10] ^ sr8_1[ 8] ^ sr8_1[ 6] ^ sr8_1[ 0]; sr8_1[ 1] <= sr8_1[11] ^ sr8_1[ 9] ^ sr8_1[ 7] ^ sr8_1[ 1]; sr8_1[ 2] <= sr8_1[12] ^ sr8_1[10] ^ sr8_1[ 8] ^ sr8_1[ 2]; sr8_1[ 3] <= sr8_1[13] ^ sr8_1[11] ^ sr8_1[10] ^ sr8_1[ 9] ^ sr8_1[ 8] ^ sr8_1[ 6] ^ sr8_1[ 3]; sr8_1[ 4] <= sr8_1[14] ^ sr8_1[12] ^ sr8_1[11] ^ sr8_1[ 9] ^ sr8_1[ 8] ^ sr8_1[ 7] ^ sr8_1[ 6] ^ sr8_1[ 4]; sr8_1[ 5] <= sr8_1[15] ^ sr8_1[13] ^ sr8_1[12] ^ sr8_1[ 9] ^ sr8_1[ 7] ^ sr8_1[ 6] ^ sr8_1[ 5]; sr8_1[ 6] <= sr8_1[14] ^ sr8_1[13] ^ sr8_1[10] ^ sr8_1[ 8] ^ sr8_1[ 7] ^ sr8_1[ 6] ^ sr8_1[ 0]; sr8_1[ 7] <= sr8_1[15] ^ sr8_1[14] ^ sr8_1[11] ^ sr8_1[ 9] ^ sr8_1[ 8] ^ sr8_1[ 7] ^ sr8_1[ 1]; sr8_1[ 8] <= sr8_1[15] ^ sr8_1[12] ^ sr8_1[10] ^ sr8_1[ 9] ^ sr8_1[ 8] ^ sr8_1[ 2] ^ sr8_1[ 0]; sr8_1[ 9] <= sr8_1[13] ^ sr8_1[11] ^ sr8_1[10] ^ sr8_1[ 9] ^ sr8_1[ 3] ^ sr8_1[ 1]; sr8_1[10] <= sr8_1[14] ^ sr8_1[12] ^ sr8_1[11] ^ sr8_1[10] ^ sr8_1[ 4] ^ sr8_1[ 2] ^ sr8_1[ 0]; sr8_1[11] <= sr8_1[15] ^ sr8_1[13] ^ sr8_1[12] ^ sr8_1[11] ^ sr8_1[ 5] ^ sr8_1[ 3] ^ sr8_1[ 1]; sr8_1[12] <= sr8_1[14] ^ sr8_1[13] ^ sr8_1[12] ^ sr8_1[ 6] ^ sr8_1[ 4] ^ sr8_1[ 2]; sr8_1[13] <= sr8_1[15] ^ sr8_1[14] ^ sr8_1[13] ^ sr8_1[ 7] ^ sr8_1[ 5] ^ sr8_1[ 3]; sr8_1[14] <= sr8_1[15] ^ sr8_1[14] ^ sr8_1[ 8] ^ sr8_1[ 6] ^ sr8_1[ 4]; sr8_1[15] <= sr8_1[15] ^ sr8_1[ 9] ^ sr8_1[ 7] ^ sr8_1[ 5]; end
end always@(posedge I_clk or negedge I_rst_n)
begin if(!I_rst_n) sr8_2 <= 16'h0328 ; //16'h0311 ;16'h0328 ;else if(I_sr_rst)sr8_2 <= 16'h0328 ; //16'h0311 ;16'h0328 ; elsebegin sr8_2[ 0] <= sr8_2[10] ^ sr8_2[ 8] ^ sr8_2[ 6] ^ sr8_2[ 0]; sr8_2[ 1] <= sr8_2[11] ^ sr8_2[ 9] ^ sr8_2[ 7] ^ sr8_2[ 1]; sr8_2[ 2] <= sr8_2[12] ^ sr8_2[10] ^ sr8_2[ 8] ^ sr8_2[ 2]; sr8_2[ 3] <= sr8_2[13] ^ sr8_2[11] ^ sr8_2[10] ^ sr8_2[ 9] ^ sr8_2[ 8] ^ sr8_2[ 6] ^ sr8_2[ 3]; sr8_2[ 4] <= sr8_2[14] ^ sr8_2[12] ^ sr8_2[11] ^ sr8_2[ 9] ^ sr8_2[ 8] ^ sr8_2[ 7] ^ sr8_2[ 6] ^ sr8_2[ 4]; sr8_2[ 5] <= sr8_2[15] ^ sr8_2[13] ^ sr8_2[12] ^ sr8_2[ 9] ^ sr8_2[ 7] ^ sr8_2[ 6] ^ sr8_2[ 5]; sr8_2[ 6] <= sr8_2[14] ^ sr8_2[13] ^ sr8_2[10] ^ sr8_2[ 8] ^ sr8_2[ 7] ^ sr8_2[ 6] ^ sr8_2[ 0]; sr8_2[ 7] <= sr8_2[15] ^ sr8_2[14] ^ sr8_2[11] ^ sr8_2[ 9] ^ sr8_2[ 8] ^ sr8_2[ 7] ^ sr8_2[ 1]; sr8_2[ 8] <= sr8_2[15] ^ sr8_2[12] ^ sr8_2[10] ^ sr8_2[ 9] ^ sr8_2[ 8] ^ sr8_2[ 2] ^ sr8_2[ 0]; sr8_2[ 9] <= sr8_2[13] ^ sr8_2[11] ^ sr8_2[10] ^ sr8_2[ 9] ^ sr8_2[ 3] ^ sr8_2[ 1]; sr8_2[10] <= sr8_2[14] ^ sr8_2[12] ^ sr8_2[11] ^ sr8_2[10] ^ sr8_2[ 4] ^ sr8_2[ 2] ^ sr8_2[ 0]; sr8_2[11] <= sr8_2[15] ^ sr8_2[13] ^ sr8_2[12] ^ sr8_2[11] ^ sr8_2[ 5] ^ sr8_2[ 3] ^ sr8_2[ 1]; sr8_2[12] <= sr8_2[14] ^ sr8_2[13] ^ sr8_2[12] ^ sr8_2[ 6] ^ sr8_2[ 4] ^ sr8_2[ 2]; sr8_2[13] <= sr8_2[15] ^ sr8_2[14] ^ sr8_2[13] ^ sr8_2[ 7] ^ sr8_2[ 5] ^ sr8_2[ 3]; sr8_2[14] <= sr8_2[15] ^ sr8_2[14] ^ sr8_2[ 8] ^ sr8_2[ 6] ^ sr8_2[ 4]; sr8_2[15] <= sr8_2[15] ^ sr8_2[ 9] ^ sr8_2[ 7] ^ sr8_2[ 5]; end
end always@(posedge I_clk or negedge I_rst_n)
begin if(!I_rst_n) sr8_3 <= 16'h284b ; //16'h114b ;16'h284b ; else if(I_sr_rst)sr8_3 <= 16'h284b ; //16'h114b ;16'h284b ; elsebegin sr8_3[ 0] <= sr8_3[10] ^ sr8_3[ 8] ^ sr8_3[ 6] ^ sr8_3[ 0]; sr8_3[ 1] <= sr8_3[11] ^ sr8_3[ 9] ^ sr8_3[ 7] ^ sr8_3[ 1]; sr8_3[ 2] <= sr8_3[12] ^ sr8_3[10] ^ sr8_3[ 8] ^ sr8_3[ 2]; sr8_3[ 3] <= sr8_3[13] ^ sr8_3[11] ^ sr8_3[10] ^ sr8_3[ 9] ^ sr8_3[ 8] ^ sr8_3[ 6] ^ sr8_3[ 3]; sr8_3[ 4] <= sr8_3[14] ^ sr8_3[12] ^ sr8_3[11] ^ sr8_3[ 9] ^ sr8_3[ 8] ^ sr8_3[ 7] ^ sr8_3[ 6] ^ sr8_3[ 4]; sr8_3[ 5] <= sr8_3[15] ^ sr8_3[13] ^ sr8_3[12] ^ sr8_3[ 9] ^ sr8_3[ 7] ^ sr8_3[ 6] ^ sr8_3[ 5]; sr8_3[ 6] <= sr8_3[14] ^ sr8_3[13] ^ sr8_3[10] ^ sr8_3[ 8] ^ sr8_3[ 7] ^ sr8_3[ 6] ^ sr8_3[ 0]; sr8_3[ 7] <= sr8_3[15] ^ sr8_3[14] ^ sr8_3[11] ^ sr8_3[ 9] ^ sr8_3[ 8] ^ sr8_3[ 7] ^ sr8_3[ 1]; sr8_3[ 8] <= sr8_3[15] ^ sr8_3[12] ^ sr8_3[10] ^ sr8_3[ 9] ^ sr8_3[ 8] ^ sr8_3[ 2] ^ sr8_3[ 0]; sr8_3[ 9] <= sr8_3[13] ^ sr8_3[11] ^ sr8_3[10] ^ sr8_3[ 9] ^ sr8_3[ 3] ^ sr8_3[ 1]; sr8_3[10] <= sr8_3[14] ^ sr8_3[12] ^ sr8_3[11] ^ sr8_3[10] ^ sr8_3[ 4] ^ sr8_3[ 2] ^ sr8_3[ 0]; sr8_3[11] <= sr8_3[15] ^ sr8_3[13] ^ sr8_3[12] ^ sr8_3[11] ^ sr8_3[ 5] ^ sr8_3[ 3] ^ sr8_3[ 1]; sr8_3[12] <= sr8_3[14] ^ sr8_3[13] ^ sr8_3[12] ^ sr8_3[ 6] ^ sr8_3[ 4] ^ sr8_3[ 2]; sr8_3[13] <= sr8_3[15] ^ sr8_3[14] ^ sr8_3[13] ^ sr8_3[ 7] ^ sr8_3[ 5] ^ sr8_3[ 3]; sr8_3[14] <= sr8_3[15] ^ sr8_3[14] ^ sr8_3[ 8] ^ sr8_3[ 6] ^ sr8_3[ 4]; sr8_3[15] <= sr8_3[15] ^ sr8_3[ 9] ^ sr8_3[ 7] ^ sr8_3[ 5]; end
end //=====================
always@(posedge I_clk or negedge I_rst_n)
begin if(!I_rst_n) scrm_byte0 <= 8'd0 ; else if(I_kcode[0] == 1'b0)begin scrm_byte0[ 0] <= I_data[ 0] ^ sr8_0[15];scrm_byte0[ 1] <= I_data[ 1] ^ sr8_0[14];scrm_byte0[ 2] <= I_data[ 2] ^ sr8_0[13];scrm_byte0[ 3] <= I_data[ 3] ^ sr8_0[12]; scrm_byte0[ 4] <= I_data[ 4] ^ sr8_0[11];scrm_byte0[ 5] <= I_data[ 5] ^ sr8_0[10]; scrm_byte0[ 6] <= I_data[ 6] ^ sr8_0[ 9]; scrm_byte0[ 7] <= I_data[ 7] ^ sr8_0[ 8]; end elsescrm_byte0 <= I_data[7:0];
end always@(posedge I_clk or negedge I_rst_n)
begin if(!I_rst_n) scrm_byte1 <= 8'd0 ; else if(I_kcode[1] == 1'b0)begin scrm_byte1[ 0] <= I_data[ 8] ^ sr8_1[15];scrm_byte1[ 1] <= I_data[ 9] ^ sr8_1[14];scrm_byte1[ 2] <= I_data[10] ^ sr8_1[13];scrm_byte1[ 3] <= I_data[11] ^ sr8_1[12]; scrm_byte1[ 4] <= I_data[12] ^ sr8_1[11];scrm_byte1[ 5] <= I_data[13] ^ sr8_1[10]; scrm_byte1[ 6] <= I_data[14] ^ sr8_1[ 9]; scrm_byte1[ 7] <= I_data[15] ^ sr8_1[ 8]; end elsescrm_byte1 <= I_data[15:8];
end always@(posedge I_clk or negedge I_rst_n)
begin if(!I_rst_n) scrm_byte2 <= 8'd0 ; else if(I_kcode[2] == 1'b0)begin scrm_byte2[ 0] <= I_data[16] ^ sr8_2[15];scrm_byte2[ 1] <= I_data[17] ^ sr8_2[14];scrm_byte2[ 2] <= I_data[18] ^ sr8_2[13];scrm_byte2[ 3] <= I_data[19] ^ sr8_2[12]; scrm_byte2[ 4] <= I_data[20] ^ sr8_2[11];scrm_byte2[ 5] <= I_data[21] ^ sr8_2[10]; scrm_byte2[ 6] <= I_data[22] ^ sr8_2[ 9]; scrm_byte2[ 7] <= I_data[23] ^ sr8_2[ 8]; end elsescrm_byte2 <= I_data[23:16];
end always@(posedge I_clk or negedge I_rst_n)
begin if(!I_rst_n) scrm_byte3 <= 8'd0 ; else if(I_kcode[3] == 1'b0)begin scrm_byte3[ 0] <= I_data[24] ^ sr8_3[15];scrm_byte3[ 1] <= I_data[25] ^ sr8_3[14];scrm_byte3[ 2] <= I_data[26] ^ sr8_3[13];scrm_byte3[ 3] <= I_data[27] ^ sr8_3[12]; scrm_byte3[ 4] <= I_data[28] ^ sr8_3[11];scrm_byte3[ 5] <= I_data[29] ^ sr8_3[10]; scrm_byte3[ 6] <= I_data[30] ^ sr8_3[ 9]; scrm_byte3[ 7] <= I_data[31] ^ sr8_3[ 8]; end elsescrm_byte3 <= I_data[31:24];
end //----------------------
always@(posedge I_clk or negedge I_rst_n)
begin if(!I_rst_n) beginscrm_kcode_d1 <= 4'd0;scrm_kcode_d2 <= 4'd0;scrm_data_d1 <= 32'd0;scrm_data_d2 <= 32'd0;endelsebeginscrm_kcode_d1 <= I_kcode_d1;scrm_kcode_d2 <= scrm_kcode_d1;scrm_data_d1 <= {scrm_byte3,scrm_byte2,scrm_byte1,scrm_byte0};scrm_data_d2 <= scrm_data_d1;end
endassign O_kcode = (SEQUENCY == 2'd0) ? scrm_kcode_d2 :(SEQUENCY == 2'd1) ? {scrm_kcode_d1[0],scrm_kcode_d2[3:1]} : (SEQUENCY == 2'd2) ? {scrm_kcode_d1[1:0],scrm_kcode_d2[3:2]} : (SEQUENCY == 2'd3) ? {scrm_kcode_d1[2:0],scrm_kcode_d2[3]} : scrm_kcode_d2;
assign O_data = (SEQUENCY == 2'd0) ? scrm_data_d2 :(SEQUENCY == 2'd1) ? {scrm_data_d1[7:0],scrm_data_d2[31:8]} : (SEQUENCY == 2'd2) ? {scrm_data_d1[15:0],scrm_data_d2[31:16]} : (SEQUENCY == 2'd3) ? {scrm_data_d1[23:0],scrm_data_d2[31:24]} : scrm_data_d2;endmodule
解扰descramble模块中的LFSR直接根据DP协议附录中参考代码进行迭代,一共四组数据,第一组就是移位8个时钟周期的LFSR输出,依次类推,第二组就是移位16个时钟周期的LFSR输出,第三组就是移位24个时钟周期的LFSR输出,第四组就是移位32个时钟周期的LFSR输出。注意,采用这种方式实现,每组LFSR的复位初始值都相同。
因为加扰和解扰使用的是相同的电路结构,所以此解扰descramble模块也可以做加扰scramble模块使用。此代码可以在实际应用中使用。
module descramble
( input I_rst_n ,//low activeinput I_clk ,input [32/8-1:0] I_kcode ,input [32-1:0] I_data ,//low byte firstoutput [32/8-1:0] O_kcode , output [32-1:0] O_data //descramble
);localparam SR_SYM = 8'h1C; //K28.0localparam N = 4;// Symbols per lane//=====================
wire[15:0] sri[0:3];//四组LFSR 级联
reg [15:0] sro[0:3];
reg [15:0] sro_hi; wire[3:0] k_in;
wire[7:0] d_in[0:3]; //数据按字节分组wire[3:0] sr_symbl;
wire[3:0] sr_reset; reg [3:0] k_out;
reg [7:0] d_out[0:3];genvar i;
integer j;//====================
assign k_in[0] = I_kcode[0];
assign k_in[1] = I_kcode[1];
assign k_in[2] = I_kcode[2];
assign k_in[3] = I_kcode[3];
assign d_in[0] = I_data[ 7: 0];
assign d_in[1] = I_data[15: 8];
assign d_in[2] = I_data[23:16];
assign d_in[3] = I_data[31:24];//=====================
//SR symbol detect
assign sr_reset[0] = (k_in[0] & (d_in[0] == SR_SYM)) ? 1'b1 : 1'b0;
assign sr_reset[1] = (k_in[1] & (d_in[1] == SR_SYM)) ? 1'b1 : 1'b0;
assign sr_reset[2] = (k_in[2] & (d_in[2] == SR_SYM)) ? 1'b1 : 1'b0;
assign sr_reset[3] = (k_in[3] & (d_in[3] == SR_SYM)) ? 1'b1 : 1'b0;//=====================
//LFSR 并行结构,参考DP协议手册
assign sri[0] = sro_hi;
assign sri[1] = sro[0];
assign sri[2] = sro[1];
assign sri[3] = sro[2];// LFSR
always@(*)
begin if(sr_reset[0])sro[0] <= 16'hffff ; //16'hfffe ;16'hffff ;elsebegin sro[0][ 0] <= sri[0][ 8]; sro[0][ 1] <= sri[0][ 9]; sro[0][ 2] <= sri[0][10]; sro[0][ 3] <= sri[0][11] ^ sri[0][ 8]; sro[0][ 4] <= sri[0][12] ^ sri[0][ 9] ^ sri[0][ 8]; sro[0][ 5] <= sri[0][13] ^ sri[0][10] ^ sri[0][ 9] ^ sri[0][ 8]; sro[0][ 6] <= sri[0][14] ^ sri[0][11] ^ sri[0][10] ^ sri[0][ 9]; sro[0][ 7] <= sri[0][15] ^ sri[0][12] ^ sri[0][11] ^ sri[0][10]; sro[0][ 8] <= sri[0][ 0] ^ sri[0][13] ^ sri[0][12] ^ sri[0][11]; sro[0][ 9] <= sri[0][ 1] ^ sri[0][14] ^ sri[0][13] ^ sri[0][12]; sro[0][10] <= sri[0][ 2] ^ sri[0][15] ^ sri[0][14] ^ sri[0][13]; sro[0][11] <= sri[0][ 3] ^ sri[0][15] ^ sri[0][14]; sro[0][12] <= sri[0][ 4] ^ sri[0][15]; sro[0][13] <= sri[0][ 5]; sro[0][14] <= sri[0][ 6]; sro[0][15] <= sri[0][ 7]; end
end always@(*)
begin if(sr_reset[1])sro[1] <= 16'hffff ; //16'hfffe ;16'hffff ;elsebegin sro[1][ 0] <= sri[1][ 8]; sro[1][ 1] <= sri[1][ 9]; sro[1][ 2] <= sri[1][10]; sro[1][ 3] <= sri[1][11] ^ sri[1][ 8]; sro[1][ 4] <= sri[1][12] ^ sri[1][ 9] ^ sri[1][ 8]; sro[1][ 5] <= sri[1][13] ^ sri[1][10] ^ sri[1][ 9] ^ sri[1][ 8]; sro[1][ 6] <= sri[1][14] ^ sri[1][11] ^ sri[1][10] ^ sri[1][ 9]; sro[1][ 7] <= sri[1][15] ^ sri[1][12] ^ sri[1][11] ^ sri[1][10]; sro[1][ 8] <= sri[1][ 0] ^ sri[1][13] ^ sri[1][12] ^ sri[1][11]; sro[1][ 9] <= sri[1][ 1] ^ sri[1][14] ^ sri[1][13] ^ sri[1][12]; sro[1][10] <= sri[1][ 2] ^ sri[1][15] ^ sri[1][14] ^ sri[1][13]; sro[1][11] <= sri[1][ 3] ^ sri[1][15] ^ sri[1][14]; sro[1][12] <= sri[1][ 4] ^ sri[1][15]; sro[1][13] <= sri[1][ 5]; sro[1][14] <= sri[1][ 6]; sro[1][15] <= sri[1][ 7]; end
end always@(*)
begin if(sr_reset[2])sro[2] <= 16'hffff ; //16'hfffe ;16'hffff ;elsebegin sro[2][ 0] <= sri[2][ 8]; sro[2][ 1] <= sri[2][ 9]; sro[2][ 2] <= sri[2][10]; sro[2][ 3] <= sri[2][11] ^ sri[2][ 8]; sro[2][ 4] <= sri[2][12] ^ sri[2][ 9] ^ sri[2][ 8]; sro[2][ 5] <= sri[2][13] ^ sri[2][10] ^ sri[2][ 9] ^ sri[2][ 8]; sro[2][ 6] <= sri[2][14] ^ sri[2][11] ^ sri[2][10] ^ sri[2][ 9]; sro[2][ 7] <= sri[2][15] ^ sri[2][12] ^ sri[2][11] ^ sri[2][10]; sro[2][ 8] <= sri[2][ 0] ^ sri[2][13] ^ sri[2][12] ^ sri[2][11]; sro[2][ 9] <= sri[2][ 1] ^ sri[2][14] ^ sri[2][13] ^ sri[2][12]; sro[2][10] <= sri[2][ 2] ^ sri[2][15] ^ sri[2][14] ^ sri[2][13]; sro[2][11] <= sri[2][ 3] ^ sri[2][15] ^ sri[2][14]; sro[2][12] <= sri[2][ 4] ^ sri[2][15]; sro[2][13] <= sri[2][ 5]; sro[2][14] <= sri[2][ 6]; sro[2][15] <= sri[2][ 7]; end
end always@(*)
begin if(sr_reset[3])sro[3] <= 16'hffff ; //16'hfffe ;16'hffff ;elsebegin sro[3][ 0] <= sri[3][ 8]; sro[3][ 1] <= sri[3][ 9]; sro[3][ 2] <= sri[3][10]; sro[3][ 3] <= sri[3][11] ^ sri[3][ 8]; sro[3][ 4] <= sri[3][12] ^ sri[3][ 9] ^ sri[3][ 8]; sro[3][ 5] <= sri[3][13] ^ sri[3][10] ^ sri[3][ 9] ^ sri[3][ 8]; sro[3][ 6] <= sri[3][14] ^ sri[3][11] ^ sri[3][10] ^ sri[3][ 9]; sro[3][ 7] <= sri[3][15] ^ sri[3][12] ^ sri[3][11] ^ sri[3][10]; sro[3][ 8] <= sri[3][ 0] ^ sri[3][13] ^ sri[3][12] ^ sri[3][11]; sro[3][ 9] <= sri[3][ 1] ^ sri[3][14] ^ sri[3][13] ^ sri[3][12]; sro[3][10] <= sri[3][ 2] ^ sri[3][15] ^ sri[3][14] ^ sri[3][13]; sro[3][11] <= sri[3][ 3] ^ sri[3][15] ^ sri[3][14]; sro[3][12] <= sri[3][ 4] ^ sri[3][15]; sro[3][13] <= sri[3][ 5]; sro[3][14] <= sri[3][ 6]; sro[3][15] <= sri[3][ 7]; end
end always@(posedge I_clk or negedge I_rst_n)
begin if(!I_rst_n) sro_hi <= 16'd0;elsesro_hi = sro[3];
end//=====================
generatefor (i = 0; i < N; i=i+1)begin : gen_scrm_doutalways@(posedge I_clk or negedge I_rst_n) begin if(!I_rst_n) d_out[i] <= 8'd0;else if(k_in[i] == 1'b0)for (j = 0; j < 8; j=j+1)begin d_out[i][j] <= d_in[i][j] ^ sri[i][15-j];end elsed_out[i] <= d_in[i];end always@(posedge I_clk or negedge I_rst_n) begin if(!I_rst_n) k_out[i] <= 1'b0;elsek_out[i] <= k_in[i];endend
endgenerate assign O_kcode[0] = k_out[0];
assign O_kcode[1] = k_out[1];
assign O_kcode[2] = k_out[2];
assign O_kcode[3] = k_out[3];
assign O_data[ 7: 0] = d_out[0];
assign O_data[15: 8] = d_out[1];
assign O_data[23:16] = d_out[2];
assign O_data[31:24] = d_out[3];endmodule
仿真工程如下地址下载https://download.csdn.net/download/cjie221/90633901
仿真波形如下,经过加扰后再解扰,最终数据与原始数据一致。
相关文章:
DP 32bit位宽数据扰码实现和仿真
关于DisplayPort 1.4协议中扰码用的16-bit LFSR的移位8个时钟周期后的输出表达式我们已经用迭代的方法推导过,那么移位32个时钟周期的输出表达式同样可以迭代32次推导出,或者将移位8个时钟的输出表达式迭代3次也可以得到。以下就是移位32个时钟周期的输出…...
Electricity Market Optimization 探索系列(V)
本文参考链接link \hspace{1.6em} 众所周知, 社会福利是指消费者剩余和生产者剩余的和,也等价于产品的市值减去产品的成本,在电力市场中也非常关注社会福利这一概念,基于电力商品的同质性的特点,我们引入反价格需求函数来形象地刻…...
vue3 element-plus el-time-picker控制只显示时 分,并且控制可选的开始结束时间
只显示时分 控制只显示时分 HH:mm 控制只显示时分秒 HH:mm:ss 全部代码: <template><el-time-pickerstyle"width: 220px !important;"v-model"timeValue"format"HH:mm"value-format"HH:mm"/> </template&…...
从技术本质到未来演进:全方位解读Web的过去、现在与未来
一、Web的本质定义 Web(万维网)是一种基于**超文本传输协议(HTTP)和统一资源标识符(URI)**构建的分布式信息系统。它的核心在于通过超链接将全球范围内的信息资源连接成网状结构,使任何接入互联网的设备都能访问这些资源。Web的本质特征体现在三个方面: 跨平台性:无论…...
C++十进制与十六进制
在C中,可以使用不同的方式来表示十进制和十六进制数值。下面是一个简单的示例代码,展示了如何在C中表示和输出十进制和十六进制数值: #include <iostream> #include <iomanip>int main() {int decimalValue 255; // 十进制数值…...
MySQL基本语法
本地登录:mysql -u 用户名 -p 查看数据库:show databeases 创建库:create database 名字; 删除库:drop database 名字; 选择库:use 名字; 创建表:create table 表名 在…...
机器学习有多少种算法?当下入门需要全部学习吗?
机器学习算法如同工具箱中的器械——种类繁多却各有专攻。面对数百种公开算法,新手常陷入"学不完"的焦虑。本文将拆解算法体系,为初学者指明高效学习路径。 一、算法森林的全景地图 机器学习算法可按四大维度分类: 监督学习&#…...
【c语言】深入理解指针2
文章目录 一、指针数组指针数组模拟二维数组 二、数组指针二维数组传参的本质 三、字符指针变量四、函数指针变量4.1. 函数指针的应用4.2 两端有趣的代码4.3. typedef关键字4.3.1 typedef 的使用4.3.2. typedef与#define对比 五、函数指针数组函数指针数组的应用 一、指针数组 …...
Nacos
Nacos是阿里巴巴的产品, 现在是SpringCloud中的一个组件。相比Eureka功能更加丰富,在国内受欢迎程度较高。 官网地址:Redirecting to: https://nacos.io/ GitHub: https://github.com/alibaba/nacos 1.Nacos快入门 Nacos可以直…...
Linux,redis群集模式,主从复制,读写分离
redis的群集模式 主从模式 (单项复制,主复制到从) 一主两从 一台主机上的一主两从 需要修改三个配置文件 主要端口不一样 redis-8001.conf redis-8002.conf redis-8003.conf 哨兵模式 分布式集群模式 redis 安装部署 1,下载…...
《手环表带保养全攻略:材质、清洁与化学品避坑指南》
系列文章目录 文章目录 系列文章目录前言一、表带材质特性与专属养护方案二、清洁剂使用红黑榜三、家庭清洁实验:化学反应警示录四、保养实践方法论总结 前言 手环作为现代生活的智能伴侣,表带材质选择丰富多样。从柔软亲肤的皮质到耐用耐磨的金属&…...
【Leetcode 每日一题 - 补卡】1534. 统计好三元组
问题背景 给你一个整数数组 a r r arr arr,以及 a 、 b 、 c a、b 、c a、b、c 三个整数。请你统计其中好三元组的数量。 如果三元组 ( a r r [ i ] , a r r [ j ] , a r r [ k ] ) (arr[i], arr[j], arr[k]) (arr[i],arr[j],arr[k]) 满足下列全部条件ÿ…...
医疗设备预测性维护合规架构:从法规遵循到技术实现的深度解析
在医疗行业数字化转型加速推进的当下,医疗设备预测性维护已成为提升设备可用性、保障医疗安全的核心技术。然而,该技术的有效落地必须建立在严格的合规框架之上。医疗设备直接关乎患者生命健康,其维护过程涉及医疗法规、数据安全、质量管控等…...
如何在 IntelliJ IDEA 中安装 FindBugs-IDEA 1.0.1
以下是 FindBugs-IDEA 1.0.1 插件在 IntelliJ IDEA 中的安装步骤(适用于较旧版本的 IDEA,新版本可能需使用替代插件如 SpotBugs): 方法一:手动下载安装(适用于无法通过市场安装的情况) 下载插件…...
小车正常但是加载不出地图 找不到mapserver
Request for map failed; trying again... 找不到mapserver 原因: bash [ERROR] [1744895448.714854952]: failed to open image file "/home/liyb/catkin_ws/src/nav_demo/map/crossing.pgm": Couldnt open /home/xxx/catkin_ws/src/nav_demo/map/cr…...
无头开发模式
“无头”开发模式(Headless Development Mode)是指在没有直接连接物理显示器(monitor)、键盘或鼠标等输入输出设备的情况下,通过远程工具(如 SSH、SCP、rsync、VNC 或 Web 界面)对设备进行开发、…...
DAY 47 leetcode 232--栈与队列.用栈实现队列
题号232 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty): class MyQueue {Stack<Integer> stackIn;Stack<Integer> stackOut;/** Initialize your data structure here. */pu…...
SpringAI+DeepSeek大模型应用开发——4 对话机器人
目录 项目初始化 pom文件 配置模型 ChatClient 同步调用 流式调用 日志功能 对接前端 解决跨域 会话记忆功能 ChatMemory 添加会话记忆功能 会话历史 管理会话id 保存会话id 查询会话历史 完善会话记忆 定义可序列…...
leetcode0058. 最后一个单词的长度-easy
1 题目:最后一个单词的长度 官方标定难度:易 给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。 示例 1&#x…...
深入理解 Linux top 命令:从字段解读到性能诊断
系统或产品都需要部署到服务器或容器上运行,而服务器的运行效率直接影响到系统的稳定性和用户体验。因此,服务器的性能监控与分析就显得尤为重要。 在实际运维和性能测试过程中,我们可以从以下关键的几个方面入手进行系统监控与分析(网络延迟分析暂时先略过): CPU 使用率…...
[特殊字符] UnionFS(联合文件系统)原理解析:容器背后的存储技术
🔍 UnionFS(联合文件系统)原理解析:容器背后的存储技术 💡 什么是 UnionFS? UnionFS(联合文件系统) 是一种可以将多个不同来源的文件系统“合并”在一起的技术。它的核心思想是&am…...
部署若依前后端分离
参考部署:https://blog.csdn.net/qq_46073825/article/details/128716794?spm1001.2014.3001.5502 1.连接mysql(windows版本) 2.更新数据库用户为远程可连接 3.redis下载地址 https://github.com/tporadowski/redis/releases 5执行npm init 或者npm install --r…...
用Python Pandas高效操作数据库:从查询到写入的完整指南
一、环境准备与数据库连接 1.1 安装依赖库 pip install pandas sqlalchemy psycopg2 # PostgreSQL # 或 pip install pandas sqlalchemy pymysql # MySQL # 或 pip install pandas sqlalchemy # SQLite 1.2 创建数据库引擎 通过SQLAlchemy创建统一接口:…...
eventBus 事件中心管理组件间的通信
EventBus(事件总线)是Vue中用于实现非父子组件间通信的轻量级方案,通过一个中央Vue实例管理事件的发布与订阅。 一、基本使用步骤 1.创建EventBus实例 推荐单独创建文件(如event-bus.js)导出实例,避免全…...
某客户ORA-600 导致数据库反复重启问题分析
上班期间,收到业务反馈,测试环境数据库连接报错。 查看数据库alert日志,发现从中午的时候就出现了重启。并且在17时20分左右又发生了重启: 同时,在重启前alert日志中出现了ORA-600报错,相关报错在trc文件中…...
LeetCode 2176.统计数组中相等且可以被整除的数对:两层遍历模拟
【LetMeFly】2176.统计数组中相等且可以被整除的数对:两层遍历模拟 力扣题目链接:https://leetcode.cn/problems/count-equal-and-divisible-pairs-in-an-array/ 给你一个下标从 0 开始长度为 n 的整数数组 nums 和一个整数 k ,请你返回满足…...
Vue项目Webpack Loader全解析:从原理到实战配置指南
Vue项目Webpack Loader全解析:从原理到实战配置指南 前言 在Vue项目的开发与构建中,Webpack Loader扮演着资源转换的核心角色。无论是单文件组件(SFC)的解析、样式预处理,还是静态资源的优化,都离不开Loa…...
Vscode --- LinuxPrereqs │远程主机可能不符合 glibc 和 libstdc++ Vs code 服务器的先决条件
打开vscode连接远程linux服务器,发现连接失败,并出现如下报错信息: 原因是: vscode 官网公告如下:2025 年 3 月 (版本 1.99) - VSCode 编辑器 版本1.97 官网公告如下:链接 版本1.98 官网公告如下&am…...
大数据常见的模型定义及应用场景建议╮(╯▽╰)╭
以下是常见的大数据模型类型及其分析方法: 1. 描述性模型 1.1 定义 描述性模型:用于描述数据的现状和历史趋势,帮助理解数据的特征和模式。 1.2 常见模型 统计摘要:均值、中位数、标准差等。数据可视化:直方图、散…...
红宝书第四十八讲:实时通信双雄:Socket.IO Meteor 的奇妙旅程
红宝书第四十八讲:实时通信双雄:Socket.IO & Meteor 的奇妙旅程 资料取自《JavaScript高级程序设计(第5版)》。 查看总目录:红宝书学习大纲 一、实时通信基础 1. WebSocket与HTTP对比 传统HTTP请求类似送信&…...
【数字图像处理】图像分割(1)
图像分割定义 把图像分成若干个特定的、具有独特性质的区域,并提出感兴趣目标的技术和过程 图像分割概述 一幅图像通常是由代表物体的图案与背景组成,简称物体与背景 图像分割的本质:将图像按照区域内的一致性和区域间的不一致性进行分类的过…...
VFlash的自动化和自定义动作
文章目录 一、automation 自动化二、custom actions 自定义动作常用方法如何选择要发送的诊断请求CustomActionValueList 作用Pre Action和Post Action之间交换信息 提示:如何打印软件中变量报错:无法打开源文件 Windows.h stdio.h conio.h报错ÿ…...
pytorch学习02
自动微分 自动微分模块torch.autograd负责自动计算张量操作的梯度,具有自动求导功能。自动微分模块是构成神经网络训练的必要模块,可以实现网络权重参数的更新,使得反向传播算法的实现变得简单而高效。 1. 基础概念 张量 Torch中一切皆为张…...
TV板卡维修技术【四】
【一】热成像松香的结合快速定位短路位置 发现电路短路,但是无法定位到大概位置,可以采用烧机法: 热成像大致定位,松香准确定位: 可以很快找到这种小陶瓷电容短路的故障: 测量电路是否有大短路,…...
Rust生命周期、文件与IO
文章目录 Rust生命周期生命周期注释结构体如何使用字符串静态生命周期 Rust文件与IO接收命令行参数命令行输入文件读取文件写入 Rust生命周期 终于讲到Rust最重要的机制之一了,生命周期机制 我们先复习一下垂悬引用 {let r;{let x 5;r &x;}println!("…...
22、字节与字符的概念以及二者有什么区别?
1、概念 字节(byte) 定义:字节是计算机信息技术中用于计量存储容量和传输容量的一种单位,通常由8个二进制位(bit)组成。 作用:字节是计算机存储和处理信息的基本单位,用于衡量数据…...
APP端测试
一、功能测试 1. 核心测试点 安装/卸载/升级:验证不同安装方式(应用商店/APK/IPA) 注册登录:多种登录方式测试(手机号、第三方账号) 核心业务流程:支付流程、内容发布等关键路径 中断测试&a…...
Langchain-构建向量数据库和检索器
向量数据库安装 pip install langchain-chroma 文档》向量存储》向量数据库。 和0416 提示词工程相同。 初始化 import osfrom langchain_chroma import Chroma from langchain_community.chat_message_histories import ChatMessageHistory from langchain_core.documents im…...
PPT无法编辑怎么办?原因及解决方法全解析
在日常办公中,我们经常会遇到需要编辑PPT的情况。然而,有时我们会发现PPT文件无法编辑,这可能由多种原因引起。今天我们来看看PPT无法编辑的几种常见原因,并提供实用的解决方法,帮助你轻松应对。 原因1:文…...
PH热榜 | 2025-04-17
1. Mailgo 标语:一款利用人工智能的冷邮件平台,能够提升邮件送达率。 介绍:Mailgo将AI线索寻找助手、智能日程安排和预热账户集成到一个直观的平台上——帮助销售团队和创业者高效到达客户邮箱,轻松扩展业务,并加快转…...
maptalks矩形绘制结束后,获取最大经度最大纬度,最小经度最小纬度,从左上角开始依次获取并展示坐标
maptalks矩形绘制结束后,获取最大经度最大纬度,最小经度最小纬度,从左上角开始依次获取并展示坐标 重点 // 获取绘制的矩形图形对象const rectangle param.geometry;// 获取矩形外接矩形范围(西南角/东北角坐标)cons…...
网页图像优化:现代格式与响应式技巧
网页图像优化:现代格式与响应式技巧 网页图像如果处理不好,很容易拖慢加载速度,影响用户体验。这篇文章聊聊怎么用现代图像格式和响应式技巧,让你的网站图片加载更快、效果更好。 推荐的图像格式 选对图像格式,能在保…...
python中参数前**的含义
在Python中,参数前的 ** 表示该参数是一个“关键字参数”或者说是“可变关键字参数”。这种参数允许函数接受任意数量的关键字参数,并将这些参数存储在一个名为**kwargs的字典中。这使得函数可以接收任意数量的键值对参数,这在编写需要处理多…...
内存编码手册:整数与浮点数的二进制世界
1.整数在内存中的存储 之前在学习操作符的博文中,我们就已经学习了整数在内存中存储的一些基本知识,我们来快速回忆一下,并开始学习新的知识。 之前的学习中,我们知道整数的二进制表示方法有三种,即原码,…...
铷元素的市场供需情况如何?
铷元素的市场供需格局呈现出显著的稀缺性与战略价值,其供应高度依赖锂矿开采的副产品,而需求则随着高科技产业的快速发展持续攀升。以下从供应、需求、价格、政策及可持续性五个维度展开分析: 一、供应端:资源稀缺与技术瓶颈并存…...
MATLAB 程序实现了一个层次化光网络的数据传输模拟系统
% 主程序 num_pods = 4; % Pod 数量 num_racks_per_pod = 4; % 每个 Pod 的 Rack 数量 num_nodes_per_rack = 4; % 每个 Rack 的 Node 数量 max_wavelength = 50; % 可用波长数(根据冲突图动态调整) num_packets = 1000; % 模拟的…...
LFI to RCE
LFI不止可以来读取文件,还能用来RCE 在多道CTF题目中都有LFItoRCE的非预期解,下面总结一下LFI的利用姿势 1. /proc/self/environ 利用 条件:目标能读取 /proc/self/environ,并且网页中存在LFI点 利用方式: 修改请…...
QT6 源(34):随机数生成器类 QRandomGenerator 的源码阅读
(1)代码来自 qrandom.h ,结合官方的注释: #ifndef QRANDOM_H #define QRANDOM_H#include <QtCore/qalgorithms.h> #include <algorithm> // for std::generate #include <random> // for std::mt1993…...
极狐GitLab GEO 功能介绍
极狐GitLab 是 GitLab 在中国的发行版,关于中文参考文档和资料有: 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 Geo (PREMIUM SELF) Geo 是广泛分布的开发团队的解决方案,可作为灾难恢复策略的一部分提供热备份。Geo 不是 开箱…...
快速上手,OceanBase + MCP + LLM,搭建 AI 应用
在 AI 技术发展的进程中,大语言模型(LLM)凭借卓越的信息处理与推理能力广受重视。然而,数据孤岛问题仍是 LLM 面临的核心挑战。目前,LLM 的推理主要依赖于预先训练的数据和有限的上下文窗口,既无法动态访问…...