当前位置: 首页 > news >正文

DP 16bit位宽数据扰码实现和仿真

  DisplayPort 1.4协议中数据需进行扰码,扰码用到了16-bit LFSR,表达式如下。
在这里插入图片描述

  LFSR每移位8个bit后,用最高有效 8 位以相反的位顺序与一个字节数据进行异或从而实现数据加扰/解扰。
在这里插入图片描述

  我们已利用这个框图进行8个时钟周期迭代,得到了和DP1.4协议的附录E中相同的结果。
  LFSR迭代8个时钟周期输出。

R0  = b8
R1  = b9
R2  = b10
R3  = b11 ^ b8 
R4  = b12 ^ b9  ^ b8  
R5  = b13 ^ b10 ^ b9  ^ b8  
R6  = b14 ^ b11 ^ b10 ^ b9  
R7  = b15 ^ b12 ^ b11 ^ b10
R8  = b0  ^ b13 ^ b12 ^ b11
R9  = b1  ^ b14 ^ b13 ^ b12
R10 = b2  ^ b15 ^ b14 ^ b13
R11 = b3        ^ b15 ^ b14 
R12 = b4              ^ b15
R13 = b5
R14 = b6
R15 = b7

  利用最终输出表达式,只需1个时钟就可以得到LFSR移位后8个时钟以后的输出值。从而也就只需1个时钟就能完成8bit数据的扰码。
  那如果输入数据是16bit,这时进行扰码,如何在1个时钟就能完成16bit数据的扰码呢?
  我们先分析一下,16bit数据可以分成2个8bit数据,正常需要2个时钟才能完成扰码。那如果要在1个时钟内完成扰码,那么必然有1个8bit数据是与移位了16bit的LFSR的输出相异或。那么如何得到移位了16bit的LFSR的输出,是否可以将上述LFSR移位8个时钟的输出表达式迭代一次得到呢?答案是肯定的。我们来推导一下。
  首先,我们先设R(n-1)时刻的输出如下。

R(n-1)0  = b8
R(n-1)1  = b9
R(n-1)2  = b10
R(n-1)3  = b11 ^ b8 
R(n-1)4  = b12 ^ b9  ^ b8  
R(n-1)5  = b13 ^ b10 ^ b9  ^ b8  
R(n-1)6  = b14 ^ b11 ^ b10 ^ b9  
R(n-1)7  = b15 ^ b12 ^ b11 ^ b10
R(n-1)8  = b0  ^ b13 ^ b12 ^ b11
R(n-1)9  = b1  ^ b14 ^ b13 ^ b12
R(n-1)10 = b2  ^ b15 ^ b14 ^ b13
R(n-1)11 = b3        ^ b15 ^ b14 
R(n-1)12 = b4              ^ b15
R(n-1)13 = b5
R(n-1)14 = b6
R(n-1)15 = b7

  那么R(n)时刻的输出就是如下。

R(n)0  = R(n-1)8
R(n)1  = R(n-1)9
R(n)2  = R(n-1)10
R(n)3  = R(n-1)11 ^ R(n-1)8 
R(n)4  = R(n-1)12 ^ R(n-1)9  ^ R(n-1)8  
R(n)5  = R(n-1)13 ^ R(n-1)10 ^ R(n-1)9  ^ R(n-1)8  
R(n)6  = R(n-1)14 ^ R(n-1)11 ^ R(n-1)10 ^ R(n-1)9  
R(n)7  = R(n-1)15 ^ R(n-1)12 ^ R(n-1)11 ^ R(n-1)10
R(n)8  = R(n-1)0  ^ R(n-1)13 ^ R(n-1)12 ^ R(n-1)11
R(n)9  = R(n-1)1  ^ R(n-1)14 ^ R(n-1)13 ^ R(n-1)12
R(n)10 = R(n-1)2  ^ R(n-1)15 ^ R(n-1)14 ^ R(n-1)13
R(n)11 = R(n-1)3             ^ R(n-1)15 ^ R(n-1)14 
R(n)12 = R(n-1)4                        ^ R(n-1)15
R(n)13 = R(n-1)5
R(n)14 = R(n-1)6
R(n)15 = R(n-1)7

  最后我们再将R(n-1)时刻值用b值代入,并根据异或特性化简,去除相同项。最后得到如下结果。

