[XILINX]ZYNQ7010_7020_软件LVDS设计


  • 若该文为原创文章,未经允许不得转载
  • 风释雪
  • QQ:627833006
  • WX:Cheng18375816918
  • CSDN博客: 风释雪FPGA
  • 知乎:风释雪FPGA

1.版本说明

日期作者版本说明
2024xxxx风释雪初始版本

2.概述

ZYNQ 7010/7020 HR/HP Bank LVDS Rx/TX;


3.目标

ZYNQ 7010 LVDS 1:7 接收代码实现;

ZYNQ 7010 LVDS 1:7 仿真环境下发送与接收实现;


4.时序

在这里插入图片描述

使用标准BT1120 内同步,将图像按照图中时序发送,其中,时钟比数据等于 1:7, 该图为标准1:7视频传输接口;

以1080P60为例: Pixel Clk = 148.5, 共4个lane, 每个lane线速度等于 : 148.5Mhz x 7bit = 1.0395Gbps;


5.分析

在这里插入图片描述

  • 从TX的角度,理解数据是怎么发送的;

  • 从RX的角度,知道数据应该怎么接收;

  • TX端GearBox 实现速度的变化(7bit数据变8bit数据),让发送数据满足oserdes要求;

  • RX端GearBox 实现速度的变化(7bit数据变8bit数据),让数据恢复原始YUV422-8BIT值;

  • LVDS 1:7 在大多数情况下无法直接发送,需要转为8bit(ZYNQ支持,但是MPSOC不支持,本文为了统一方法和讲清楚核心技术,使用8bit)

  • ISERDES/OSERDES性能要求 LineRate >= 1.0395Gbps

  • DATA_WIDTH=8 (后续MPSOC/ultrascale FPGA后续不再支持DataWidth = 7/14)

  • BITSLIP不使用 (后续MPSOC/ultrascale FPGA后续不再支持,且软件控制逻辑简单)


