ZYNQ_project:LCD

 

 

模块框图:

时序图:

代码:

/*
// 24'h000000   4324 9Mhz   480*272
// 24'h800000   7084 33Mhz  800*480
// 24'h008080   7016 50Mhz  1024*600
// 24'h000080   4384 33Mhz  800*480
// 24'h800080   1018 70Mhz  1280*800
*/
module  rd_id(
    input       wire                sys_clk     ,
    input       wire                sys_rst_n   ,
    input       wire    [23:0]      lcd_rgb     , 

    output      reg     [15:0]      lcd_id      
);

    reg                 rd_flag ;
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) 
            rd_flag <= 1'b1 ;
        else
            rd_flag <= 1'b0 ;
    end

    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) 
            lcd_id <= 24'd0 ;
        else if(rd_flag) begin
            case (lcd_rgb)
            24'h000000: lcd_id <= 16'd4324 ;
            24'h800000: lcd_id <= 16'd7084 ;
            24'h008080: lcd_id <= 16'd7016 ;
            24'h000080: lcd_id <= 16'd4384 ;
            24'h800080: lcd_id <= 16'd1018 ;
            default   : lcd_id <= 16'd1018 ;
            endcase
        end
    end

endmodule
module  clk_div(
    input       wire                sys_clk     ,
    input       wire                sys_rst_n   ,
    input       wire    [15:0]      lcd_id      ,

    output      reg                 clk_lcd     ,
    output      wire                rst_n       
);
    wire                clk_9Mhz    ; 
    wire                clk_33Mhz   ;
    wire                clk_50Mhz   ;
    wire                clk_70Mhz   ;
    wire                locked      ;   

    assign  rst_n   = (sys_rst_n && locked) ;

    always @(*) begin
        case (lcd_id)
        16'd4324: clk_lcd <= clk_9Mhz  ;
        16'd7084: clk_lcd <= clk_33Mhz ;
        16'd7016: clk_lcd <= clk_50Mhz ;
        16'd4384: clk_lcd <= clk_33Mhz ;
        16'd1018: clk_lcd <= clk_70Mhz ;
        default : clk_lcd <= 1'b0      ;
        endcase
    end

pll pll_inst(
    .clk_in         ( sys_clk   ) ,
    .resetn         ( sys_rst_n ) ,

    .clk_9Mhz       ( clk_9Mhz  ) ,
    .clk_33Mhz      ( clk_33Mhz ) ,
    .clk_50Mhz      ( clk_50Mhz ) ,
    .clk_70Mhz      ( clk_70Mhz ) ,
    .locked         ( locked    ) 
);