R0  = b0  x b13 x b12 x b11
R1  = b1  x b14 x b13 x b12
R2  = b2  x b15 x b14 x b13
R3  = b3  x b0  x b15 x b14 x b13 x b12 x b11
R4  = b4  x b1  x b0  x b15 x b14 x b11
R5  = b5  x b2  x b1  x b0  x b15 x b13 x b11
R6  = b6  x b3  x b2  x b1        x b14 x b12
R7  = b7  x b4  x b3  x b2        x b15 x b13
R8  = b8  x b5  x b4  x b3              x b14
R9  = b9  x b6  x b5  x b4              x b15
R10 = b10 x b7  x b6  x b5
R11 = b11 x b8  x b7  x b6 
R12 = b12 x b9  x b8  x b7 
R13 = b13 x b10 x b9  x b8 
R14 = b14 x b11 x b10 x b9 
R15 = b15 x b12 x b11 x b10

  然后,我们再给出LFSR按上述框图迭代16个时钟周期的输出,结果一致。

R0  = b13 x b12 x b11 x b0  
R1  = b14 x b13 x b12 x b1 
R2  = b15 x b14 x b13 x b2  
R3  = b15 x b14 x b13 x b12 x b11 x b3  x b0 
R4  = b15 x b14 x b11 x b4  x b1  x b0 
R5  = b15 x b13 x b11 x b5  x b2  x b1  x b0  
R6  = b14 x b12 x b6  x b3  x b2  x b1   
R7  = b15 x b13 x b7  x b4  x b3  x b2  
R8  = b14 x b8  x b5  x b4  x b3    
R9  = b15 x b9  x b6  x b5  x b4   
R10 = b10 x b7  x b6  x b5
R11 = b11 x b8  x b7  x b6 
R12 = b12 x b9  x b8  x b7 
R13 = b13 x b10 x b9  x b8 
R14 = b14 x b11 x b10 x b9 
R15 = b15 x b12 x b11 x b10

  说明可以将LFSR移位8个时钟的输出表达式迭代1次就可以得到移位16个时钟的输出。那么同理,迭代2次就可以得到移位24个时钟的输出,迭代3次就可以得到移位32个时钟的输出。
  接下来我们实现16bit输入数据的扰码和解码。加扰scramble模块中的LFSR采用按上述框图迭代16个时钟周期的输出。注:此代码只是用于仿真,可以方便调整输出数据中SR符号的位置,实际模块中无此功能。