6.XILINX原语

  • IDELAY (调整数据延时,影响采集位置)
  • ISERDES / OSERDES (重点理解时序图)
  • IBUFDS
  • MMCM (输出时钟相位相同,频率两倍)
    重点参考UG471

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • OSERDES 数据发送 D1(A) -> D2(B) -> D3(C) -> D4(D) -> D5(E) -> D6(F) -> D7(G) -> D8(H)
  • ISERDES 数据接收 Q8(A) -> Q7(B) -> Q6(C) -> Q5(D) -> Q4(E) -> Q3(F) -> Q2(G) -> Q1(H)
        IDELAYE2 #(.CINVCTRL_SEL                       ( "FALSE"                   ), // Enable dynamic clock inversion (FALSE, TRUE).DELAY_SRC                          ( "IDATAIN"                 ), // Delay input (IDATAIN, DATAIN).HIGH_PERFORMANCE_MODE              ( "TRUE"                    ), // Reduced jitter ("TRUE"), Reduced power ("FALSE").IDELAY_TYPE                        ( "VAR_LOAD"                ), // FIXED, VARIABLE, VAR_LOAD, VAR_LOAD_PIPE.IDELAY_VALUE                       ( 0                         ), // Input delay tap setting (0-31).PIPE_SEL                           ( "FALSE"                   ), // Select pipelined mode, FALSE, TRUE.REFCLK_FREQUENCY                   ( 200.0                     ), // IDELAYCTRL clock input frequency in MHz (190.0-210.0, 290.0-310.0)..SIGNAL_PATTERN                     ( "DATA"                    )  // DATA, CLOCK input signal) IDELAYE2_DAT (.CNTVALUEOUT                        (                           ), // 5-bit output: Counter value output.IDATAIN                            ( dat_serial[i]             ), // 1-bit input: Data input from the I/O.DATAOUT                            ( dat_serial_dly[i]         ), // 1-bit output: Delayed data output.C                                  ( lvds_rx_clk               ), // 1-bit input: Clock input.CE                                 ( 1'd0                      ), // 1-bit input: Active high enable increment/decrement input.INC                                ( 1'd0                      ), // 1-bit input: Increment / Decrement tap delay input.CINVCTRL                           ( 1'd0                      ), // 1-bit input: Dynamic clock inversion input.DATAIN                             ( 1'd0                      ), // 1-bit input: Internal delay data input.LDPIPEEN                           ( 1'd1                      ), // 1-bit input: Enable PIPELINE register to load data input.LD                                 ( idly_load                 ), // 1-bit input: Load IDELAY_VALUE input.CNTVALUEIN                         ( idly_cntvalue_curr        ), // 5-bit input: Counter value input.REGRST                             ( lvds_serdes_rst           )  // 1-bit input: Active-high reset tap-delay input);ISERDESE2 #(.DATA_RATE                          ( "DDR"                     ), // DDR, SDR.DATA_WIDTH                         ( 8                         ), // Parallel data width (2-8,10,14).DYN_CLKDIV_INV_EN                  ( "FALSE"                   ), // Enable DYNCLKDIVINVSEL inversion (FALSE, TRUE).DYN_CLK_INV_EN                     ( "FALSE"                   ), // Enable DYNCLKINVSEL inversion (FALSE, TRUE).INIT_Q1                            ( 1'b0                      ),.INIT_Q2                            ( 1'b0                      ),.INIT_Q3                            ( 1'b0                      ),.INIT_Q4                            ( 1'b0                      ),.INTERFACE_TYPE                     ( "NETWORKING"              ), // MEMORY, MEMORY_DDR3, MEMORY_QDR, NETWORKING, OVERSAMPLE.IOBDELAY                           ( "BOTH"                    ), // NONE, BOTH, IBUF, IFD.NUM_CE                             ( 2                         ), // Number of clock enables (1,2).OFB_USED                           ( "FALSE"                   ), // Select OFB path (FALSE, TRUE).SERDES_MODE                        ( "MASTER"                  ), // MASTER, SLAVE.SRVAL_Q1                           ( 1'b0                      ),.SRVAL_Q2                           ( 1'b0                      ),.SRVAL_Q3                           ( 1'b0                      ),.SRVAL_Q4                           ( 1'b0                      )) ISERDESE2_DAT (.O                                  (                           ),.Q1                                 ( dat_paralle[8*i+8-1:8*i+7]),.Q2                                 ( dat_paralle[8*i+7-1:8*i+6]),.Q3                                 ( dat_paralle[8*i+6-1:8*i+5]),.Q4                                 ( dat_paralle[8*i+5-1:8*i+4]),.Q5                                 ( dat_paralle[8*i+4-1:8*i+3]),.Q6                                 ( dat_paralle[8*i+3-1:8*i+2]),.Q7                                 ( dat_paralle[8*i+2-1:8*i+1]),.Q8                                 ( dat_paralle[8*i+1-1:8*i+0]),.SHIFTOUT1                          (                           ),.SHIFTOUT2                          (                           ),.BITSLIP                            ( 1'd0                      ),.CE1                                ( 1'd1                      ),.CE2                                ( 1'd1                      ),.CLKDIVP                            ( 1'd0                      ),.CLK                                ( lvds_rx_clk_x4            ),// 1-bit input: High-speed clock.CLKB                               (~lvds_rx_clk_x4            ),// 1-bit input: High-speed secondary clock.CLKDIV                             ( lvds_rx_clk               ),// 1-bit input: Divided clock.DYNCLKDIVSEL                       ( 1'd0                      ),// 1-bit input: Dynamic CLKDIV inversion.DYNCLKSEL                          ( 1'd0                      ),// 1-bit input: Dynamic CLK/CLKB inversion.DDLY                               ( dat_serial_dly[i]         ),// 1-bit input: Serial data from IDELAYE2.D                                  ( 1'd0                      ),// 1-bit input: Data input.OFB                                ( 1'd0                      ),// 1-bit input: Data feedback from OSERDESE2.OCLK                               ( 1'd0                      ),// 1-bit input: High speed output clock used when INTERFACE_TYPE="MEMORY".OCLKB                              ( 1'd0                      ),// 1-bit input: High speed negative edge output clock.RST                                ( lvds_serdes_rst           ),// 1-bit input: Active high asynchronous reset.SHIFTIN1                           ( 1'd0                      ),.SHIFTIN2                           ( 1'd0                      ));OSERDESE2 #(.DATA_RATE_OQ                       ( "DDR"                     ), // DDR, SDR.DATA_RATE_TQ                       ( "SDR"                     ), // DDR, BUF, SDR.DATA_WIDTH                         ( 8                         ), // Parallel data width (2-8,10,14).INIT_OQ                            ( 1'b0                      ), // Initial value of OQ output (1'b0,1'b1).INIT_TQ                            ( 1'b0                      ), // Initial value of TQ output (1'b0,1'b1).SERDES_MODE                        ( "MASTER"                  ), // MASTER, SLAVE.SRVAL_OQ                           ( 1'b0                      ), // OQ output value when SR is used (1'b0,1'b1).SRVAL_TQ                           ( 1'b0                      ), // TQ output value when SR is used (1'b0,1'b1).TBYTE_CTL                          ( "FALSE"                   ), // Enable tristate byte operation (FALSE, TRUE).TBYTE_SRC                          ( "FALSE"                   ), // Tristate byte source (FALSE, TRUE).TRISTATE_WIDTH                     ( 1                         )  // 3-state converter width (1,4)) OSERDESE3_D (.OFB                                (                           ),.OQ                                 ( dat_serial    [i]         ),.SHIFTOUT1                          (                           ),.SHIFTOUT2                          (                           ),.TBYTEOUT                           (                           ),.TFB                                (                           ),.TQ                                 (                           ),.CLK                                ( lvds_tx_clk_x4            ),.CLKDIV                             ( lvds_tx_clk               ),.D1                                 ( dat_paralle[8*i+1-1:8*i+0]),.D2                                 ( dat_paralle[8*i+2-1:8*i+1]),.D3                                 ( dat_paralle[8*i+3-1:8*i+2]),.D4                                 ( dat_paralle[8*i+4-1:8*i+3]),.D5                                 ( dat_paralle[8*i+5-1:8*i+4]),.D6                                 ( dat_paralle[8*i+6-1:8*i+5]),.D7                                 ( dat_paralle[8*i+7-1:8*i+6]),.D8                                 ( dat_paralle[8*i+8-1:8*i+7]),.OCE                                ( 1'd1                      ),.RST                                (~lvds_tx_clk_locked        ),.SHIFTIN1                           ( 1'd0                      ),.SHIFTIN2                           ( 1'd0                      ),.T1                                 ( 1'd0                      ),.T2                                 ( 1'd0                      ),.T3                                 ( 1'd0                      ),.T4                                 ( 1'd0                      ),.TBYTEIN                            ( 1'd0                      ),.TCE                                ( 1'd0                      ));

