【【ZYNQ 7020显示 图片 实验 】】

news2024/9/24 5:28:01

ZYNQ 7020显示 图片 实验

关键配置 BRAM
在这里插入图片描述
在这里插入图片描述
因为本次 我想显示的 图片是 400*400 所以在 内部 的 ROM 存储单元选择 了160000
ZYNQ7020的内部资源 最多是 大概 200000左右的 大小 大家可以根据 资源选择合适的像素
在这里插入图片描述
此处存放 内部的 图片转文字的COE文件
PLL设置
在这里插入图片描述
我选用的是按照720p 的 标准
之前准备做最大的1080P 发现 超出资源上限了
在这里插入图片描述
下面展示 整个的代码
注意 大部分代码 和 上一节是一样的
主要是 在显示 display 的时候 严格注意 宽度和高度 我一开始没设置对 出现了 图片显示 不正确的状况

dvi_transmitter_top.v

module dvi_transmitter_top(
    input                pclk          ,
    input                sys_rst_n     ,
    input                pclk_x5       ,
    input                video_hsync   ,
    input                video_vsync   ,
    input                video_de      ,
    input   [23 : 0]     video_din     ,
    output               tmds_clk_p    ,
    output               tmds_clk_n    ,
    output  [2 : 0]      tmds_data_p   ,
    output  [2 : 0]      tmds_data_n   ,
    output               tmds_oen  
);


assign tmds_oen = 1 ; 

// next is  define  
wire  reset ;
wire [9:0] blue_10bit ;
wire [9:0] green_10bit ;
wire [9:0] red_10bit ;


wire [2:0] tmds_data_serial ; 
wire       tmds_clk_serial  ;



reset_syn u_reset_syn(
    .pclk     ( pclk     ),
    .reset_n  ( sys_rst_n  ),
    .reset    ( reset    )
);


dvi_encoder u_dvi_encoder_blue(
    .clkin ( pclk ),
    .rstin ( reset ),
    .din   ( video_din[7:0]   ),
    .c0    ( video_hsync    ),
    .c1    ( video_vsync    ),
    .de    ( video_de    ),
    .dout  ( blue_10bit  )
);