module scramble #
(parameter SEQUENCY  = 1'b0 //output sequency, 0:{SR,xx} //                 1:{xx,SR} 
)
( input           I_rst_n    ,//low activeinput           I_sr_rst   ,input           I_clk      ,input   [1:0]   I_kcode    ,input   [15:0]  I_data     ,//low byte firstoutput  [1:0]   O_kcode    , output  [15:0]  O_data      //scramble
);//=====================
reg  [15:0] sr8_0; 
reg  [15:0] sr8_1; reg  [7:0]  scrm_byte0;//data[7:0] first
reg  [7:0]  scrm_byte1;//data[15:8] secondreg  [1:0]  I_kcode_d1;reg  [1:0]  scrm_kcode_d1;
reg  [1:0]  scrm_kcode_d2;
reg  [15:0] scrm_data_d1;
reg  [15:0] scrm_data_d2;//====================
always@(posedge I_clk or negedge I_rst_n) 
begin if(!I_rst_n) beginI_kcode_d1 <= 2'b0;endelsebeginI_kcode_d1 <= I_kcode;end
end//=====================
//LFSR 并行结构,16次移位后
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[ 0] ^ sr8_0[13] ^ sr8_0[12] ^ sr8_0[11]; sr8_0[ 1] <= sr8_0[ 1] ^ sr8_0[14] ^ sr8_0[13] ^ sr8_0[12]; sr8_0[ 2] <= sr8_0[ 2] ^ sr8_0[15] ^ sr8_0[14] ^ sr8_0[13]; sr8_0[ 3] <= sr8_0[ 3] ^ sr8_0[ 0] ^ sr8_0[15] ^ sr8_0[14] ^ sr8_0[13] ^ sr8_0[12] ^ sr8_0[11]; sr8_0[ 4] <= sr8_0[ 4] ^ sr8_0[ 1] ^ sr8_0[ 0] ^ sr8_0[15] ^ sr8_0[14] ^ sr8_0[11]; sr8_0[ 5] <= sr8_0[ 5] ^ sr8_0[ 2] ^ sr8_0[ 1] ^ sr8_0[ 0] ^ sr8_0[15] ^ sr8_0[13] ^ sr8_0[11]; sr8_0[ 6] <= sr8_0[ 6] ^ sr8_0[ 3] ^ sr8_0[ 2] ^ sr8_0[ 1]             ^ sr8_0[14] ^ sr8_0[12];  sr8_0[ 7] <= sr8_0[ 7] ^ sr8_0[ 4] ^ sr8_0[ 3] ^ sr8_0[ 2]             ^ sr8_0[15] ^ sr8_0[13];  sr8_0[ 8] <= sr8_0[ 8] ^ sr8_0[ 5] ^ sr8_0[ 4] ^ sr8_0[ 3]                         ^ sr8_0[14]; sr8_0[ 9] <= sr8_0[ 9] ^ sr8_0[ 6] ^ sr8_0[ 5] ^ sr8_0[ 4]                         ^ sr8_0[15]; sr8_0[10] <= sr8_0[10] ^ sr8_0[ 7] ^ sr8_0[ 6] ^ sr8_0[ 5]; sr8_0[11] <= sr8_0[11] ^ sr8_0[ 8] ^ sr8_0[ 7] ^ sr8_0[ 6]; sr8_0[12] <= sr8_0[12] ^ sr8_0[ 9] ^ sr8_0[ 8] ^ sr8_0[ 7]; sr8_0[13] <= sr8_0[13] ^ sr8_0[10] ^ sr8_0[ 9] ^ sr8_0[ 8]; sr8_0[14] <= sr8_0[14] ^ sr8_0[11] ^ sr8_0[10] ^ sr8_0[ 9]; sr8_0[15] <= sr8_0[15] ^ sr8_0[12] ^ sr8_0[11] ^ sr8_0[10]; 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[ 0] ^ sr8_1[13] ^ sr8_1[12] ^ sr8_1[11]; sr8_1[ 1] <= sr8_1[ 1] ^ sr8_1[14] ^ sr8_1[13] ^ sr8_1[12]; sr8_1[ 2] <= sr8_1[ 2] ^ sr8_1[15] ^ sr8_1[14] ^ sr8_1[13]; sr8_1[ 3] <= sr8_1[ 3] ^ sr8_1[ 0] ^ sr8_1[15] ^ sr8_1[14] ^ sr8_1[13] ^ sr8_1[12] ^ sr8_1[11]; sr8_1[ 4] <= sr8_1[ 4] ^ sr8_1[ 1] ^ sr8_1[ 0] ^ sr8_1[15] ^ sr8_1[14] ^ sr8_1[11]; sr8_1[ 5] <= sr8_1[ 5] ^ sr8_1[ 2] ^ sr8_1[ 1] ^ sr8_1[ 0] ^ sr8_1[15] ^ sr8_1[13] ^ sr8_1[11]; sr8_1[ 6] <= sr8_1[ 6] ^ sr8_1[ 3] ^ sr8_1[ 2] ^ sr8_1[ 1]             ^ sr8_1[14] ^ sr8_1[12];  sr8_1[ 7] <= sr8_1[ 7] ^ sr8_1[ 4] ^ sr8_1[ 3] ^ sr8_1[ 2]             ^ sr8_1[15] ^ sr8_1[13];  sr8_1[ 8] <= sr8_1[ 8] ^ sr8_1[ 5] ^ sr8_1[ 4] ^ sr8_1[ 3]                         ^ sr8_1[14]; sr8_1[ 9] <= sr8_1[ 9] ^ sr8_1[ 6] ^ sr8_1[ 5] ^ sr8_1[ 4]                         ^ sr8_1[15]; sr8_1[10] <= sr8_1[10] ^ sr8_1[ 7] ^ sr8_1[ 6] ^ sr8_1[ 5]; sr8_1[11] <= sr8_1[11] ^ sr8_1[ 8] ^ sr8_1[ 7] ^ sr8_1[ 6]; sr8_1[12] <= sr8_1[12] ^ sr8_1[ 9] ^ sr8_1[ 8] ^ sr8_1[ 7]; sr8_1[13] <= sr8_1[13] ^ sr8_1[10] ^ sr8_1[ 9] ^ sr8_1[ 8]; sr8_1[14] <= sr8_1[14] ^ sr8_1[11] ^ sr8_1[10] ^ sr8_1[ 9]; sr8_1[15] <= sr8_1[15] ^ sr8_1[12] ^ sr8_1[11] ^ sr8_1[10]; 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) beginscrm_kcode_d1 <= 2'd0;scrm_kcode_d2 <= 2'd0;scrm_data_d1  <= 16'd0;scrm_data_d2  <= 16'd0;endelsebeginscrm_kcode_d1 <= I_kcode_d1;scrm_kcode_d2 <= scrm_kcode_d1;scrm_data_d1  <= {scrm_byte1,scrm_byte0};scrm_data_d2  <= scrm_data_d1;end
endassign O_kcode = (SEQUENCY == 1'b0) ? scrm_kcode_d2 :(SEQUENCY == 1'b1) ? {scrm_kcode_d1[0],scrm_kcode_d2[1]} : scrm_kcode_d2;
assign O_data  = (SEQUENCY == 1'b0) ? scrm_data_d2 :(SEQUENCY == 1'b1) ? {scrm_data_d1[7:0],scrm_data_d2[15:8]} : scrm_data_d2;endmodule

  解扰descramble模块中的LFSR采用根据DP协议附录中参考代码并行迭代一次输出。因为加扰和解扰使用的是相同的电路结构,所以此解扰descramble模块也可以做加扰scramble模块使用。此代码可以在实际应用中使用。