endmodule
// 根据传进来的有效图像坐标信息,产生有效的像素数据。
module lcd_display (
    input       wire                sys_clk     ,
    input       wire                sys_rst_n   ,
    input       wire    [10:0]      axi_x       ,
    input       wire    [10:0]      axi_y       ,

    input       wire    [10:0]      H_SYNC      ,
    input       wire    [10:0]      H_BACK      ,
    input       wire    [10:0]      H_DISP      ,
    input       wire    [10:0]      V_SYNC      ,
    input       wire    [10:0]      V_BACK      ,
    input       wire    [10:0]      V_DISP      ,

    output      reg     [23:0]      pix_data                    
);
    localparam  BLACK       = 24'h000000 , // 黑色
                WHITE       = 24'hFFFFFF , // 白色
                RosyBrown   = 24'hBC8F8F , // 玫瑰褐
                RED         = 24'hFF0000 , // 红色
                APRICOT     = 24'hE69966 , // 杏黄色
                VIOLET      = 24'h8B00FF , // 紫罗兰色
                LINEN       = 24'hFAF0E6 , // 亚麻色
                KHAKI       = 24'h996B1F , // 卡其色
                PEACH       = 24'hFFE5B4 , // 桃色
                GOLDEN      = 24'hFFD700 , // 金色
                SkyBule     = 24'h87CEEB ; // 天空蓝

    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) 
            pix_data <= BLACK ;
        else if((axi_y >= V_SYNC + V_BACK) && (axi_y <= V_SYNC + V_BACK + V_DISP - 1)) begin// 在场同步有效区间内
            if((axi_x >= H_SYNC + H_BACK) && (axi_x <= H_SYNC + H_BACK + H_DISP/10 - 1))  
                pix_data <= WHITE ; 
            else 
            if((axi_x >= H_SYNC + H_BACK + H_DISP/10) && (axi_x <= H_SYNC + H_BACK + (H_DISP/10)*2 - 1))
                pix_data <= BLACK ;
            else 
            if((axi_x >= H_SYNC + H_BACK + (H_DISP/10)*2) && (axi_x <= H_SYNC + H_BACK + (H_DISP/10)*3 - 1))
                pix_data <= RosyBrown ;
            else 
            if((axi_x >= H_SYNC + H_BACK + (H_DISP/10)*3) && (axi_x <= H_SYNC + H_BACK + (H_DISP/10)*4 - 1))
                pix_data <= APRICOT ;
            else 
            if((axi_x >= H_SYNC + H_BACK + (H_DISP/10)*4) && (axi_x <= H_SYNC + H_BACK + (H_DISP/10)*5 - 1))
                pix_data <= RED ;
            else 
            if((axi_x >= H_SYNC + H_BACK + (H_DISP/10)*5) && (axi_x <= H_SYNC + H_BACK + (H_DISP/10)*6 - 1))
                pix_data <= VIOLET ;
            else 
            if((axi_x >= H_SYNC + H_BACK + (H_DISP/10)*6) && (axi_x <= H_SYNC + H_BACK + (H_DISP/10)*7 - 1))
                pix_data <= KHAKI ;
            else
            if((axi_x >= H_SYNC + H_BACK + (H_DISP/10)*7) && (axi_x <= H_SYNC + H_BACK + (H_DISP/10)*8 - 1))
                pix_data <= PEACH ;
            else
            if((axi_x >= H_SYNC + H_BACK + (H_DISP/10)*8) && (axi_x <= H_SYNC + H_BACK + (H_DISP/10)*9 - 1))
                pix_data <= GOLDEN ;
            else
            if((axi_x >= H_SYNC + H_BACK + (H_DISP/10)*9) && (axi_x <= H_SYNC + H_BACK + (H_DISP/10)*10 - 1))
                pix_data <= SkyBule ;
            else
                pix_data <= BLACK ;
        end
        else  
            pix_data <= BLACK ;
    end
    
endmodule
// 接口模块,产生接口时序。又名驱动模块。
// 产生像素信息,有效信号。其余信号直接赋值1
module lcd_driver (
    input       wire                sys_clk     ,
    input       wire                sys_rst_n   ,
    input       wire    [23:0]      pix_data    ,
    input       wire    [15:0]      lcd_id      ,

    output      wire    [10:0]      H_SYNCtoDIS ,
    output      wire    [10:0]      H_BACKtoDIS ,
    output      wire    [10:0]      H_DISPtoDIS ,
    output      wire    [10:0]      V_SYNCtoDIS ,
    output      wire    [10:0]      V_BACKtoDIS ,
    output      wire    [10:0]      V_DISPtoDIS ,

    output      reg                 lcd_de      ,
    output      wire    [23:0]      lcd_rgb_out ,
    output      wire                lcd_bl      ,
    output      wire                lcd_rstn    ,
    output      wire                lcd_hsync   ,
    output      wire                lcd_vsync   ,
    output      wire                lcd_clk     ,
    output      wire    [10:0]      axi_x       , 
    output      wire    [10:0]      axi_y       
);