7.GearBox原理

在这里插入图片描述

assign wdata0 = dat_paralle[8*1-1:8*0];
assign wdata1 = dat_paralle[8*2-1:8*1];
assign wdata2 = dat_paralle[8*3-1:8*2];
assign wdata3 = dat_paralle[8*4-1:8*3];always @ (posedge lvds_rx_clk) begincase (waddr)4'd0   : begin temp0[8*(0 +1)-1:8*(0 )] <= wdata0; temp1[8*(0 +1)-1:8*(0 )] <= wdata1; temp2[8*(0 +1)-1:8*(0 )] <= wdata2; temp3[8*(0 +1)-1:8*(0 )] <= wdata3; end4'd1   : begin temp0[8*(1 +1)-1:8*(1 )] <= wdata0; temp1[8*(1 +1)-1:8*(1 )] <= wdata1; temp2[8*(1 +1)-1:8*(1 )] <= wdata2; temp3[8*(1 +1)-1:8*(1 )] <= wdata3; end4'd2   : begin temp0[8*(2 +1)-1:8*(2 )] <= wdata0; temp1[8*(2 +1)-1:8*(2 )] <= wdata1; temp2[8*(2 +1)-1:8*(2 )] <= wdata2; temp3[8*(2 +1)-1:8*(2 )] <= wdata3; end4'd3   : begin temp0[8*(3 +1)-1:8*(3 )] <= wdata0; temp1[8*(3 +1)-1:8*(3 )] <= wdata1; temp2[8*(3 +1)-1:8*(3 )] <= wdata2; temp3[8*(3 +1)-1:8*(3 )] <= wdata3; end4'd4   : begin temp0[8*(4 +1)-1:8*(4 )] <= wdata0; temp1[8*(4 +1)-1:8*(4 )] <= wdata1; temp2[8*(4 +1)-1:8*(4 )] <= wdata2; temp3[8*(4 +1)-1:8*(4 )] <= wdata3; end4'd5   : begin temp0[8*(5 +1)-1:8*(5 )] <= wdata0; temp1[8*(5 +1)-1:8*(5 )] <= wdata1; temp2[8*(5 +1)-1:8*(5 )] <= wdata2; temp3[8*(5 +1)-1:8*(5 )] <= wdata3; end4'd6   : begin temp0[8*(6 +1)-1:8*(6 )] <= wdata0; temp1[8*(6 +1)-1:8*(6 )] <= wdata1; temp2[8*(6 +1)-1:8*(6 )] <= wdata2; temp3[8*(6 +1)-1:8*(6 )] <= wdata3; end4'd7   : begin temp0[8*(7 +1)-1:8*(7 )] <= wdata0; temp1[8*(7 +1)-1:8*(7 )] <= wdata1; temp2[8*(7 +1)-1:8*(7 )] <= wdata2; temp3[8*(7 +1)-1:8*(7 )] <= wdata3; end4'd8   : begin temp0[8*(8 +1)-1:8*(8 )] <= wdata0; temp1[8*(8 +1)-1:8*(8 )] <= wdata1; temp2[8*(8 +1)-1:8*(8 )] <= wdata2; temp3[8*(8 +1)-1:8*(8 )] <= wdata3; end4'd9   : begin temp0[8*(9 +1)-1:8*(9 )] <= wdata0; temp1[8*(9 +1)-1:8*(9 )] <= wdata1; temp2[8*(9 +1)-1:8*(9 )] <= wdata2; temp3[8*(9 +1)-1:8*(9 )] <= wdata3; end4'd10  : begin temp0[8*(10+1)-1:8*(10)] <= wdata0; temp1[8*(10+1)-1:8*(10)] <= wdata1; temp2[8*(10+1)-1:8*(10)] <= wdata2; temp3[8*(10+1)-1:8*(10)] <= wdata3; end4'd11  : begin temp0[8*(11+1)-1:8*(11)] <= wdata0; temp1[8*(11+1)-1:8*(11)] <= wdata1; temp2[8*(11+1)-1:8*(11)] <= wdata2; temp3[8*(11+1)-1:8*(11)] <= wdata3; end4'd12  : begin temp0[8*(12+1)-1:8*(12)] <= wdata0; temp1[8*(12+1)-1:8*(12)] <= wdata1; temp2[8*(12+1)-1:8*(12)] <= wdata2; temp3[8*(12+1)-1:8*(12)] <= wdata3; end4'd13  : begin temp0[8*(13+1)-1:8*(13)] <= wdata0; temp1[8*(13+1)-1:8*(13)] <= wdata1; temp2[8*(13+1)-1:8*(13)] <= wdata2; temp3[8*(13+1)-1:8*(13)] <= wdata3; enddefault: begin endendcase
endalways @ (posedge lvds_rx_clk or negedge locked) beginif (~ locked) beginwaddr <= 4'd0;end else beginwaddr <= (waddr == 4'd13) ? 4'd0 : (waddr + 1'd1);end
endalways @ (posedge vid_clk) begincase (raddr)4'd0   : begin rdata0 <= temp0[7*(0 +1)-1:7*0 ]; rdata1 <= temp1[7*(0 +1)-1:7*0 ]; rdata2 <= temp2[7*(0 +1)-1:7*0 ]; rdata3 <= temp3[7*(0 +1)-1:7*0 ]; end4'd1   : begin rdata0 <= temp0[7*(1 +1)-1:7*1 ]; rdata1 <= temp1[7*(1 +1)-1:7*1 ]; rdata2 <= temp2[7*(1 +1)-1:7*1 ]; rdata3 <= temp3[7*(1 +1)-1:7*1 ]; end4'd2   : begin rdata0 <= temp0[7*(2 +1)-1:7*2 ]; rdata1 <= temp1[7*(2 +1)-1:7*2 ]; rdata2 <= temp2[7*(2 +1)-1:7*2 ]; rdata3 <= temp3[7*(2 +1)-1:7*2 ]; end4'd3   : begin rdata0 <= temp0[7*(3 +1)-1:7*3 ]; rdata1 <= temp1[7*(3 +1)-1:7*3 ]; rdata2 <= temp2[7*(3 +1)-1:7*3 ]; rdata3 <= temp3[7*(3 +1)-1:7*3 ]; end4'd4   : begin rdata0 <= temp0[7*(4 +1)-1:7*4 ]; rdata1 <= temp1[7*(4 +1)-1:7*4 ]; rdata2 <= temp2[7*(4 +1)-1:7*4 ]; rdata3 <= temp3[7*(4 +1)-1:7*4 ]; end4'd5   : begin rdata0 <= temp0[7*(5 +1)-1:7*5 ]; rdata1 <= temp1[7*(5 +1)-1:7*5 ]; rdata2 <= temp2[7*(5 +1)-1:7*5 ]; rdata3 <= temp3[7*(5 +1)-1:7*5 ]; end4'd6   : begin rdata0 <= temp0[7*(6 +1)-1:7*6 ]; rdata1 <= temp1[7*(6 +1)-1:7*6 ]; rdata2 <= temp2[7*(6 +1)-1:7*6 ]; rdata3 <= temp3[7*(6 +1)-1:7*6 ]; end4'd7   : begin rdata0 <= temp0[7*(7 +1)-1:7*7 ]; rdata1 <= temp1[7*(7 +1)-1:7*7 ]; rdata2 <= temp2[7*(7 +1)-1:7*7 ]; rdata3 <= temp3[7*(7 +1)-1:7*7 ]; end4'd8   : begin rdata0 <= temp0[7*(8 +1)-1:7*8 ]; rdata1 <= temp1[7*(8 +1)-1:7*8 ]; rdata2 <= temp2[7*(8 +1)-1:7*8 ]; rdata3 <= temp3[7*(8 +1)-1:7*8 ]; end4'd9   : begin rdata0 <= temp0[7*(9 +1)-1:7*9 ]; rdata1 <= temp1[7*(9 +1)-1:7*9 ]; rdata2 <= temp2[7*(9 +1)-1:7*9 ]; rdata3 <= temp3[7*(9 +1)-1:7*9 ]; end4'd10  : begin rdata0 <= temp0[7*(10+1)-1:7*10]; rdata1 <= temp1[7*(10+1)-1:7*10]; rdata2 <= temp2[7*(10+1)-1:7*10]; rdata3 <= temp3[7*(10+1)-1:7*10]; end4'd11  : begin rdata0 <= temp0[7*(11+1)-1:7*11]; rdata1 <= temp1[7*(11+1)-1:7*11]; rdata2 <= temp2[7*(11+1)-1:7*11]; rdata3 <= temp3[7*(11+1)-1:7*11]; end4'd12  : begin rdata0 <= temp0[7*(12+1)-1:7*12]; rdata1 <= temp1[7*(12+1)-1:7*12]; rdata2 <= temp2[7*(12+1)-1:7*12]; rdata3 <= temp3[7*(12+1)-1:7*12]; end4'd13  : begin rdata0 <= temp0[7*(13+1)-1:7*13]; rdata1 <= temp1[7*(13+1)-1:7*13]; rdata2 <= temp2[7*(13+1)-1:7*13]; rdata3 <= temp3[7*(13+1)-1:7*13]; end4'd14  : begin rdata0 <= temp0[7*(14+1)-1:7*14]; rdata1 <= temp1[7*(14+1)-1:7*14]; rdata2 <= temp2[7*(14+1)-1:7*14]; rdata3 <= temp3[7*(14+1)-1:7*14]; end4'd15  : begin rdata0 <= temp0[7*(15+1)-1:7*15]; rdata1 <= temp1[7*(15+1)-1:7*15]; rdata2 <= temp2[7*(15+1)-1:7*15]; rdata3 <= temp3[7*(15+1)-1:7*15]; enddefault: begin endendcase
endalways @ (posedge vid_clk or negedge locked) beginif (~ locked) beginraddr <= 4'd8;end else beginraddr <= (raddr == 4'd15) ? 4'd0 : (raddr + 1'd1);end
end