module descramble 
( input				I_rst_n    ,//low activeinput				I_clk      ,input	[16/8-1:0]	I_kcode    ,input	[16-1:0]	I_data     ,//low byte firstoutput	[16/8-1:0]	O_kcode    , output	[16-1:0]	O_data      
);localparam SR_SYM = 8'h1C;  //K28.0localparam N = 2;// Symbols per lane//=====================
wire[15:0]	sri[0:1];//两组LFSR 级联
reg [15:0]	sro[0:1];
reg	[15:0]	sro_hi; wire[1:0]	k_in;
wire[7:0]	d_in[0:1]; //数据按字节分组wire[1:0]	sr_symbl;
wire[1:0]	sr_reset; reg	[1:0]	k_out;
reg	[7:0]	d_out[0:1];genvar i;
integer j;//====================
assign k_in[0] = I_kcode[0];
assign k_in[1] = I_kcode[1];
assign d_in[0] = I_data[ 7: 0];
assign d_in[1] = I_data[15: 8];//=====================
//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;//=====================
//LFSR 并行结构,参考DP协议手册
assign sri[0] = sro_hi;
assign sri[1] = sro[0];// 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@(posedge I_clk or negedge I_rst_n) 
begin if(!I_rst_n) sro_hi <= 16'd0;elsesro_hi = sro[1];
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_data[ 7: 0] = d_out[0];
assign O_data[15: 8] = d_out[1];endmodule

  仿真工程如下地址下载https://download.csdn.net/download/cjie221/90623678
  仿真波形如下,经过加扰后再解扰,最终数据与原始数据一致。
在这里插入图片描述

相关文章:

DP 16bit位宽数据扰码实现和仿真

DisplayPort 1.4协议中数据需进行扰码&#xff0c;扰码用到了16-bit LFSR&#xff0c;表达式如下。 LFSR每移位8个bit后&#xff0c;用最高有效 8 位以相反的位顺序与一个字节数据进行异或从而实现数据加扰/解扰。 我们已利用这个框图进行8个时钟周期迭代&#xff0c;得到了和…...

力扣每日打卡 1534. 统计好三元组 (简单)

力扣 1534. 统计好三元组 简单 前言一、题目内容二、解题方法1. 暴力解法2.官方题解2.1 方法一&#xff1a;枚举2.2 方法二&#xff1a;枚举优化 前言 这是刷算法题的第十二天&#xff0c;用到的语言是JS 题目&#xff1a;力扣 1534. 统计好三元组 (简单) 一、题目内容 给你一…...

CExercise_13_1排序算法_1插入排序

题目&#xff1a; 请自己手动实现插入排序算法&#xff1a; // 插入排序 void insertion_sort(int arr[], int len); 然后给定一个int数组&#xff0c;实现将它从小到大进行排序。 关键点 分析&#xff1a; 在插入排序中&#xff0c;稳定性指的是排序算法能够保持相等元素的原始…...

图论--DFS搜索图/树

目录 一、图的存储结构 二、题目练习 846. 树的重心 - AcWing题 dfs&#xff0c;之前学习的回溯算法好多都是用dfs实现搜索的&#xff08;把题目抽象成树形结构来搜索&#xff09;&#xff0c;其实 回溯算法就是 深搜&#xff0c;只不过针对某一搜索场景 我们给他一个更细分…...

blender 超逼真角色daz 纹理材质 humanpro插件

https://www.youtube.com/KhanhVo-zp9lh/featured https://superhivemarket.com/products/humanpro https://superhivemarket.com/products/humanpro HUMANPRO 插件 - BLENDER HumanPro 是一款专为帮助用户轻松快速地创建高度精细逼真的人体皮肤纹理和复杂皱纹而设计的插件…...

关于响应式编程框架ReactiveUI的感悟