// localparam
// 4.3' 480*272 
    localparam  H_SYNC_4342   =  11'd41     ,   
                H_BACK_4342   =  11'd2      ,    
                H_DISP_4342   =  11'd480    ,  
                H_FRONT_4342  =  11'd2      ,    
                H_TOTAL_4342  =  11'd525    ,  

                V_SYNC_4342   =  11'd10     ,   
                V_BACK_4342   =  11'd2      ,    
                V_DISP_4342   =  11'd272    ,  
                V_FRONT_4342  =  11'd2      ,    
                V_TOTAL_4342  =  11'd286    ,  
   
// 7' 800*480   
                H_SYNC_7084   =  11'd128    ,  
                H_BACK_7084   =  11'd88     ,   
                H_DISP_7084   =  11'd800    ,  
                H_FRONT_7084  =  11'd40     ,   
                H_TOTAL_7084  =  11'd1056   , 

                V_SYNC_7084   =  11'd2      ,    
                V_BACK_7084   =  11'd33     ,   
                V_DISP_7084   =  11'd480    ,  
                V_FRONT_7084  =  11'd10     ,   
                V_TOTAL_7084  =  11'd525    ,  
   
// 7' 1024*600   
                H_SYNC_7016   =  11'd20     ,   
                H_BACK_7016   =  11'd140    ,  
                H_DISP_7016   =  11'd1024   , 
                H_FRONT_7016  =  11'd160    ,  
                H_TOTAL_7016  =  11'd1344   , 

                V_SYNC_7016   =  11'd3      ,    
                V_BACK_7016   =  11'd20     ,   
                V_DISP_7016   =  11'd600    ,  
                V_FRONT_7016  =  11'd12     ,   
                V_TOTAL_7016  =  11'd635    ,  
   
// 10.1' 1280*800   
                H_SYNC_1018   =  11'd10     ,   
                H_BACK_1018   =  11'd80     ,   
                H_DISP_1018   =  11'd1280   , 
                H_FRONT_1018  =  11'd70     ,   
                H_TOTAL_1018  =  11'd1440   , 

                V_SYNC_1018   =  11'd3      ,    
                V_BACK_1018   =  11'd10     ,   
                V_DISP_1018   =  11'd800    ,  
                V_FRONT_1018  =  11'd10     ,   
                V_TOTAL_1018  =  11'd823    ,  