8.软件架构

在这里插入图片描述

  • LVDS接收的重点、难点,在于如何训练得到正确的数据采集时钟相位,最终稳定工作, 在整个软件架构中,通过状态机的形式,对IDELAY的延时参数反复修改,自动测试, 最终得到最优延时点,并精准采集数据;
  • 如何判断是否数据锁定,BT1120内同步有完整的VS/HS/DE,通过对VS/HS/DE 进行解析并判断图像行场完整性,就可以确认输入是否正常。
  • 如何判断是否采样点最优,通过不断的调整idelay的值,可以找到能锁定图像输入的 最小和最大delay,取平均值,即为眼图的正中间,优化点!

7.软件实现(部分)

详见代码

如何寻找最优位址/********************************************************************************
*
*   LVDS CLK Domain: Auto Training Function
*
********************************************************************************/
always @ (posedge lvds_rx_clk) beginif (lvds_serdes_rst) beginlvds_align_train_temp_code <= 3'd0;lvds_align_train_temp_locked <= 1'd0;lvds_align_train_temp_min <= {(DRP_BITS){1'd0}};lvds_align_train_temp_max <= {(DRP_BITS){1'd0}};lvds_align_train_calc_min <= {(DRP_BITS){1'd0}};lvds_align_train_calc_max <= {(DRP_BITS){1'd0}};lvds_align_train_calc_sub <= {(DRP_BITS){1'd0}};lvds_align_train_calc_add <= {(DRP_BITS+1){1'd0}};end else if (lvds_serdes_result_fsm_vld) beginlvds_align_train_temp_code <= lvds_check_status_code;             // 来自其他模块的输入,重点关注lvds_align_train_temp_locked <= lvds_check_status_locked;         // 来自其他模块的输入,重点关注    if (lvds_align_train_temp_locked == 1'd1) beginif (lvds_check_status_locked == 1'd1) beginif (lvds_align_train_temp_code == lvds_check_status_code) begin// 锁定状态,继续搜索lvds_align_train_temp_max <= lvds_serdes_drp_data_curr;// 最后一次if (lvds_serdes_drp_data_curr >= (DRP_MAX-1)) beginlvds_align_train_calc_min <= lvds_align_train_temp_min;lvds_align_train_calc_max <= (DRP_MAX-1);lvds_align_train_calc_sub <= (DRP_MAX-1) - lvds_align_train_temp_min;lvds_align_train_calc_add <= (DRP_MAX-1) + lvds_align_train_temp_min;endend else begin// 从A状态锁定切换到B状态锁定,需要触发保存A状态lvds_align_train_temp_min <= lvds_serdes_drp_data_curr;lvds_align_train_temp_max <= lvds_serdes_drp_data_curr;lvds_align_train_calc_min <= lvds_align_train_temp_min;lvds_align_train_calc_max <= lvds_align_train_temp_max;lvds_align_train_calc_sub <= lvds_align_train_temp_max - lvds_align_train_temp_min;lvds_align_train_calc_add <= lvds_align_train_temp_max + lvds_align_train_temp_min;endend else if (lvds_check_status_locked == 1'd0) begin// 从锁定变为不锁定,需要触发保存状态lvds_align_train_calc_min <= lvds_align_train_temp_min;lvds_align_train_calc_max <= lvds_align_train_temp_max;lvds_align_train_calc_sub <= lvds_align_train_temp_max - lvds_align_train_temp_min;lvds_align_train_calc_add <= lvds_align_train_temp_max + lvds_align_train_temp_min;endendend else if (lvds_align_train_temp_locked == 1'd0) beginif (lvds_check_status_locked == 1'd1) begin// 从不锁定变为锁定状态,继续搜索lvds_align_train_temp_min <= lvds_serdes_drp_data_curr;lvds_align_train_temp_max <= lvds_serdes_drp_data_curr;end else begin// 模糊状态,不用管endend
endalways @ (posedge lvds_rx_clk) beginif (lvds_serdes_rst) beginlvds_align_train_save_sub <= {(DRP_BITS){1'd0}};lvds_align_train_save_add <= {(DRP_BITS+1){1'd0}};lvds_align_train_save_min <= {(DRP_BITS){1'd0}};lvds_align_train_save_max <= {(DRP_BITS){1'd0}};end else if (lvds_align_train_calc_sub > lvds_align_train_save_sub) beginlvds_align_train_save_sub <= lvds_align_train_calc_sub;lvds_align_train_save_add <= lvds_align_train_calc_add;lvds_align_train_save_min <= lvds_align_train_calc_min;lvds_align_train_save_max <= lvds_align_train_calc_max;endlvds_align_train_save_ave <= lvds_align_train_save_add[DRP_BITS+1-1:1];        // 最终结果 输出 给其他模块使用
end