1.我第一个接触的MVVM框架是Caliburn Micro&#xff0c;后来接触到了ReactiveUI这种响应式编程思想的框架&#xff0c;主要说一下本人目前学习感想&#xff08;针对尽快上手使用MVVM开发WPF&#xff09;&#xff1b; 首当其冲的工具是DeepSeek&#xff0c;总结好问题直接提问&…...

Swift —— delegate 设计模式

一、什么是 delegate 模式 所谓 delegate 就是代理模式。简单来说&#xff0c;delegate 模式就是在类的函数里运行完一段代码后&#xff0c;你可以通过一个符合某个代理协议的属性来调代理的方法。其中&#xff0c;代理方法就是回调函数。 二、delegate 模式与闭包比的优势 …...

远方游子的归家记:模仿美食网页的制作与实现

前言 2023年的夏天&#xff0c;闲得无聊学了一个礼拜前端知识点。并根据所学知识点模仿制作了一篇网络上公开发布的关于家乡美食的文章。今天才想到有这个不错的案例可以分享出来&#xff0c;以供大家学习参考。 知识点简介 运用的知识点比较简单&#xff0c;常规的div盒子&…...

React JSX?

JSX JSX 是 JavaScript XML 的缩写&#xff0c;它是一种 JavaScript 的语法扩展&#xff0c;允许你在 JavaScript 中写 HTML 类似的代码&#xff0c;常用于 React 中定义 UI 组件的结构。 JSX 示例代码&#xff1a; import React from react;function App() {return (<di…...

【Pandas】pandas DataFrame iterrows

Pandas2.2 DataFrame Indexing, iteration 方法描述DataFrame.head([n])用于返回 DataFrame 的前几行DataFrame.at快速访问和修改 DataFrame 中单个值的方法DataFrame.iat快速访问和修改 DataFrame 中单个值的方法DataFrame.loc用于基于标签&#xff08;行标签和列标签&#…...

docker多架构镜像构建

docker多架构镜像构建 Docker 多架构镜像构建&#xff08;Multi-Architecture Image Build&#xff09;允许你为不同平台&#xff08;如 linux/amd64, linux/arm64, linux/arm/v7 等&#xff09;构建和推送统一的镜像标签&#xff0c;解决在不同硬件架构之间部署的问题。 Doc…...

日志查询 Less命令:/搜索

跟more命令一样&#xff0c;唯一不同的是less命令可以向上翻页&#xff0c;但是more命令不行 注意&#xff1a;按空格或F -- 进行翻页&#xff1b; 按回车 -- 一行一行往下翻&#xff1b; 按q或Q – 表示退出 Page up:一页一页向上翻&#xff1b; 向上键&#xff1a;一行一行…...

[MySQL] 事务管理(一) 事务的基本概念

1.为什么需要事务 1.1 CURD不加控制会有什么问题 我认为要解决上面的问题&#xff0c;CURD必须要有以下的属性 买票的过程必须是原子的 买票相互之间不可以收到影响 买完票需要永久有效 买前&#xff0c;买后的状态必须是确定的 2. 什么是事务&#xff1f; 事务就是一组DML语…...

rk3588 驱动开发(一)字符设备开发

3.字符设备驱动开发 3.1 什么是字符设备驱动 字符设备&#xff1a;就是一个个字节&#xff0c;按照字节流进行读写操作的设备&#xff0c;读写是按照先后顺序的。 举例子&#xff1a;IIC 按键 LED SPI LCD 等 Linux 应用程序调用驱动程序流程&#xff1a; Linux中驱动加载成功…...

【第45节】windows程序的其他反调试手段上篇

目录 引言 一、通过窗口类名和窗口名判断 二、检测调试器进程 三、父进程是否是Explorer 四、RDTSC/GetTickCount时间敏感程序段 五、StartupInfo结构的使用 六、使用BeingDebugged字段 七、 PEB.NtGlobalFlag,Heap.HeapFlags,Heap.ForceFlags 八、DebugPort:CheckRem…...

通过人类和机器人演示进行联合逆向和正向动力学的机器人训练

25年3月来自哥伦比亚大学的论文“Train Robots in a JIF: Joint Inverse and Forward Dynamics with Human and Robot Demonstrations”。 在大型机器人演示数据集上进行预训练是学习各种操作技能的强大技术&#xff0c;但通常受到收集以机器人为中心数据的高成本和复杂性限制…...

云渗透三(对象存储攻防)