// 4.3' 800*480   
                H_SYNC_4384   =  11'd128    ,  
                H_BACK_4384   =  11'd88     ,   
                H_DISP_4384   =  11'd800    ,  
                H_FRONT_4384  =  11'd40     ,   
                H_TOTAL_4384  =  11'd1056   , 

                V_SYNC_4384   =  11'd2      ,    
                V_BACK_4384   =  11'd33     ,   
                V_DISP_4384   =  11'd480    ,  
                V_FRONT_4384  =  11'd10     ,   
                V_TOTAL_4384  =  11'd525    ;  

    // 不同分辨率时序参数不同
    reg     [10:0]      H_SYNC  ;
    reg     [10:0]      H_BACK  ;
    reg     [10:0]      H_DISP  ;
    reg     [10:0]      H_FRONT ;
    reg     [10:0]      H_TOTAL ;
    reg     [10:0]      V_SYNC  ;
    reg     [10:0]      V_BACK  ;
    reg     [10:0]      V_DISP  ;
    reg     [10:0]      V_FRONT ;
    reg     [10:0]      V_TOTAL ;
    // reg signal define 
    reg     [10:0]      cnt_row ; // 行计数器,记录一行中的第几列。行计数器归零,说明一行扫描完。
    reg     [10:0]      cnt_col ; // 列计数器,记录一列中的第几行。列计数器归零,说明一帧图像扫描完。
    // wire signal define
    wire                valid_H ; // 行时序有效信号
    wire                valid_V ; // 列时序有效信号
    wire                valid_HV; // 图像有效信号,由于lcd_display模块中产生像素数据信息是时序逻辑,所以lcd_de信号要对图像有效信号打1拍。

    /******************************************************************************************
    ********************************************main code**************************************
    *******************************************************************************************/
    // 时序参数赋值
    always @(*) begin
        case(lcd_id)
        16'd4324:   begin
                        H_SYNC  = H_SYNC_4342  ;
                        H_BACK  = H_BACK_4342  ;
                        H_DISP  = H_DISP_4342  ;
                        H_FRONT = H_FRONT_4342 ;
                        H_TOTAL = H_TOTAL_4342 ;
                        V_SYNC  = V_SYNC_4342  ;
                        V_BACK  = V_BACK_4342  ;
                        V_DISP  = V_DISP_4342  ;
                        V_FRONT = V_FRONT_4342 ;
                        V_TOTAL = V_TOTAL_4342 ;
                    end
        16'd7084:   begin
                        H_SYNC  = H_SYNC_7084  ;
                        H_BACK  = H_BACK_7084  ;
                        H_DISP  = H_DISP_7084  ;
                        H_FRONT = H_FRONT_7084 ;
                        H_TOTAL = H_TOTAL_7084 ;
                        V_SYNC  = V_SYNC_7084  ;
                        V_BACK  = V_BACK_7084  ;
                        V_DISP  = V_DISP_7084  ;
                        V_FRONT = V_FRONT_7084 ;
                        V_TOTAL = V_TOTAL_7084 ;
                    end
        16'd7016:   begin
                        H_SYNC  = H_SYNC_7016  ;
                        H_BACK  = H_BACK_7016  ;
                        H_DISP  = H_DISP_7016  ;
                        H_FRONT = H_FRONT_7016 ;
                        H_TOTAL = H_TOTAL_7016 ;
                        V_SYNC  = V_SYNC_7016  ;
                        V_BACK  = V_BACK_7016  ;
                        V_DISP  = V_DISP_7016  ;
                        V_FRONT = V_FRONT_7016 ;
                        V_TOTAL = V_TOTAL_7016 ;
                    end
        16'd4384:   begin
                        H_SYNC  = H_SYNC_4384  ;
                        H_BACK  = H_BACK_4384  ;
                        H_DISP  = H_DISP_4384  ;
                        H_FRONT = H_FRONT_4384 ;
                        H_TOTAL = H_TOTAL_4384 ;
                        V_SYNC  = V_SYNC_4384  ;
                        V_BACK  = V_BACK_4384  ;
                        V_DISP  = V_DISP_4384  ;
                        V_FRONT = V_FRONT_4384 ;
                        V_TOTAL = V_TOTAL_4384 ;
                    end
        16'd1018:   begin
                        H_SYNC  = H_SYNC_1018  ;
                        H_BACK  = H_BACK_1018  ;
                        H_DISP  = H_DISP_1018  ;
                        H_FRONT = H_FRONT_1018 ;
                        H_TOTAL = H_TOTAL_1018 ;
                        V_SYNC  = V_SYNC_1018  ;
                        V_BACK  = V_BACK_1018  ;
                        V_DISP  = V_DISP_1018  ;
                        V_FRONT = V_FRONT_1018 ;
                        V_TOTAL = V_TOTAL_1018 ;
                    end
        default :   begin
                        H_SYNC  = H_SYNC_1018  ;
                        H_BACK  = H_BACK_1018  ;
                        H_DISP  = H_DISP_1018  ;
                        H_FRONT = H_FRONT_1018 ;
                        H_TOTAL = H_TOTAL_1018 ;
                        V_SYNC  = V_SYNC_1018  ;
                        V_BACK  = V_BACK_1018  ;
                        V_DISP  = V_DISP_1018  ;
                        V_FRONT = V_FRONT_1018 ;
                        V_TOTAL = V_TOTAL_1018 ;
                    end
        endcase
    end
    // // reg signal define 
    // reg     [10:0]      cnt_row ; // 行计数器,记录一行中的第几列。行计数器归零,说明一行扫描完。
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) 
            cnt_row <= 11'd0 ;
        else if(cnt_row == (H_TOTAL - 1))
            cnt_row <= 11'd0 ;
        else 
            cnt_row <= cnt_row + 1'b1 ;
    end
    // reg     [10:0]      cnt_col ; // 列计数器,记录一列中的第几行。列计数器归零,说明一帧图像扫描完。
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) 
            cnt_col <= 11'd0 ;
        else if((cnt_col == (V_TOTAL - 1)) && (cnt_row == (H_TOTAL - 1)))
            cnt_col <= 11'd0 ;
        else if(cnt_row == (H_TOTAL - 1))
            cnt_col <= cnt_col + 1'b1 ;
        else 
            cnt_col <= cnt_col ;
    end
    // // wire signal define
    // wire                valid_H ; // 行时序有效信号
    assign  valid_H = ((cnt_row >= H_SYNC + H_BACK) && (cnt_row <= H_SYNC + H_BACK + H_DISP - 1)) ? 1'b1 : 1'b0 ;
    // wire                valid_V ; // 列时序有效信号
    assign  valid_V = ((cnt_col >= V_SYNC + V_BACK) && (cnt_col <= V_SYNC + V_BACK + V_DISP - 1)) ? 1'b1 : 1'b0 ;
    // wire                valid_HV; // 图像有效信号,由于lcd_display模块中产生像素数据信息是时序逻辑,所以lcd_de信号要对图像有效信号打1拍。
    assign  valid_HV = (valid_H && valid_V) ;
    // output      wire    [10:0]      axi_x       , 
    assign  axi_x = (valid_HV) ? cnt_row : 11'd0 ;
    // output      wire    [10:0]      axi_y       ,
    assign  axi_y = (valid_HV) ? cnt_col : 11'd0 ;
    // output      wire    [23:0]      lcd_rgb_out ,
    assign  lcd_rgb_out = pix_data  ;
    // output      reg                 lcd_de      ,
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) 
            lcd_de <= 1'b0 ;
        else 
            lcd_de <= valid_HV ;
    end
    // 本实验没用到的信号,赋值1;
    assign  lcd_bl    = 1'b1 ;
    assign  lcd_rstn  = 1'b1 ;
    assign  lcd_hsync = 1'b1 ;
    assign  lcd_vsync = 1'b1 ;
    assign  lcd_clk   = (sys_rst_n == 1'b1) ? sys_clk : 1'b0 ;
    // 传给像素数据生成模块的时序参数
    assign  H_SYNCtoDIS = H_SYNC ;
    assign  H_BACKtoDIS = H_BACK ;
    assign  H_DISPtoDIS = H_DISP ;
    assign  V_SYNCtoDIS = V_SYNC ;
    assign  V_BACKtoDIS = V_BACK ;
    assign  V_DISPtoDIS = V_DISP ;

endmodule

module top (
    input		wire				sys_clk		,
    input		wire				sys_rst_n	,

    inout       wire    [23:0]      lcd_rgb     ,

    output      wire                lcd_de      ,
    output      wire                lcd_bl      ,
    output      wire                lcd_rstn    ,
    output      wire                lcd_hsync   ,
    output      wire                lcd_vsync   ,
    output      wire                lcd_clk        
);
    // inout
    wire    [23:0]      lcd_rgb_out ;
    wire    [23:0]      lcd_rgb_in  ;
    assign              lcd_rgb     = (lcd_de) ? lcd_rgb_out : 24'dz ;
    assign              lcd_rgb_in  = lcd_rgb                        ;
    // 例化间连线
    wire    [15:0]      lcd_id      ;
    wire                clk_lcd     ;
    wire                rst_n       ;
    wire    [10:0]      H_SYNCtoDIS ;
    wire    [10:0]      H_BACKtoDIS ;
    wire    [10:0]      H_DISPtoDIS ;
    wire    [10:0]      V_SYNCtoDIS ;
    wire    [10:0]      V_BACKtoDIS ;
    wire    [10:0]      V_DISPtoDIS ;
    wire    [10:0]      axi_x       ; 
    wire    [10:0]      axi_y       ;
    wire    [23:0]      pix_data    ;    
      
rd_id rd_id_inst(
    .sys_clk                    ( sys_clk       ) ,
    .sys_rst_n                  ( sys_rst_n     ) ,
    .lcd_rgb                    ( lcd_rgb_in    ) , 

    .lcd_id                     ( lcd_id        ) 
);

clk_div clk_div_inst(
    .sys_clk                    ( sys_clk       ) ,
    .sys_rst_n                  ( sys_rst_n     ) ,
    .lcd_id                     ( lcd_id        ) ,

    .clk_lcd                    ( clk_lcd       ) ,
    .rst_n                      ( rst_n         )  
);

lcd_driver lcd_driver_inst(
    .sys_clk                    ( clk_lcd       ) ,
    .sys_rst_n                  ( rst_n         ) ,
    .pix_data                   ( pix_data      ) ,
    .lcd_id                     ( lcd_id        ) ,

    .H_SYNCtoDIS                ( H_SYNCtoDIS   ) ,
    .H_BACKtoDIS                ( H_BACKtoDIS   ) ,
    .H_DISPtoDIS                ( H_DISPtoDIS   ) ,
    .V_SYNCtoDIS                ( V_SYNCtoDIS   ) ,
    .V_BACKtoDIS                ( V_BACKtoDIS   ) ,
    .V_DISPtoDIS                ( V_DISPtoDIS   ) ,

    .lcd_de                     ( lcd_de        ) ,
    .lcd_rgb_out                ( lcd_rgb_out   ) ,
    .lcd_bl                     ( lcd_bl        ) ,
    .lcd_rstn                   ( lcd_rstn      ) ,
    .lcd_hsync                  ( lcd_hsync     ) ,
    .lcd_vsync                  ( lcd_vsync     ) ,
    .lcd_clk                    ( lcd_clk       ) ,
    .axi_x                      ( axi_x         ) , 
    .axi_y                      ( axi_y         )  
);

lcd_display lcd_display_inst(
    .sys_clk                    ( clk_lcd       ) ,
    .sys_rst_n                  ( rst_n         ) ,
    .axi_x                      ( axi_x         ) , 
    .axi_y                      ( axi_y         ) ,

    .H_SYNC                     ( H_SYNCtoDIS   ) ,
    .H_BACK                     ( H_BACKtoDIS   ) ,
    .H_DISP                     ( H_DISPtoDIS   ) ,
    .V_SYNC                     ( V_SYNCtoDIS   ) ,
    .V_BACK                     ( V_BACKtoDIS   ) ,
    .V_DISP                     ( V_DISPtoDIS   ) ,

    .pix_data                   ( pix_data      )                    
);

endmodule

`timescale 1ns/1ns
module test_top();
    reg                 sys_clk     ;
    reg                 sys_rst_n   ;

    wire    [23:0]      lcd_rgb     ;

    wire                lcd_de      ;
    wire                lcd_bl      ;
    wire                lcd_rstn    ;
    wire                lcd_hsync   ;
    wire                lcd_vsync   ;
    wire                lcd_clk     ;

    assign  lcd_rgb = lcd_de ?  {24{1'bz}} :  24'h80;

top top_inst(
    .sys_clk	        ( sys_clk   ) ,
    .sys_rst_n	        ( sys_rst_n ) ,

    .lcd_rgb            ( lcd_rgb   ) ,

    .lcd_de             ( lcd_de    ) ,
    .lcd_bl             ( lcd_bl    ) ,
    .lcd_rstn           ( lcd_rstn  ) ,
    .lcd_hsync          ( lcd_hsync ) ,
    .lcd_vsync          ( lcd_vsync ) ,
    .lcd_clk            ( lcd_clk   )  
);

    parameter CYCLE = 20 ;

    initial begin
        sys_clk    = 1'b1 ;
        sys_rst_n <= 1'b0 ;
        #( CYCLE * 10 )   ;
        #2                ;
        sys_rst_n <= 1'b1 ;
        #( CYCLE * 1000 ) ;
        $stop             ;
    end

    always #( CYCLE / 2 ) sys_clk = ~sys_clk ;


endmodule

仿真:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【MySQL】InnoDB和MyISAM区别详解(MySQL专栏启动)

&#x1f4eb;作者简介&#xff1a;小明java问道之路&#xff0c;2022年度博客之星全国TOP3&#xff0c;专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化&#xff0c;文章内容兼具广度、深度、大厂技术方案&#xff0c;对待技术喜欢推理加验证&#xff0c;就职于…

OpenCV C++ 图像 批处理 (批量调整尺寸、批量重命名)

文章目录 图像 批处理(调整尺寸、重命名)图像 批处理(调整尺寸、重命名) 拿着棋盘格,对着相机变换不同的方角度,采集十张以上(以10~20张为宜);或者棋盘格放到桌上,拿着相机从不同角度一通拍摄。 以棋盘格,第一个内焦点为坐标原点,便于计算世界坐标系下三维坐标; …

【代码随想录】算法训练计划24

回溯模板&#xff1a; 1、77. 组合 题目&#xff1a; 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 思路&#xff1a; 很经典的回溯&#xff0c;也是回溯中模板的经典应用&#xff0c;因而是回溯中的简单题…

97.qt qml-自定义Table之实现ctrl与shift多选

我们之前实现了:93.qt qml-自定义Table优化(新增:水平拖拽/缩放自适应/选择使能/自定义委托)-CSDN博客 实现选择使能的时候,我们只能一行行去点击选中,非常麻烦,所以本章我们实现ctrl多选与shift多选、 所以在Table控件新增两个属性: 1.实现介绍 ctrl多选实现原理:当我…

Redis新操作

1.Bitmaps 1.1概述 Bitmaps可以对位进行操作&#xff0c;实际上它就是一个字符串&#xff0c;可以将Bitmaps想象为一个以位为单位的数组&#xff0c;数组中的每个元素只能存储0或者1&#xff0c;数组的下标在Bitmaps被称为偏移量。 setbit key offset value&#xff1a;设置o…

Filter和ThreadLocal结合存储用户id信息

ThreadLocal并不是一个Thread&#xff0c;而是Thread的局部变量。当使用ThreadLocal维护变量时&#xff0c;ThreadLocal为每个使用该变量的线程提供独立的变量副本&#xff0c;所以每一个线程都可以独立地改变自己的副本&#xff0c;而不会影响其它线程所对应的副本。ThreadLoc…

M2 Mac Xcode编译报错 ‘***.framework/‘ for architecture arm64

In /Users/fly/Project/Pods/YYKit/Vendor/WebP.framework/WebP(anim_decode.o), building for iOS Simulator, but linking in object file built for iOS, file /Users/fly/Project/Pods/YYKit/Vendor/WebP.framework/WebP for architecture arm64 这是我当时编译模拟器时报…

cesium 重点区域大屏展示效果(加载行政区划)

cesium 重点区域大屏展示效果(配色不太好看,主要看思路和方法) 1、实现思路(文张最后有**源码 **) 1、第一步将cesium背景调成透明关掉光照大气等效果相关属性都在“viewer.scene”中 2、第二步添加背景图片此背景图片直接用html加css就可以完成 3、第三步添加蒙版效果也…

汇编基础知识

1.1 机器语言 机器语言就是一些二进制代码&#xff0c;存放在内存中。它是机器指令的集合&#xff0c;所谓机器指令就是机器能够正确执行的命令 1.2 汇编语言的产生 1.汇编语言的主体是汇编指令 2.汇编指令实际上就是机器指令的助记符。它们的唯一区别在于书写方式上 寄存器…

S7-1200PLC 作为MODBUSTCP服务器通信(多客户端访问)

S7-1200PLC作为MODBUSTCP服务器端通信编程应用&#xff0c;详细内容请查看下面文章链接&#xff1a; ModbusTcp通信(S7-1200PLC作为服务器端)-CSDN博客文章浏览阅读239次。S7-200Smart plc作为ModbusTcp服务器端的通信S7-200SMART PLC ModbusTCP通信(ModbusTcp服务器)_s7-200 …

Linux嵌入式I2C协议笔记

硬件: 1.I2C结构 在一个SOC中有一个或者多个I2C控制器,一个I2C控制器可以连接一个或多个I2C设备。 I2C总线需要两条线,时钟线SCL和数据线SDA 2.I2C传输数据格式 开始信号(S):SCL为高电平时,SDA山高电平向低电平跳变,开始传送数据。结束信号(P):SCL为高电平时,SDA…

Python中的实例属性和类属性

在这篇文章中&#xff0c;我们将探讨Python中的类是如何工作的&#xff0c;主要介绍实例和类的属性。这些属性是什么&#xff0c;它们之间的区别&#xff0c;以及创建和利用它们的python方法。 类属性与实例属性 首先&#xff0c;我们需要知道什么是实例。实例是属于类的对象。…

Docker安装Zookeeper

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

数据结构前言(空间复杂度)

1.空间复杂度 空间复杂度也是一个数学表达式&#xff0c;是对一个算法在运行过程中临时占用存储空间大小的量度 。 空间复杂度不是程序占用了多少bytes的空间&#xff0c;因为这个也没太大意义&#xff0c;所以空间复杂度算的是变量的个数。 空间复杂度计算规则基本跟实践复杂…

在Go编程中调用外部命令的几种场景

1.摘要 在很多场合, 使用Go语言需要调用外部命令来完成一些特定的任务, 例如: 使用Go语言调用Linux命令来获取执行的结果,又或者调用第三方程序执行来完成额外的任务。在go的标准库中, 专门提供了os/exec包来对调用外部程序提供支持, 本文将对调用外部命令的几种使用方法进行总…

Canal+Kafka实现MySQL与Redis数据同步(一)

CanalKafka实现MySQL与Redis数据同步&#xff08;一&#xff09; 前言 在很多业务情况下&#xff0c;我们都会在系统中加入redis缓存做查询优化。 如果数据库数据发生更新&#xff0c;这时候就需要在业务代码中写一段同步更新redis的代码。 这种数据同步的代码跟业务代码糅合…

SQL SERVER 2008安装教程

SQL SERVER 2008安装教程 本篇文章介绍了安装SQL Server 2008企业版的软硬件配置要求&#xff0c;安装过程的详细步骤&#xff0c;以及需要注意的事项。 安装步骤 (1). 在安装文件setup.exe上&#xff0c;单击鼠标右键选择“以管理员的身份运行”&#xff0c;如下图所示&#…

freetype将字符串制作成位图并显示过程详解

在流媒体项目中字幕显示是不可或缺的一环&#xff0c;一般会有字幕流在视频播放过程中进行显示&#xff1b;不过还有很多情况是从头到尾只在视频的某个区域显示某些文字&#xff0c;例如某个电视台的log&#xff1b;这种也称为字幕&#xff0c;如果想要将这些字符串显示到视频&…

ControlNet原理及应用

《Adding Conditional Control to Text-to-Image Diffusion Models》 目录 1.背景介绍 2.原理详解 2.1 Controlnet 2.2 用于Stable Diffusion的ControlNet 2.3 训练 2.4 推理 3.实验结果 3.1 定性结果 3.2 消融实验 3.3 和之前结果比较 3.4 数据集大小的影响 4.结…

【C++】进阶模板

非类型模板参数 模板参数分类类型形参与非类型形参。 类型形参&#xff1a;出现在模板参数列表中&#xff0c;跟在class或者typename之类的参数类型名称。 非类型形参&#xff1a;就是用一个常量作为类(函数)模板的一个参数&#xff0c;在类(函数)模板中可将该参数当成常量来使…