8.附件

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

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

相关文章

桌面小屏幕实战课程:DesktopScreen 11 SPI 水墨屏

飞书文档https://x509p6c8to.feishu.cn/docx/doxcnlzpIgj3gosCZufBTCZxlMb SPI说明 SPI是串行外设接口&#xff08;Serial Peripheral Interface&#xff09;的缩写&#xff0c;是一种高速的&#xff0c;全双工&#xff0c;同步的通信总线&#xff0c;并且在芯片的管脚上占用…

SpringCloud Gateway 组件的使用

作者&#xff1a;小凯 沉淀、分享、成长&#xff0c;让自己和他人都能有所收获&#xff01; 我发现了一个很有意思的缩写单词 gw、wg&#xff0c;都是网关的意思。因为 gw gateway、wg wangguan&#xff0c;所以在各个系统开发中&#xff0c;既有 gw 也有 wg 的存在。而网关…

随机地址生成器 - Cloudflare Workers

分享一个完全开源免费部署在 Cloudflare Workers 上的随机地址生成器&#xff0c;支持全球 24 个国家/地区。 &#x1f517; 工具地址: https://address.chat-tempmail.com ✨ 特性 &#x1f30d; 支持生成 24 个国家/地区的地址&#x1f4f1; 响应式设计&#xff0c;完美支持…