dvi_encoder u_dvi_encoder_green(
    .clkin ( pclk ),
    .rstin ( reset ),
    .din   ( video_din[15:8]   ),
    .c0    ( 1'b0    ),
    .c1    ( 1'b0    ),
    .de    ( video_de    ),
    .dout  ( green_10bit  )
);


dvi_encoder u_dvi_encoder_red(
    .clkin ( pclk ),
    .rstin ( reset ),
    .din   ( video_din[23:16]   ),
    .c0    ( 1'b0    ),
    .c1    ( 1'b0    ),
    .de    ( video_de    ),
    .dout  ( red_10bit  )
);

serializer10 u_serializer10_blue(
    .reset          ( reset          ),
    .paralell_clk   ( pclk   ),
    .serial_clk_5x  ( pclk_x5  ),
    .paralell_data  ( blue_10bit  ),
    .serial_data_out  ( tmds_data_serial[0]  )
);

serializer10 u_serializer10_green(
    .reset          ( reset          ),
    .paralell_clk   ( pclk   ),
    .serial_clk_5x  ( pclk_x5  ),
    .paralell_data  ( green_10bit  ),
    .serial_data_out  ( tmds_data_serial[1]  )
);

serializer10 u_serializer10_red(
    .reset          ( reset          ),
    .paralell_clk   ( pclk   ),
    .serial_clk_5x  ( pclk_x5  ),
    .paralell_data  ( red_10bit  ),
    .serial_data_out  ( tmds_data_serial[2]  )
);

serializer10 u_serializer10_clk(
    .reset          ( reset          ),
    .paralell_clk   ( pclk   ),
    .serial_clk_5x  ( pclk_x5  ),
    .paralell_data  ( 10'b1111100000  ),
    .serial_data_out  ( tmds_clk_serial  )
);


//转换差分信号  
OBUFDS #(
    .IOSTANDARD         ("TMDS_33")    // I/O电平标准为TMDS
) TMDS0 (
    .I                  (tmds_data_serial[0]),
    .O                  (tmds_data_p[0]),
    .OB                 (tmds_data_n[0]) 
);

OBUFDS #(
    .IOSTANDARD         ("TMDS_33")    // I/O电平标准为TMDS
) TMDS1 (
    .I                  (tmds_data_serial[1]),
    .O                  (tmds_data_p[1]),
    .OB                 (tmds_data_n[1]) 
);

OBUFDS #(
    .IOSTANDARD         ("TMDS_33")    // I/O电平标准为TMDS
) TMDS2 (
    .I                  (tmds_data_serial[2]), 
    .O                  (tmds_data_p[2]), 
    .OB                 (tmds_data_n[2])  
);

OBUFDS #(
    .IOSTANDARD         ("TMDS_33")    // I/O电平标准为TMDS
) TMDS3 (
    .I                  (tmds_clk_serial), 
    .O                  (tmds_clk_p),
    .OB                 (tmds_clk_n) 
);
endmodule  

encoder.v

module dvi_encoder (
  input            clkin,    // pixel clock input
  input            rstin,    // async. reset input (active high)
  input      [7:0] din,      // data inputs: expect registered
  input            c0,       // c0 input
  input            c1,       // c1 input
  input            de,       // de input
  output reg [9:0] dout      // data outputs
);

  
  // Counting number of 1s and 0s for each incoming pixel
  // component. Pipe line the result.
  // Register Data Input so it matches the pipe lined adder
  // output
  
  reg [3:0] n1d; //number of 1s in din
  reg [7:0] din_q;

//计算像素数据中“1”的个数
  always @ (posedge clkin) begin
    n1d <=#1 din[0] + din[1] + din[2] + din[3] + din[4] + din[5] + din[6] + din[7];

    din_q <=#1 din;
  end

  ///
  // Stage 1: 8 bit -> 9 bit
  // Refer to DVI 1.0 Specification, page 29, Figure 3-5
  ///
  wire decision1;

  assign decision1 = (n1d > 4'h4) | ((n1d == 4'h4) & (din_q[0] == 1'b0));

  wire [8:0] q_m;
  assign q_m[0] = din_q[0];
  assign q_m[1] = (decision1) ? (q_m[0] ^~ din_q[1]) : (q_m[0] ^ din_q[1]);
  assign q_m[2] = (decision1) ? (q_m[1] ^~ din_q[2]) : (q_m[1] ^ din_q[2]);
  assign q_m[3] = (decision1) ? (q_m[2] ^~ din_q[3]) : (q_m[2] ^ din_q[3]);
  assign q_m[4] = (decision1) ? (q_m[3] ^~ din_q[4]) : (q_m[3] ^ din_q[4]);
  assign q_m[5] = (decision1) ? (q_m[4] ^~ din_q[5]) : (q_m[4] ^ din_q[5]);
  assign q_m[6] = (decision1) ? (q_m[5] ^~ din_q[6]) : (q_m[5] ^ din_q[6]);
  assign q_m[7] = (decision1) ? (q_m[6] ^~ din_q[7]) : (q_m[6] ^ din_q[7]);
  assign q_m[8] = (decision1) ? 1'b0 : 1'b1;

  /
  // Stage 2: 9 bit -> 10 bit
  // Refer to DVI 1.0 Specification, page 29, Figure 3-5
  /
  reg [3:0] n1q_m, n0q_m; // number of 1s and 0s for q_m
  always @ (posedge clkin) begin
    n1q_m  <=#1 q_m[0] + q_m[1] + q_m[2] + q_m[3] + q_m[4] + q_m[5] + q_m[6] + q_m[7];
    n0q_m  <=#1 4'h8 - (q_m[0] + q_m[1] + q_m[2] + q_m[3] + q_m[4] + q_m[5] + q_m[6] + q_m[7]);
  end

  parameter CTRLTOKEN0 = 10'b1101010100;
  parameter CTRLTOKEN1 = 10'b0010101011;
  parameter CTRLTOKEN2 = 10'b0101010100;
  parameter CTRLTOKEN3 = 10'b1010101011;

  reg [4:0] cnt; //disparity counter, MSB is the sign bit
  wire decision2, decision3;

  assign decision2 = (cnt == 5'h0) | (n1q_m == n0q_m);
  /
  // [(cnt > 0) and (N1q_m > N0q_m)] or [(cnt < 0) and (N0q_m > N1q_m)]
  /
  assign decision3 = (~cnt[4] & (n1q_m > n0q_m)) | (cnt[4] & (n0q_m > n1q_m));

  
  // pipe line alignment
  
  reg       de_q, de_reg;
  reg       c0_q, c1_q;
  reg       c0_reg, c1_reg;
  reg [8:0] q_m_reg;

  always @ (posedge clkin) begin
    de_q    <=#1 de;
    de_reg  <=#1 de_q;
    
    c0_q    <=#1 c0;
    c0_reg  <=#1 c0_q;
    c1_q    <=#1 c1;
    c1_reg  <=#1 c1_q;

    q_m_reg <=#1 q_m;
  end

  ///
  // 10-bit out
  // disparity counter
  ///
  always @ (posedge clkin or posedge rstin) begin
    if(rstin) begin
      dout <= 10'h0;
      cnt <= 5'h0;
    end else begin
      if (de_reg) begin
        if(decision2) begin
          dout[9]   <=#1 ~q_m_reg[8]; 
          dout[8]   <=#1 q_m_reg[8]; 
          dout[7:0] <=#1 (q_m_reg[8]) ? q_m_reg[7:0] : ~q_m_reg[7:0];

          cnt <=#1 (~q_m_reg[8]) ? (cnt + n0q_m - n1q_m) : (cnt + n1q_m - n0q_m);
        end else begin
          if(decision3) begin
            dout[9]   <=#1 1'b1;
            dout[8]   <=#1 q_m_reg[8];
            dout[7:0] <=#1 ~q_m_reg[7:0];

            cnt <=#1 cnt + {q_m_reg[8], 1'b0} + (n0q_m - n1q_m);
          end else begin
            dout[9]   <=#1 1'b0;
            dout[8]   <=#1 q_m_reg[8];
            dout[7:0] <=#1 q_m_reg[7:0];

            cnt <=#1 cnt - {~q_m_reg[8], 1'b0} + (n1q_m - n0q_m);
          end
        end
      end else begin
        case ({c1_reg, c0_reg})
          2'b00:   dout <=#1 CTRLTOKEN0;
          2'b01:   dout <=#1 CTRLTOKEN1;
          2'b10:   dout <=#1 CTRLTOKEN2;
          default: dout <=#1 CTRLTOKEN3;
        endcase

        cnt <=#1 5'h0;
      end
    end
  end
  
endmodule 

reset_syn.v

module  reset_syn(
    input            pclk     ,
    input            reset_n  ,
    output   reg     reset
  );

  reg reset1 ;


  always@( posedge pclk   or  negedge reset_n)
  begin
    if( reset_n == 0)
    begin
      reset1 <= 1 ;
    end
    else
    begin
      reset1 <= 0      ;
      reset  <= reset1 ;
    end
  end
endmodule

serializer.v

module serializer10 (
    input                       reset           ,  // 复位,高有效
    input                       paralell_clk    ,  // 输入并行数据时钟 
    input                       serial_clk_5x   ,   // 输入串行数据时钟
    input        [9 : 0]        paralell_data   ,   // 输入并行数据
    output                      serial_data_out          // 输出串行数据
);



//wire define
 wire cascade1 ; //用于两个 OSERDESE2 级联的信号
 wire cascade2 ;



// 此处的代码 来自 vivado的 原语 和 正点原子的同时调配 
// 这是 master接口 



OSERDESE2 #(
    .DATA_RATE_OQ("DDR"),   // 设置双倍数据速率
    .DATA_RATE_TQ("DDR"),   // DDR, BUF, SDR
    .DATA_WIDTH(10),         // 输入的并行数据宽度为 10bit
   // .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)
 )
 OSERDESE2_MASTER (
    .OFB(),             // 未使用
    .OQ(serial_data_out),               // 串行输出数据
    // SHIFTOUT1 / SHIFTOUT2: 1-bit (each) output: Data output expansion (1-bit each)
    .SHIFTOUT1(),  // SHIFTIN1 用于位宽扩展
    .SHIFTOUT2(),  // SHIFTIN2 用于位宽扩展
    .TBYTEOUT(),   // 未使用
    .TFB(),             // 未使用
    .TQ(),               // 未使用
    .CLK(serial_clk_5x),    // 串行数据时钟,5 倍时钟频率
    .CLKDIV(paralell_clk),  // 并行数据时钟
    // D1 - D8: 1-bit (each) input: Parallel data inputs (1-bit each)
    .D1(paralell_data[0]),
    .D2(paralell_data[1]),
    .D3(paralell_data[2]),
    .D4(paralell_data[3]),
    .D5(paralell_data[4]),
    .D6(paralell_data[5]),
    .D7(paralell_data[6]),
    .D8(paralell_data[7]),
    .OCE(1'b1),             // 1-bit input: Output data clock enable
    .RST(reset),             // 1-bit input: Reset
    // SHIFTIN1 / SHIFTIN2: 1-bit (each) input: Data input expansion (1-bit each)
    .SHIFTIN1(cascade1),     // SHIFTIN1 用于位宽扩展
    .SHIFTIN2(cascade2),     // SHIFTIN2  用于位宽扩展
    // T1 - T4: 1-bit (each) input: Parallel 3-state inputs
    .T1(1'b0),                // 未使用
    .T2(1'b0),                // 未使用
    .T3(1'b0),                // 未使用
    .T4(1'b0),                // 未使用
    .TBYTEIN(1'b0),     // 未使用
    .TCE(1'b0)              // 未使用
 );


// slave接口 
 OSERDESE2 #(
    .DATA_RATE_OQ("DDR"),   // 设置双倍数据速率
    .DATA_RATE_TQ("DDR"),   // DDR, BUF, SDR
    .DATA_WIDTH(10),         // 输入的并行数据宽度为 10bit
   // .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("SLAVE"), // 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)
 )
 OSERDESE2_SLAVE (
    .OFB(),             // 未使用
    .OQ(),               // 串行输出数据
    // SHIFTOUT1 / SHIFTOUT2: 1-bit (each) output: Data output expansion (1-bit each)
    .SHIFTOUT1(cascade1),  // SHIFTIN1 用于位宽扩展
    .SHIFTOUT2(cascade2),  // SHIFTIN2 用于位宽扩展
    .TBYTEOUT(),   // 未使用
    .TFB(),             // 未使用
    .TQ(),               // 未使用
    .CLK(serial_clk_5x),    // 串行数据时钟,5 倍时钟频率
    .CLKDIV(paralell_clk),  // 并行数据时钟
    // D1 - D8: 1-bit (each) input: Parallel data inputs (1-bit each)
    .D1(1'b0),
    .D2(1'b0),
    .D3(paralell_data[8]),
    .D4(paralell_data[9]),
    .D5(1'b0),
    .D6(1'b0),
    .D7(1'b0),
    .D8(1'b0),
    .OCE(1'b1),             // 1-bit input: Output data clock enable
    .RST(reset),             // 1-bit input: Reset
    // SHIFTIN1 / SHIFTIN2: 1-bit (each) input: Data input expansion (1-bit each)
    .SHIFTIN1(),     // SHIFTIN1 用于位宽扩展
    .SHIFTIN2(),     // SHIFTIN2  用于位宽扩展
    // T1 - T4: 1-bit (each) input: Parallel 3-state inputs
    .T1(1'b0),                // 未使用
    .T2(1'b0),                // 未使用
    .T3(1'b0),                // 未使用
    .T4(1'b0),                // 未使用
    .TBYTEIN(1'b0),     // 未使用
    .TCE(1'b0)              // 未使用
 );

endmodule 

top.v

module hdmi_top(
    input        sys_clk,
    input        sys_rst_n,

    output       tmds_clk_p,    // TMDS 时钟通道
    output       tmds_clk_n,
    output [2:0] tmds_data_p,   // TMDS 数据通道
    output [2:0] tmds_data_n
  );

  //wire define
  wire          pixel_clk;
  wire          pixel_clk_5x;
  wire          clk_locked;

  wire  [10:0]  pixel_xpos_w;
  wire  [10:0]  pixel_ypos_w;
  wire  [23:0]  pixel_data_w;

  wire          video_hs;
  wire          video_vs;
  wire          video_de;
  wire  [23:0]  video_rgb;

  // next is main code
  clk_wiz_0 instance_name
            (
              // Clock out ports
              .clk_out1(pixel_clk),     // output clk_out1
              .clk_out2(pixel_clk_5x),     // output clk_out2
              // Status and control signals
              .reset(~sys_rst_n), // input reset
              .locked(clk_locked),       // output locked
              // Clock in ports
              .clk_in1(sys_clk)
              );

video_driver u_video_driver(
    .pixel_clk   ( pixel_clk   ),
    .rst_n       ( sys_rst_n       ),
    .pixel_data  ( pixel_data_w  ),
    .video_rgb   ( video_rgb   ),
    .video_hs    ( video_hs    ),
    .video_vs    ( video_vs    ),
    .video_de    ( video_de    ),
    .pixel_xpos  ( pixel_xpos_w  ),
    .pixel_ypos  ( pixel_ypos_w  )
);

video_display u_video_display(
    .pixel_clk     ( pixel_clk     ),
    .sys_rst_n     ( sys_rst_n     ),
    .pixel_xpos_w  ( pixel_xpos_w  ),
    .pixel_ypos_w  ( pixel_ypos_w  ),
    .pixel_data_w  ( pixel_data_w  )
);


dvi_transmitter_top u_dvi_transmitter_top(
    .pclk         ( pixel_clk         ),
    .sys_rst_n    ( sys_rst_n & clk_locked    ),
    .pclk_x5      ( pixel_clk_5x      ),
    .video_hsync  ( video_hs  ),
    .video_vsync  ( video_vs  ),
    .video_de     ( video_de     ),
    .video_din    ( video_rgb    ),
    .tmds_clk_p   ( tmds_clk_p   ),
    .tmds_clk_n   ( tmds_clk_n   ),
    .tmds_data_p  ( tmds_data_p  ),
    .tmds_data_n  ( tmds_data_n  ),
    .tmds_oen     ( )
);

endmodule 


                     

video_display.v

    module video_display(
    input                     pixel_clk       ,
    input                     sys_rst_n       ,
    input       [ 11 : 0 ]    pixel_xpos_w    ,
    input       [ 11 : 0 ]    pixel_ypos_w    ,
    output reg  [ 23 : 0 ]    pixel_data_w
  );


//parameter define 
 localparam PIC_X_START = 11'd10; //图片起始点横坐标
 localparam PIC_Y_START = 11'd10; //图片起始点纵坐标
 localparam PIC_WIDTH = 11'd395; //图片宽度
 localparam PIC_HEIGHT = 11'd400; //图片高度


  //棰滆壊
  localparam BACK_COLOR  = 24'hE0FFFF; //背景色,浅蓝色
  localparam CHAR_COLOR  = 24'hff0000; //字符颜色,红色


  reg [19:0] rom_addr ; //ROM 地址
  wire rom_rd_en ; //ROM 读使能信号
  wire [23:0] rom_rd_data ;//ROM 数据


  always@( posedge pixel_clk or negedge sys_rst_n)
  begin
    if( sys_rst_n == 0)
    begin
      pixel_data_w <=BACK_COLOR ;
    end
    else if( (pixel_xpos_w >= PIC_X_START - 1'b1)
      && (pixel_xpos_w < PIC_X_START + PIC_WIDTH - 1'b1)
       && (pixel_ypos_w >= PIC_Y_START) && (pixel_ypos_w < PIC_Y_START + PIC_HEIGHT) )
       pixel_data_w <= rom_rd_data ; //显示图片
    else
      pixel_data_w <= BACK_COLOR ;
    end
 //根据当前扫描点的横纵坐标为ROM地址赋值
always @(posedge pixel_clk or negedge sys_rst_n) begin
  if(sys_rst_n == 0 )
      rom_addr <= 20'd0;
  //当横纵坐标位于图片显示区域时,累加ROM地址    
  else if((pixel_ypos_w >= PIC_Y_START) && (pixel_ypos_w < PIC_Y_START + PIC_HEIGHT) 
      && (pixel_xpos_w >= PIC_X_START) && (pixel_xpos_w < PIC_X_START + PIC_WIDTH)) 
      rom_addr <= rom_addr + 1'b1;
  //当横纵坐标位于图片区域最后一个像素点时,ROM地址清零    
  else if((pixel_ypos_w >= PIC_Y_START + PIC_HEIGHT))
      rom_addr <= 20'd0;
end

//ROM:存储图片
blk_mem_gen_0  blk_mem_gen_0 (
.clka  (pixel_clk),    // input wire clka
.ena   (rom_rd_en),   // input wire ena
.addra (rom_addr),    // input wire [19 : 0] addra
.douta (rom_rd_data)  // output wire [23 : 0] douta
);
 

endmodule

video_driver.v

module video_driver
(
  input                         pixel_clk    ,
  input                         rst_n        ,
  input        [ 23 : 0 ]       pixel_data   ,

  output       [ 23 : 0 ]       video_rgb    ,
  output                        video_hs     ,     //  行同步信号
  output                        video_vs     ,     //  场同步信号
  output                        video_de     ,     //  数据使能
  output       [ 11 : 0 ]       pixel_xpos   ,     //  像素点横坐标  1280
  output       [ 11 : 0 ]       pixel_ypos        //  像素点横坐标  720
);

  //parameter define

  //1280*720  分辨率时序参数    时钟频率74.25
  parameter  H_SYNC   =  12'd40;   //行同步
  parameter  H_BACK   =  12'd220;  //行显示后沿
  parameter  H_DISP   =  12'd1280; //行有效数据
  parameter  H_FRONT  =  12'd110;  //行显示前沿
  parameter  H_TOTAL  =  12'd1650; //行扫描周期

  parameter  V_SYNC   =  12'd5;    //场同步
  parameter  V_BACK   =  12'd20;   //场显示后沿
  parameter  V_DISP   =  12'd720;  //场有效数据
  parameter  V_FRONT  =  12'd5;    //场显示前沿
  parameter  V_TOTAL  =  12'd750;  //场扫描周期



  //  reg define
  reg [11 : 0]   cnt_h ;
  reg [11 : 0]   cnt_v ;

 wire data_reg ; 
  // define








  //  next is main code
  always@(posedge pixel_clk or negedge rst_n)
  begin
    if( rst_n == 0)
    begin
      cnt_h <= 0 ;
    end
    else
    begin
      if(cnt_h == H_TOTAL - 1)
      begin
        cnt_h <= 0 ;
      end
      else
        cnt_h <= cnt_h + 1 ;
    end
  end


  always@(posedge pixel_clk or negedge rst_n)
  begin
    if( rst_n == 0)
    begin
      cnt_v = 0 ;
    end
    else
    begin
      if( cnt_h == H_TOTAL - 1)
      begin
        if(cnt_v == V_TOTAL - 1)
        begin
          cnt_v <= 0 ;
        end
        else
        begin
          cnt_v <= cnt_v + 1 ;
        end
      end
    end
  end



//    =======================main code============\\
 // video_rgb 
 // video_hs  
 // video_vs  
 // video_de  
 // pixel_xpos
 // pixel_ypos 
assign video_hs = 1 ; 
assign video_vs = 1 ; 

assign video_rgb  =   video_de ? pixel_data : 24'b0 ; 

assign video_de   =  (((cnt_h >= H_SYNC+H_BACK) && (cnt_h < H_SYNC+H_BACK+H_DISP))
&&((cnt_v >= V_SYNC+V_BACK) && (cnt_v < V_SYNC+V_BACK+V_DISP)))
?  1'b1 : 1'b0;

assign data_reg   =  (((cnt_h >= H_SYNC+H_BACK - 1) && (cnt_h < H_SYNC+H_BACK+H_DISP - 1))
&&((cnt_v >= V_SYNC+V_BACK) && (cnt_v < V_SYNC+V_BACK+V_DISP)))
?  1'b1 : 1'b0;

assign pixel_xpos = data_reg ? (cnt_h - (H_SYNC + H_BACK - 1'b1)) : 0;
assign pixel_ypos = data_reg ? (cnt_v - (V_SYNC + V_BACK - 1'b1)) : 0;

endmodule 

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

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

相关文章

详解wmvcore.dll丢失的解决方法

wmvcore.dll是一款由Microsoft开发的Windows系统文件&#xff0c;主要用于存储和处理多媒体文件&#xff0c;尤其是Windows媒体视频。该文件对于音频和视频的播放至关重要。如果电脑上缺少这个文件&#xff0c;可能会出现播放问题或者相关的应用程序运行错误。在本文中&#xf…

Netty详解

目录标题 1、前期知识科普1.1 NIO 基本概念1.2 java BIO与NIO对比1.3 Reactor 模型 2、Netty 基础概念2.1 Netty 简介2.2 Netty 执行流程2.3 Netty 核心组件 3、Netty Demo编写3.1 总体框架3.2 具体代码 4、交流群 1、前期知识科普 1.1 NIO 基本概念 阻塞&#xff08;Block&a…

0x21 树与图的遍历

0x21 树与图的遍历 树与图最常见的储存方式就是使用一个邻接表保存它们的边集。邻接表以head数组为表头&#xff0c;使用ver和edge数组分别存储边的终点和权值&#xff0c;使用next数组模拟链表指针&#xff08;就像我们在0x13节中讲解邻接表所给出的代码那样&#xff09;。 …

科技铸就企业转型钢筋铁骨,群硕获评2023年度数字化影响力企业

12月15日&#xff0c;STIF2023第四届国际科创节暨DSC2023国际数字服务大会在北京顺利举行&#xff0c;本次大会以“数实融合 推动高质量发展”为主题&#xff0c;各大科技服务企业齐聚一堂&#xff0c;共同探讨2023科技发展新趋势。 大会上&#xff0c;群硕软件继2022年后再度…

Java版商城:Spring Cloud+SpringBoot b2b2c实现多商家入驻、直播带货及免 费小程序商城搭建

1. 涉及平台 平台管理、商家端&#xff08;pc端、手机端&#xff09;、买家平台&#xff08;h5/公众号、小程序、app端&#xff08;ios/android&#xff09;、微服务平台&#xff08;业务服务&#xff09; 2. 核心架构 spring cloud、spring boot、mybatis、redis 3. 前端框架…

如何远程访问Axure RP制作的本地web站点实现协同办公

文章目录 前言1.在AxureRP中生成HTML文件2.配置IIS服务3.添加防火墙安全策略4.使用cpolar内网穿透实现公网访问4.1 登录cpolar web ui管理界面4.2 启动website隧道4.3 获取公网URL地址4.4. 公网远程访问内网web站点4.5 配置固定二级子域名公网访问内网web站点4.5.1创建一条固定…

浅析AI视频分析与视频管理系统EasyCVR平台及场景应用

人工智能的战略重要性导致对视频智能分析的需求不断增加。鉴于人工智能视觉技术的巨大潜力&#xff0c;人们的注意力正在从传统的视频监控转移到计算机视觉的监控过程自动化。 1、什么是视频分析&#xff1f; 视频分析或视频识别技术&#xff0c;是指从视频片段中提取有用信息…

java.lang.UnsupportedOperationException

一、背景 记录一次小坑… 最近在写一个关于Excel导出的小需求&#xff0c;由于系统都有一些工具类&#xff0c;还有原来已经做好的导出&#xff0c;直接拿过来改了改就用了&#xff0c;没想到直接报错&#xff0c;尴尬。 还是那句话&#xff0c;别人都能用&#xff0c;我复制…

innovus:ccopt_design流程

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; 拾陆楼知识星球入口 ccopt完整的流程包括如下几个步骤&#xff1a; spec文件可以只创建一次&#xff0c;无需多次创建。 1&#xff09;clustering阶段 set_ccopt_property balance_mode cluster …

产品经理之Axure的元件库使用详细案例

⭐⭐ 产品经理专栏&#xff1a;产品专栏 ⭐⭐ 个人主页&#xff1a;个人主页 ​ 目录 前言 一.Axure的元件库的使用 1.1 元件介绍 1.2 基本元件的使用 1.2.1 矩形、按钮、标题的使用 1.2.2 图片及热区的使用 1.3 表单元件及表格元件的使用 1.3.1表单元件的使用 1.3.…

NFS|在linux环境下的安装和配置NFS

简介 NFS全称网络文件系统&#xff0c;可用于不同服务器之间的文件共享。 接下来介绍下NFS在linux环境下安装和配置。主要分为服务端和客户端。 服务端安装 开启rpcbind/portmap和nfs服务 # service portmaper start [rootlocalhost java]# service portmap start Redirectin…

低代码平台浅析:引迈JNPF

低代码平台能够改变应用交付和管理的模式&#xff0c;大幅缩减交付周期&#xff0c;最终帮助业务加速创新。引迈JNPF作为当中的一个低代码平台&#xff0c;其在用户体系方面做得怎样呢&#xff1f;我针对引迈JNPF进行了相关体验与测评&#xff0c;一起来看下。 低代码平台体验简…

SpringBoot Starter机制 ——自动化配置

目录 一、Starter机制 1.1 什么是 SpringBoot Starter 1.2 SpringBoot Starter 的作用 1.3 Starter的应用场景 二、案例 2.1 模拟短信发送模版 2.2 AOP实现日志切面模版 一、Starter机制 1.1 什么是 SpringBoot Starter Spring Boot Starter是Spring Boot框架提供的一种…

[Linux] LVS负载均衡群集+NAT部署

一、LVS负载均衡群集知识 1.1 群集的的定义及意义 Cluster&#xff0c;集群&#xff08;也称群集&#xff09;由多台主机构成&#xff0c;但对外只表现为一一个整体&#xff0c;只提供一-个访问入口(域名或IP地址)&#xff0c; 相当于一台大型计算机。 群集的作用&#xff1…

upload-labs笔记

简介 upload-labs是一个使用php语言编写的&#xff0c;专门收集渗透测试和CTF中遇到的各种上传漏洞的靶场。旨在帮助大家对上传漏洞有一个全面的了解。目前一共21关&#xff0c;每一关都包含着不同上传方式。 文件上传漏洞是指&#xff1a; Web 服务器允许用户将文件上传至其…

使用blip2进行图片输入文本输出

多模态的重要模型blip2,官方提供模型可以直接用来图片生成文本 github地址&#xff1a;https://github.com/salesforce/LAVIS/tree/main/projects/blip2 个人相当于跑了一下blip2的demo&#xff0c;记录下过程&#xff0c;供今后需要参考&#xff1a; 1、首先是环境安装&#…

Spring上下文之注解模块ConfigurationMethod

博主介绍:✌全网粉丝5W+,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验✌ 博主作品:《Java项目案例》主要基于SpringBoot+MyBatis/MyBatis-plus+…

如何实现免费的文档翻译

文中有彩蛋&#xff0c;请一定要看完。 目录 文中有彩蛋&#xff0c;请一定要看完。 一、问题的提出 二、文档翻译现状 三、如何免费海量文档翻译 1. 采用CAT工具机器翻译API法 2. 采用小牛文档翻译 四、学后反思 一、问题的提出 随着互联网和人工智能技术的飞速发展&…

【力扣】19. 删除链表的倒数第 N 个结点

19. 删除链表的倒数第 N 个结点 相比于昨天&#xff0c;感觉刷题越来越轻松了~ 我进步了&#xff01; 以后刷题力度要加快了&#xff0c;因为我报了蓝桥杯&#xff01;加油~ 法一&#xff1a;计算链表长度 思路&#xff1a; 首先用个函数来计算出该链表的长度&#xff0c;然…

接口返回HTML页面详解

import requests from bs4 import BeautifulSoup import re import jsonurl https://listado.mercadolibre.com.mx/hogar-muebles-jardin/cocina/almacenamiento-organizacion/organizadores-cocina/_CustId_570995983_PrCategId_AD# 添加 headers 和 cookies headers {User-…