[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
英文地址,請注明出處:http://en.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…