CNN不是一个模型?

CNN不是一个模型&#xff1f; 结论&#xff1a; CNN 是模型架构而非具体模型&#xff0c;其定位类似深度学习领域的 「设计框架」&#xff0c;而非 LSTM&#xff08;具体单元结构&#xff09;或决策树&#xff08;具体算法实体&#xff09;。CNN 的 「具体模型」 需要结合网络…

爱基百客与真迈生物达成战略合作,共推多组学科研服务升级

近日&#xff0c;武汉爱基百客生物科技有限公司&#xff08;以下简称“爱基百客”&#xff09;与真迈生物正式签署战略合作协议。此次战略合作将聚焦表观组学、单细胞时空组学等前沿科研领域&#xff0c;联合打造基于自主创新技术的多组学科研服务方案&#xff0c;为科研人员提…

吴恩达:从斯坦福到 Coursera,他的深度学习布道之路

名人说&#xff1a;路漫漫其修远兮&#xff0c;吾将上下而求索。—— 屈原《离骚》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 吴恩达&#xff1a;从斯坦福到 Coursera&#xff0c;他的深度学习布道之路 在人工智能…

开疆智能CCLinkIE转ModbusTCP网关连接测联无纸记录仪配置案例

本案例是通过CCLinkIE转ModbusTCP网关将记录仪数据传送到三菱PLC&#xff0c;具体操作过程如下。 &#xff08;1&#xff09; 无纸记录仪与PT100传感器连接正确后&#xff0c;将无纸记录仪和PC通过网线连接&#xff0c;给无纸记录仪上电&#xff0c;设置无纸记录仪的IP地址及网…