对象存储是什么? 对象存储(Cloud Object Storage,COS)是腾讯云提供的⼀种存储海量⽂件的分布式存储服务,⽤户可通过⽹络随时存储和查看数据。腾讯云 COS 使所有⽤户都能使⽤具备⾼扩展性、低成本、可靠和安全的数据存储服务。 COS 通过控制台、API、SDK 和⼯具等多样化⽅…...

ShenNiusModularity项目源码学习(17:ShenNius.Admin.Mvc项目分析-2)

ShenNiusModularity项目的后台管理主页面如下图所示&#xff0c;该页面为ShenNius.Admin.Mvc项目的Views\Home\Index.cshtml&#xff0c;使用的是layuimini后台模板&#xff08;参考文献2&#xff09;&#xff0c;在layuimini的GitHub主页中提供有不同样式的页面模版链接&#…...

Sentinel源码—2.Context和处理链的初始化一

大纲 1.Sentinel底层的核心概念 2.Sentinel中Context的设计思想与源码实现 3.Java SPI机制的引入 4.Java SPI机制在Sentinel处理链中的应用 5.Sentinel默认处理链ProcessorSlot的构建 1.Sentinel底层的核心概念 (1)资源和规则 (2)Context (3)ProcessorSlot (4)Node (1…...

嵌入式C语言高级编程:OOP封装、TDD测试与防御性编程实践

一、面向对象编程(OOP) 尽管 C 语言并非面向对象编程语言&#xff0c;但借助一些编程技巧&#xff0c;也能实现面向对象编程&#xff08;OOP&#xff09;的核心特性&#xff0c;如封装、继承和多态。 1.1 封装 封装是把数据和操作数据的函数捆绑在一起&#xff0c;对外部隐藏…...

C++中unique_lock和lock_guard区别

目录 1.自动锁定与解锁机制 2.灵活性 3.所有权转移 4.可与条件变量配合使用 5.性能开销 在 C 中&#xff0c;std::unique_lock 和 std::lock_guard 都属于标准库 <mutex> 中的互斥锁管理工具&#xff0c;用于简化互斥锁的使用并确保线程安全。但它们存在一些显著区别…...

C# 使用.NET内置的 IObservable<T> 和 IObserver<T>-观察者模式

核心概念 IObservable<T> 表示 可观察的数据源&#xff08;如事件流、实时数据&#xff09;。 关键方法&#xff1a;Subscribe(IObserver<T> observer)&#xff0c;用于注册观察者。 IObserver<T> 表示 数据的接收者&#xff0c;响应数据变化。 三个核心…...

多模态大模型文字识别 vs OCR识别模型

论文简述 多模态大语言模型(Multimodal Large Language Models,简称多模态LLMs)具有高度通用性,能够处理图像描述、文档分析和自动化内容生成等多种任务。这种广泛的适用性使其在不同工业领域都受到了大量关注。 在OCR方面,多模态LLMs的表现超过了专门为OCR设计的模型。这…...

[区块链] 持久化运行区块链 | 并通过HTTP访问

实验目标 以Web服务的形式持久化运行区块链&#xff0c;并通过HTTP接口的形式实现对区块链的操作。 实验内容 构建区块链的区块对象和区块链对象。使用Flask等Web服务框架运行持久化的进程&#xff0c;实现基于HTTP接口实现新区块的添加功能以及传递区块索引查询区块链中的区…...

批量将不同位置的多个文件复制到一个文件夹

在日常工作中&#xff0c;我们常常需要将多个位置的文件集中到一个文件夹中。手动一个个复制文件既费时又容易出错。使用批量文件复制工具&#xff0c;您可以轻松将不同位置的多个文件快速复制到一个文件夹中&#xff0c;大大提高工作效率。 今天给大家介绍一下批量将不同位置的…...

CentOS 下 Zookeeper 常用命令与完整命令列表

一、服务管理命令 常用服务命令 启动 Zookeeper 服务: systemctl start zookeeper # 使用 systemd (推荐) /usr/local/zookeeper/bin/zkServer.sh start # 直接启动 停止服务: systemctl stop zookeeper /usr/local/zookeeper/bin/zkServer.sh stop 查看服务状态…...

React与Vue:哪个框架更适合入门?

React与Vue&#xff1a;选择哪个框架入门&#xff1f; 一、框架定位与发展趋势 1.1 技术背景对比 ‌React‌&#xff1a;Meta&#xff08;原Facebook&#xff09;2013年推出&#xff0c;采用声明式编程范式&#xff0c;专注构建用户界面‌Vue‌&#xff1a;尤雨溪2014年推出…...

突发!GitHub 被曝封禁中国区 IP

昨天&#xff0c;大量国内开发者发现&#xff0c;未登录状态下访问GitHub官网时&#xff0c;页面显示“Access to this site has been restricted.”&#xff0c;中国大陆及香港IP均被限制。尽管GitHub官方尚未发布声明&#xff0c;但多方实测显示&#xff1a; 猪哥亲测在已登…...

向量数据库Qdrant 安装 不使用docker

一、导读 环境&#xff1a;Ubuntu 24.04、Windows 10、WSL 2、Qdrant 1.13.4 背景&#xff1a;换了新工作&#xff0c;使用qdrant作为向量库&#xff0c;需要不使用docker安装 时间&#xff1a;20250415 说明&#xff1a;初入职&#xff0c;不了解&#xff0c;暂且记下 二、…...

基于坐标的神经表示实现零样本学习以用于快速三维多参数定量磁共振成像|文献速递-深度学习医疗AI最新文献

Title 题目 Coordinate-based neural representation enabling zero-shot learning for fast 3D multiparametric quantitative MRI 基于坐标的神经表示实现零样本学习以用于快速三维多参数定量磁共振成像 01 文献速递介绍 定量磁共振成像&#xff08;qMRI&#xff09;能…...

每日算法-250415

每日算法 - 2024-04-15: 今天我们来解决两道 LeetCode 上关于在旋转排序数组中寻找最小值的问题。 153. 寻找旋转排序数组中的最小值 题目描述 思路 核心思想是利用 二分查找。 解题过程 一个升序排序的数组&#xff08;无重复元素&#xff09;在经过若干次旋转后&#xf…...

第16届蓝桥杯省赛JavaB组真题回顾

第16届蓝桥杯省赛已经结束了&#xff0c;第一次参加也是坐牢了4个小时&#xff0c;现在还是来总结一下吧&#xff08;先声明以下的解法&#xff0c;大家可以当作一种思路来看&#xff0c;解法不一定是正解&#xff0c;只是给大家提供一种能够正常想到的思路吧&#xff09; 试题…...

[Godot] C#人物移动抖动解决方案

在写一个2D平台跳跃的游戏代码发现&#xff0c;移动的时候会抖动卡顿的厉害&#xff0c;后来研究了一下抖动问题&#xff0c;有了几种解决方案 1.垂直同步和物理插值问题 这是最常见的可能导致画面撕裂和抖动的原因&#xff0c;大家可以根据自己的需要调整项目设置&#xff0…...

hackmyvm-quick2

收集信息 arp-scan -l nmap 192.168.66.74 dirsearch -u http://192.168.66.74 -e * 访问file.php 尝试查看/etc/passwd 抓包 payload: /file.php?file=/home/andrew/.bashrc /file.php?file=/home/nick/.bashrc...

TDengine 与其他时序数据库对比:InfluxDB/TimescaleDB 选型指南(一)

引言 在当今数字化时代&#xff0c;物联网&#xff08;IoT&#xff09;、工业互联网等领域蓬勃发展&#xff0c;产生了海量的时序数据。这些数据记录了设备状态、传感器读数、业务指标等随时间变化的信息&#xff0c;对于企业的运营监控、数据分析和决策制定起着关键作用。为了…...

Jetson agx Orin 适配Xenomai4

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 目录 文章目录 前言 一、Xenomai 4 二、使用步骤 1.获取源码 2.编译源码 3、安装 4、运行效果 5、libevl 总结 前言 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了…...

Terraform - 理解 Count 和 For_Each 循环

概述 使用 Terraform 时&#xff0c;您可能需要为同一资源创建多个实例。这时 count 和 for_each 循环就派上用场了。这些循环允许您创建具有相同配置但具有不同值的多个资源。本指南将讲解如何在 Terraform 中使用 count 和 for_each 循环。 Terraform 中的 Count Terraform …...

Git本地更新和远端同步操作

1、将远端文件夹拉取到本地 从0—1&#xff1a;克隆 在文件夹空白处点击&#xff1a;Git克隆 输入url&#xff0c;克隆到本地 输入远端文件地址&#xff0c;点击确定&#xff0c;远端文件即可克隆到本地 2、拉取远端更新到本地 文件克隆到本地后&#xff0c;每次更新需…...

激活函数Softmax在不同维度上的应用 | dim参数理解

理解 Softmax 在不同维度上的应用&#xff0c;关键在于明确 Softmax 的作用以及 dim 参数的意义。Softmax 的目标是将输入张量的某些元素转换为概率分布&#xff0c;使得这些元素的和为1。dim 参数决定了沿着哪个维度进行归一化操作。 1. Softmax 的基本原理 Softmax 函数的公…...

地理人工智能中位置编码的综述:方法与应用

以下是对论文 《A Review of Location Encoding for GeoAI: Methods and Applications》 的大纲和摘要整理&#xff1a; A Review of Location Encoding for GeoAI: Methods and Applications 摘要&#xff08;Summary&#xff09; 本文系统综述了地理人工智能&#xff08;G…...

6.DJI-PSDK:psdk订阅无人机高度/速度/GPS/RTK/时间/经纬度等消息及问题解决

DJI-PSDK:psdk订阅无人机高度/速度/GPS/RTK/时间/经纬度等消息 消息订阅可以获取绝大多数无人机的动态信息,包括无人机的姿态、速度、加速度、角速度、高度、GPS 位置、云 台的角度和状态、飞行模式和飞行状态、电机和电池等各类关键信息。 这些信息并不会“一股脑儿地”全部…...

ArrayList的subList的数据仍是集合

ArrayList的subList结果不可强转成ArrayList&#xff0c;否则会抛出 ClassCastException异常 • 级别&#xff1a; 【CRITICAL】 • 规约类型&#xff1a;BUG • 最坏影响&#xff1a; 程序错误&#xff0c;抛出异常 说明&#xff1a;subList 返回的是ArrayList的内部类SubL…...

VS Code怎么换颜色

在 VS Code 中&#xff0c;你可以通过修改主题或自定义编辑器颜色来将界面改为白色。以下是几种方法&#xff1a; 方法 1&#xff1a;切换浅色主题&#xff08;推荐&#xff09; VS Code 自带多个浅色主题&#xff0c;可以直接切换&#xff1a; 按快捷键 Ctrl K&#xff0c;…...

jupyter中切换Anaconda虚拟环境

jupyter中切换虚拟环境 查看python路径 import sys sys.executable这个命令会输出当前 Notebook 使用的 Python 可执行文件的路径 2. 查看安装的包和环境信息&#xff08;前两步都在jupyter notebook中进行&#xff09; !which python !python --version !pip list将你的虚拟…...

红帽认证 Linux安全 级别

红帽认证体系将安全能力划分为‌专项技能认证‌与‌架构师路径‌&#xff0c;覆盖从基础加固到企业级安全架构设计。以下是安全相关认证的级别、核心内容及职业定位&#xff1a; 一、红帽安全认证分级与定位‌ 认证名称级别考试代码核心方向考试难度适用人群‌Red Hat Certif…...

从服务器多线程批量下载文件到本地

1、客户端安装 aria2 下载地址&#xff1a;aria2 解压文件&#xff0c;然后将文件目录添加到系统环境变量Path中&#xff0c;然后打开cmd&#xff0c;输入&#xff1a;aria2c 文件地址&#xff0c;就可以下载文件了 2、服务端配置nginx文件服务器 server {listen 8080…...

WPF 中的元素继承层次结构 ,以下是对图中内容的详细说明:

顶层基类 DispatcherObject&#xff1a;处于继承体系最顶端&#xff0c;是一个抽象类。它为 WPF 元素提供了与 Dispatcher&#xff08;调度器&#xff09;交互的能力&#xff0c;Dispatcher 负责管理线程间的消息传递&#xff0c;确保 UI 操作在正确的线程&#xff08;通常是 …...

ROS IkFast运动学插件

ikFast运动学插件生成 环境安装ROS依赖安装openrave依赖下载依赖代码工具使用urdf转dae设置精度查看模型关节生成代码生成插件 环境 ubuntu 20.04ROS版本&#xff1a;noetic 安装ROS依赖 sudo apt-get install -y ros-noetic-desktop ros-noetic-collada-urdf ros-noetic-mov…...

Flink Hive Catalog最佳实践

Flink Hive Catalog 最佳实践 一、配置与初始化 依赖管理 Hive Connector 版本对齐&#xff1a;需确保 flink-sql-connector-hive 版本与 Hive 版本严格匹配&#xff08;如 Hive 3.1.3 对应 flink-sql-connector-hive-3.1.3_2.12&#xff09;&#xff0c;同时添加 Hadoop 遮蔽…...

接口测试之postman使用指南

一、为何使用postman postman是一款简单高效的接口测试工具&#xff0c;能够很方便发送接口请求&#xff0c;易于保存接口请求脚本&#xff0c;postman提供接口响应数据比对功能&#xff0c;可以设置预期结果作断言&#xff0c;还能把测试用例放在一个集合中批量执行&#xff…...