【软考高级系统架构论文】# 论软件设计方法及其应用

论文真题 软件设计 (Software Design,SD) 根据软件需求规格说明书设计软件系统的整体结构、划分功能模块、确定每个模块的实现算法以及程序流程等,形成软件的具体设计方案。软件设计把许多事物和问题按不同的层次和角度进行抽象,将问题或事物进行模块化分解,以便更容易解决…

Spring Boot 3.x 项目搭建 (一)

以下是一个基础 Spring Boot 项目的创建指南&#xff0c;整合了官方推荐方式和实用配置&#xff0c;帮助您快速搭建可运行的项目骨架。 &#x1f31f; 一、项目创建方式 1. 在线工具 Spring Initializr&#xff08;推荐&#xff09; 步骤&#xff1a; 访问 Spring Initializr…

《天行数据查询系统项目介绍》

一、项目概述 天行数据查询系统是一款功能丰富的 Android 应用程序&#xff0c;旨在为用户提供便捷的信息查询服务。该系统集成了多个实用的查询功能&#xff0c;包括空气质量查询、天气预报查询、垃圾分类查询、新闻资讯浏览以及身份证信息查询等&#xff0c;方便用户一站式获…

对于服务器企业该如何进行搭建?

企业搭建服务器能够实现网络服务、数据存储和管理等功能&#xff0c;选择大家服务器不仅能够实现高效的资源管理和对数据信息进行安全保护&#xff0c;还可以满足网站运行的需求&#xff0c;下面&#xff0c;小编就主要来为大家介绍一下企业该如何进行服务器搭建&#xff1f; 搭…

重定向攻击与防御

一、重定向攻击的主要类型与技术原理 ICMP重定向攻击 原理&#xff1a;攻击者伪造网关身份发送虚假ICMP重定向报文&#xff0c;诱导主机修改路由表&#xff0c;将流量导向攻击者控制的节点。 利用工具&#xff1a;如netwox 86可构造恶意重定向包&#xff0c;源IP伪装为网关地…

SAP/S4 MM模块之主数据管理

目录 一、主要功能 1. 主数据管理 2.采购管理 3. 库存管理 二、业务价值 三、主数据常见问题 3.1. 物料主数据维护错误 3.2. 供应商数据不完整或错误 3.3. 数据录入延迟或遗漏 四、最佳实践 1. 物料主数据标准化 2. 供应商主数据优化 3.库存管控精细化 SAP MM&…

Flink Oracle CDC 总结

官方文档 https://nightlies.apache.org/flink/flink-cdc-docs-release-3.3/zh/docs/connectors/flink-sources/oracle-cdc/ 版本 Flink 1.15.3CDC 2.3.0Oracle 11G 12C &#xff08;官网说支持19&#xff0c;未测试&#xff09; Jar包 https://repo1.maven.org/maven2/co…

django request.data.get 判断有没有 某个参数

在 Django 的视图函数中&#xff0c;当你想要判断请求&#xff08;request&#xff09;中是否包含某个特定的参数&#xff0c;你可以使用 request.data.get() 方法。这种方法不仅适用于 POST 请求&#xff08;例如&#xff0c;在创建资源时&#xff09;&#xff0c;也适用于任何…

SD-WAN在可扩展性与未来发展灵活性方面的优势探讨

在企业数字化转型的浪潮中&#xff0c;网络基础设施的灵活性和扩展性成为企业关注的核心议题之一。SD-WAN&#xff08;Software-Defined Wide Area Network&#xff09;作为一种新兴的网络技术&#xff0c;因其灵活、智能、高效的特性&#xff0c;逐渐取代传统WAN&#xff0c;成…

4.9. 环境和分布偏移

目录 4.9. 环境和分布偏移1&#xff09;分布偏移的类型 4.9. 环境和分布偏移 机器学习应用常被忽视数据来源和模型输出处理。许多模型在测试集上表现好&#xff0c;但数据分布改变时会部署失败&#xff0c;甚至模型决策本身可能破坏数据分布&#xff08;如贷款模型基于“穿牛津…

UI前端与数字孪生融合:打造智能工厂的可视化监控平台

hello宝子们...我们是艾斯视觉擅长ui设计、前端开发、数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩! 在工业 4.0 与智能制造的浪潮中&#xff0c;数字孪生技术正从概念走向大规模落地。据麦肯锡报…

【数据集】3D-GloBFP:全球首个三维建筑轮廓数据集

目录 一、数据集介绍:《3D-GloBFP:全球首个三维建筑轮廓数据集》主要数据来源:模型方法:📥 二、数据下载方式方式1:Figshare方式2:下载亚洲建筑高度数据(完整版)参考🧾 数据集概述: 3D-GloBFP 是全球首个在单体建筑层面估算建筑高度的三维建筑轮廓数据集,基于 20…

python基于协同过滤的动漫推荐系统

目录 技术栈介绍具体实现截图系统设计研究方法&#xff1a;设计步骤设计流程核心代码部分展示研究方法详细视频演示试验方案论文大纲源码获取/详细视频演示 技术栈介绍 Django-SpringBoot-php-Node.js-flask 本课题的研究方法和研究步骤基本合理&#xff0c;难度适中&#xf…