ZYNQ_project:lcd_pic_400x400

在lcd液晶屏上显示400x400像素的图片,

像素信息通过电脑的串口调试助手,发送给fpga,存储在例化的双端口ram中,

在要显示图像区域,读取ram中的像素信息。

模块框图:

时序图:

代码:

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

    output      reg                 clk_lcd     ,
    output      wire                clk_rx      ,
    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) ;
    assign  clk_rx  = clk_50Mhz             ;
    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     , // lcd的时钟,用来读取ram�?数�??
    input       wire                sys_rst_n   , 
    input       wire                clk_wr_ram  , // 50Mhz,与rx模块相同时钟�?
    input       wire    [10:0]      axi_x       ,
    input       wire    [10:0]      axi_y       ,
    input       wire    [7:0]       pi_data     ,
    input       wire                pi_flag     ,

    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 ; // 天空�?
    localparam  PIC_SIZE    = 11'd400    , // 正方形图片像素大�?100*100
                H_BYOND     = 11'd200    , 
                V_BYOND     = 11'd40     ; 
    localparam  DEEP        = 18'd160_000 ; // ram深度
    // reg signal define
    reg     [ 7:0]      data1       ;
    reg     [ 7:0]      data2       ;
    reg     [ 7:0]      data3       ;
    reg     [ 1:0]      cnt_data    ;
    reg                 data_flag   ;
    reg     [17:0]      wr_addr     ;
    reg     [23:0]      wr_data     ; 
    reg                 wr_en       ;
    reg     [17:0]      rd_addr     ;

    // wire signal define
    wire                wr_en_r     ;
    wire    [17:0]      wr_addr_r   ;
    wire    [23:0]      wr_data_r   ;
    wire    [17:0]      rd_addr_r   ;
    wire                all_en      ;
    wire                rd_en       ;
    wire    [23:0]      rd_data     ;
/******************************************************************************************
********************************************main code**************************************
*******************************************************************************************/
    // // reg signal define
    // reg     [ 7:0]      data1       ;
    always @(posedge clk_wr_ram or negedge sys_rst_n) begin
        if(~sys_rst_n) 
            data1 <= 8'd0 ;
        else if(pi_flag && (cnt_data == 0))
            data1 <= pi_data ;
        else 
            data1 <= data1 ;
    end
    // reg     [ 7:0]      data2       ;
    always @(posedge clk_wr_ram or negedge sys_rst_n) begin
        if(~sys_rst_n) 
            data2 <= 8'd0 ;
        else if(pi_flag && (cnt_data == 1))
            data2 <= pi_data ;
        else 
            data2 <= data2 ;
    end
    // reg     [ 7:0]      data3       ;
    always @(posedge clk_wr_ram or negedge sys_rst_n) begin
        if(~sys_rst_n) 
            data3 <= 8'd0 ;
        else if(pi_flag && (cnt_data == 2))
            data3 <= pi_data ;
        else 
            data3 <= data3 ;
    end
    // reg     [ 1:0]      cnt_data    ;
    always @(posedge clk_wr_ram or negedge sys_rst_n) begin
        if(~sys_rst_n) 
            cnt_data <= 2'd0 ;
        else if(pi_flag && cnt_data == 2)
            cnt_data <= 2'd0 ;
        else if(pi_flag)
            cnt_data <= cnt_data + 1'b1 ;
        else 
            cnt_data <= cnt_data ;
    end
    // reg                 data_flag   ;
    always @(posedge clk_wr_ram or negedge sys_rst_n) begin
        if(~sys_rst_n) 
            data_flag <= 1'b0 ;
        else if(pi_flag && cnt_data == 2)
            data_flag <= 1'b1 ;
        else 
            data_flag <= 1'b0 ;
    end
    // reg     [17:0]      wr_addr     ;
    always @(posedge clk_wr_ram or negedge sys_rst_n) begin
        if(~sys_rst_n) 
            wr_addr <= 18'd0 ;
        else if(wr_en &&( wr_addr == DEEP - 1))
            wr_addr <= 18'd0 ;
        else if(wr_en)
            wr_addr <= wr_addr + 1'b1 ;
        else 
            wr_addr <= wr_addr ;
    end
    // reg     [23:0]      wr_data     ; 
    always @(posedge clk_wr_ram or negedge sys_rst_n) begin
        if(~sys_rst_n) 
            wr_data <= 24'd0 ;
        else if(data_flag)
            wr_data <= {data1,data2,data3} ;
        else 
            wr_data <= wr_data ;
    end
    // reg                 wr_en       ;
    always @(posedge clk_wr_ram or negedge sys_rst_n) begin
        if(~sys_rst_n) 
            wr_en <= 1'b0 ;
        else 
            wr_en <= data_flag ;
    end
    // reg     [17:0]      rd_addr     ; // 读地�?的时钟与lcd的时钟相同�??
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) 
            rd_addr <= 18'd0 ;
        else if(rd_en && rd_addr == DEEP - 1)
            rd_addr <= 18'd0 ;
        else if(rd_en)
            rd_addr <= rd_addr + 1'b1 ;
        else 
            rd_addr <= rd_addr ;
    end

    // wire signal define
    // wire                wr_en_r     ;
    assign              wr_en_r     = wr_en   ;
    // wire    [13:0]      wr_addr_r   ;
    assign              wr_addr_r   = wr_addr ;
    // wire    [23:0]      wr_data_r   ;
    assign              wr_data_r   = wr_data ;
    // wire    [13:0]      rd_addr_r   ;
    assign              rd_addr_r   = rd_addr ;
    // wire                all_en      ;
    assign  all_en = 1'b1 ;
    // wire                rd_en       ;
    assign  rd_en = ((axi_y >= V_SYNC + V_BACK + V_BYOND) && (axi_y <= V_SYNC + V_BACK + V_BYOND + PIC_SIZE - 1)
                    && (axi_x >= H_SYNC + H_BACK + H_BYOND) && (axi_x <= H_SYNC + H_BACK + H_BYOND + PIC_SIZE - 1)) ? 1'b1 : 1'b0 ;
    // wire    [23:0]      rd_data     ;
    // output pix_data
    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(rd_en) begin
                    pix_data <= rd_data ;
                end 
                else 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 
            end
        else  
            pix_data <= BLACK ;
    end
    
//  例化ram
ram_24x400x400 ram_24x400x400_inst (
    .clka                           ( clk_wr_ram    ) , // input wire clka
    .ena                            ( all_en        ) , // input wire ena
    .wea                            ( wr_en_r       ) , // input wire [0 : 0] wea
    .addra                          ( wr_addr_r     ) , // input wire [13 : 0] addra
    .dina                           ( wr_data_r     ) , // input wire [23 : 0] dina

    .clkb                           ( sys_clk       ) , // input wire clkb
    .enb                            ( rd_en         ) , // input wire enb
    .addrb                          ( rd_addr       ) , // input wire [13 : 0] addrb

    .doutb                          ( rd_data       )   // output wire [23 : 0] doutb
);

// ila_0 your_instance_name (
// 	.clk(clk_wr_ram), // input wire clk


// 	.probe0(pi_flag), // input wire [0:0]  probe0  
// 	.probe1(pi_data), // input wire [7:0]  probe1 
// 	.probe2(data1), // input wire [6:0]  probe2 
// 	.probe3(data2), // input wire [6:0]  probe3 
// 	.probe4(data3), // input wire [6:0]  probe4 
// 	.probe5(wr_en_r), // input wire [0:0]  probe5 
// 	.probe6(wr_addr_r), // input wire [22:0]  probe6 
// 	.probe7(wr_addr_r) // input wire [13:0]  probe7
// );

// ila_0 ila_0_inst (
// 	.clk(clk_wr_ram), // input wire clk

// 	// .probe0(rd_en), // input wire [0:0]  probe0  
// 	// .probe1(rd_addr), // input wire [13:0]  probe1 
// 	// .probe2(rd_data), // input wire [23:0]  probe2 
// 	// .probe3(wr_en_r), // input wire [0:0]  probe3 
// 	// .probe4(axi_x), // input wire [10:0]  probe4 
// 	// .probe5(axi_y), // input wire [10:0]  probe5
// 	.probe0( ), // input wire [0:0]  probe0  
// 	.probe1( ), // input wire [13:0]  probe1 
// 	.probe2( ), // input wire [23:0]  probe2 
// 	.probe3( ), // input wire [0:0]  probe3 
// 	.probe4( ), // input wire [10:0]  probe4 
// 	.probe5( ), // input wire [10:0]  probe5

// 	.probe6(pi_flag), // input wire [0:0]  probe6 
// 	.probe7(pi_data), // input wire [7:0]  probe7 
// 	.probe8 (data1), // input wire [7:0]  probe8 
// 	.probe9 (data2), // input wire [7:0]  probe9 
// 	.probe10(data3), // input wire [7:0]  probe10 
// 	.probe11(wr_data), // input wire [23:0]  probe11 
// 	.probe12(cnt_data) // input wire [1:0]  probe12

// );

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

 

`define    CLOCK        50_000_00//0
`define    BPS          115200
`define    BIT_NO_CHACK 9       // 1bit起始位+8bit数据位
`define    BIT_CHACK    10      // 1bit起始位+8bit数据位+1bit校验位
`define    ODD          1       // 1bit起始位+8bit数据位+1bit校验位
`define    EVEN         0       // 1bit起始位+8bit数据位+1bit校验位

/*
奇校验:原始码流+校验位 总共有奇数个1

偶校验:原始码流+校验位 总共有偶数个1
*/
/*
// 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

 

// // uart�Ľ���ģ�飬Ҫ�����ʿɵ�,�ػ�ʵ��
// // ��ɻػ�ʵ������У��λ
// // Ȼ�����led��������Ŀ���ģ��
// `include         "para.v"
// module rx (
//     input       wire                sys_clk     ,
//     input       wire                sys_rst_n   ,
//     input       wire                rx          ,

//     output      reg     [7:0]       po_data     , // port_output
//     output      reg                 po_flag     
// );
//     // parameter
//     parameter   MAX_BPS_CNT = `CLOCK/`BPS   ,//434 ,
//                 MAX_BIT_CNT = `BIT_CHACK    ;//10   ; 
//     localparam  RX_MOD      = 1'b1          ,
//                 CHECK_MOD   = `EVEN         ;
//     // reg signal define
//     reg                 rx_r1    ;
//     reg                 rx_r2    ;
//     reg     [31:0]      cnt_bps  ;
//     reg                 work     ;
//     reg     [3:0]       cnt_bit  ;
//     reg     [7:0]       data_reg ;
//     reg                 check    ;
//     reg                 check_reg;
//     // wire signal define
//     wire                nege    ;
//     /*******************************************************************/
//     // // reg signal define
//     // reg                 rx_r1   ;
//     always @(posedge sys_clk or negedge sys_rst_n) begin
//         if(~sys_rst_n) 
//             rx_r1 <= 1'b1 ;
//         else
//             rx_r1 <= rx ;
//     end
//     // reg                 rx_r2   ;
//     always @(posedge sys_clk or negedge sys_rst_n) begin
//         if(~sys_rst_n) 
//             rx_r2 <= 1'b1 ;
//         else
//             rx_r2 <= rx_r1 ;
//     end
//     // reg                 work    ;
//     always @(posedge sys_clk or negedge sys_rst_n) begin
//         if(~sys_rst_n) 
//             work <= 1'b0 ;
//         else if(nege)
//             work <= 1'b1 ;
//         else if((cnt_bit == ((MAX_BIT_CNT - 1))) && (cnt_bps == (MAX_BPS_CNT - 1))) // ��������������end_cnt_XXX�����棬����߼���
//             work <= 1'b0 ;
//         else 
//             work <= work ;
//     end
//     // reg     [31:0]      cnt_bps ;
//     always @(posedge sys_clk or negedge sys_rst_n) begin
//         if(~sys_rst_n) 
//             cnt_bps <= 32'd0 ;
//         else if(work && (cnt_bps == (MAX_BPS_CNT - 1)))
//             cnt_bps <= 32'd0 ;
//         else if(work)
//             cnt_bps <= cnt_bps + 1'b1 ;
//         else 
//             cnt_bps <= 32'd0 ;
//     end
//     // reg     [3:0]       cnt_bit ; Ӧ�û��0
//     always @(posedge sys_clk or negedge sys_rst_n) begin
//         if(~sys_rst_n) 
//             cnt_bit <= 4'd0 ;
//         else if (work && (cnt_bps == (MAX_BPS_CNT - 1) && cnt_bit == (MAX_BIT_CNT - 1)))
//             cnt_bit <= 4'd0 ;
//         else if (work && (cnt_bps == (MAX_BPS_CNT - 1)))
//             cnt_bit <= cnt_bit + 1'b1 ;
//         else if(work)
//             cnt_bit <= cnt_bit ;
//         else 
//             cnt_bit <= 8'd0 ;
//     end
//     // reg     [7:0]       data_reg;
//     always @(posedge sys_clk or negedge sys_rst_n) begin
//         if(~sys_rst_n) 
//             data_reg <= 8'd0 ;
//         else if(work && cnt_bps == (MAX_BPS_CNT/2)) begin // �������ɼ����ݵ�ʱ��
//             case (cnt_bit)
//                 0 : data_reg <= 8'd0 ;
//                 1 : data_reg[cnt_bit - 1] <= rx_r2 ;
//                 2 : data_reg[cnt_bit - 1] <= rx_r2 ;
//                 3 : data_reg[cnt_bit - 1] <= rx_r2 ;
//                 4 : data_reg[cnt_bit - 1] <= rx_r2 ;
//                 5 : data_reg[cnt_bit - 1] <= rx_r2 ;
//                 6 : data_reg[cnt_bit - 1] <= rx_r2 ;
//                 7 : data_reg[cnt_bit - 1] <= rx_r2 ;
//                 8 : data_reg[cnt_bit - 1] <= rx_r2 ;
//                 default: data_reg <= data_reg ;
//             endcase
//         end else
//             data_reg <= data_reg ;
//     end
//     // // wire signal define
//     // wire                nege    ;
//     assign  nege = ~rx_r1 && rx_r2 ;
//     // reg                 check    ;
//     always @(posedge sys_clk or negedge sys_rst_n) begin
//         if(~sys_rst_n) 
//             check <= 1'b0 ;
//         else if(CHECK_MOD && (cnt_bit == ((MAX_BIT_CNT - 2))) && (cnt_bps == (MAX_BPS_CNT - 1)))
//             check <= ~^data_reg ;
//         else if(~CHECK_MOD && (cnt_bit == ((MAX_BIT_CNT - 2))) && (cnt_bps == (MAX_BPS_CNT - 1)))
//             check <= ^data_reg ;    
//         else 
//             check <= check ;
//     end  
//     // reg                 check_reg;
//     always @(posedge sys_clk or negedge sys_rst_n) begin
//         if(~sys_rst_n) 
//             check_reg <= 1'b0 ;
//         else if((cnt_bit == ((MAX_BIT_CNT - 1))) && (cnt_bps == (MAX_BPS_CNT /2)))
//             check_reg <= rx_r2 ;
//         else 
//             check_reg <= check_reg ;
//     end  
//     // output      reg     [7:0]       po_data     , // port_output
//     always @(posedge sys_clk or negedge sys_rst_n) begin
//         if(~sys_rst_n) 
//             po_data <= 8'd0 ;
//         else if((check == check_reg) && (cnt_bit == ((MAX_BIT_CNT - 1))) && (cnt_bps == (MAX_BPS_CNT - 1)))
//             po_data <= data_reg ;
//         else if(RX_MOD)
//             po_data <= po_data ;
//         else 
//             po_data <= 8'd0 ;
//     end
//     // output      reg                 po_flag   
//     always @(posedge sys_clk or negedge sys_rst_n) begin
//         if(~sys_rst_n) 
//             po_flag <= 1'd0 ;
//         else if((check == check_reg) && ((cnt_bit == ((MAX_BIT_CNT - 1))) && (cnt_bps == (MAX_BPS_CNT - 1)))) 
//             po_flag <= 1'b1 ;
//         else 
//             po_flag <= 1'd0 ;
//     end  

// endmodule
module rx
#(
    parameter UART_BPS = 'd115200       ,
              CLK_FREQ = 'd50_000_000 
)(
    input       wire            sys_clk   ,
    input       wire            sys_rst_n ,
    input       wire            rx        ,

    output      reg     [7:0]   po_data   ,
    output      reg             po_flag 
);

    localparam BAUD_CNT_MAX = CLK_FREQ / UART_BPS ;
    // reg define signal
    reg                 rx_reg1     ;
    reg                 rx_reg2     ;
    reg                 rx_reg3     ;
    reg                 start       ;
    reg                 work_en     ;
    reg     [12:00]     baud_cnt    ;
    reg                 bit_flag    ;
    reg     [ 3: 0]     bit_cnt     ;
    reg     [ 7: 0]     rx_data     ;
    reg                 rx_flag     ;

    // rx_reg1     ;rx_reg2     ;rx_reg3     ;
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) begin
            rx_reg1 <= 1'b1 ;
            rx_reg2 <= 1'b1 ;
            rx_reg3 <= 1'b1 ;
        end else begin
            rx_reg1 <= rx      ;
            rx_reg2 <= rx_reg1 ;
            rx_reg3 <= rx_reg2 ;
        end
    end
    // start       ;
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) begin
            start <= 1'b0 ;
        end else begin
            if(rx_reg3 == 1'b1 && rx_reg2 == 1'b0 && bit_cnt == 4'd0) begin // 或者bit_cnt换成 work_en == 0 
                start <= 1'b1 ;
            end else begin
                start <= 1'b0 ;
            end
        end
    end
    // work_en     ;
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) begin
            work_en <= 1'b0 ;
        end else begin
            if(start == 1'b1) begin
                work_en <= 1'b1 ;
            end else begin
                if((bit_cnt == 4'd8) && (bit_flag == 1'b1)) begin
                    work_en <= 1'b0 ;
                end else begin
                    work_en <= work_en ;
                end
            end
        end
    end
    // [12:00]     baud_cnt    ;
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) begin
            baud_cnt <= 13'd0 ;
        end else begin
            if(work_en == 1'b1 && baud_cnt == BAUD_CNT_MAX - 1'b1) begin
                baud_cnt <= 13'd0 ;
            end else begin
                if(work_en == 1'b1) begin
                    baud_cnt <= baud_cnt + 1'b1 ;
                end else begin
                    baud_cnt <= 13'd0 ;
                end
            end
        end
    end
    // always @(posedge sys_clk or negedge sys_rst_n) begin
    //     if(~sys_rst_n) begin
    //         baud_cnt <= 13'd0 ;
    //     end else begin
    //         if(work_en == 1'b1 && baud_cnt == BAUD_CNT_MAX - 1'b1 || work_en == 1'b0) begin
    //             baud_cnt <= 13'd0 ;
    //         end else begin
    //             baud_cnt <= baud_cnt + 1'b1 ; 
    //         end
    //     end
    // end
    // bit_flag    ;
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) begin
            bit_flag <= 1'b0 ;
        end else begin
            if(baud_cnt == BAUD_CNT_MAX - 1'b1) begin // 也可以写成baud_cnt == BAUD_CNT_MAX / 2 - 1'b1
                bit_flag <= 1'b1 ;                    // 这样后面赋值时,就可以直接用bit_flag .
            end else begin
                bit_flag <= 1'b0 ;
            end
        end
    end
    // [ 2: 0]     bit_cnt     ;
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) begin
            bit_cnt <= 4'd0 ;
        end else begin
            if(bit_flag == 1'b1 && work_en == 1'b1 && bit_cnt == 4'd8) begin
                bit_cnt <= 4'd0 ;
            end else begin
                if(bit_flag == 1'b1 && work_en == 1'b1) begin
                    bit_cnt <= bit_cnt + 1'b1 ;
                end else begin
                    if(work_en == 1'b1) begin
                        bit_cnt <= bit_cnt ;
                    end else begin
                        bit_cnt <= 3'd0 ;
                    end
                end
            end
        end
    end
    // [7:0]   rx_data   ,
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) begin
            rx_data <= 8'd0 ;
        end else begin
            if(bit_cnt >= 4'd1 && bit_cnt <= 4'd8 && baud_cnt == BAUD_CNT_MAX / 2'd2) begin
                rx_data <= {rx_reg3, rx_data[7:1]} ;
            end else begin
                rx_data <= rx_data ;
            end
        end
    end
    // rx_flag 
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) begin
            rx_flag <= 1'b0 ;
        end else begin
            if(bit_cnt == 4'd8 && bit_flag == 1'b1) begin
                rx_flag <= 1'b1 ;
            end else begin
                rx_flag <= 1'b0 ;
            end
        end
    end
    // output signal
    // po_flag 
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) begin
            po_flag <= 1'b0 ;
        end else begin
            if(rx_flag == 1'b1) begin
                po_flag <= 1'b1 ;
            end else begin
                po_flag <= 1'b0 ;
            end
        end
    end
    // po_data
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) begin
            po_data <= 8'd0 ;
        end else begin
            if(rx_flag == 1'b1) begin
                po_data <= rx_data ;
            end else begin
                po_data <= 8'd0 ;
            end
        end
    end
endmodule

 

module top (
    input		wire				sys_clk		,
    input		wire				sys_rst_n	,
    input       wire                rx          ,

    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    ;    
    wire    [7:0]       po_data     ;
    wire                po_flag     ;
    wire                clk_rx      ;
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_rx                     ( clk_rx        ) ,
    .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         ) ,
    .pi_data                    ( po_data       ) ,
    .pi_flag                    ( po_flag       ) ,
    .clk_wr_ram                 ( clk_rx        ) ,

    .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      )                    
);

rx rx_inst(
    .sys_clk                    ( clk_rx        ) ,
    .sys_rst_n                  ( rst_n         ) ,
    .rx                         ( rx            ) ,

    .po_data                    ( po_data       ) ,
    .po_flag                    ( po_flag       )  
);

endmodule

 

上板验证:

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

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

相关文章

电脑开不了机怎么办?三招帮你成功解决!

电脑是我们日常工作和生活的重要工具&#xff0c;但有时候它们也会出现开机问题。当电脑无法启动时&#xff0c;可能会让人感到焦虑&#xff0c;电脑开不了机怎么办&#xff1f;不必担心&#xff0c;通常有多种方法可以解决这些问题。本文将介绍三种常见的方法&#xff0c;以帮…

你真的会写简历吗?软件测试简历修改包装...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、简历重要性以及…

《微信小程序开发从入门到实战》学习二十三

前言 之前是先看文章&#xff0c;再敲代码&#xff0c;出现预览效果&#xff0c;最后码字。 现在改变顺序&#xff0c;先直接照着敲代码&#xff0c;再看文章&#xff0c;最后码字。不知道能不能更加内化学习到该书作者教的内容。希望自己不是一味照抄书的代码和内容。 ​3.…

【GitHub】保姆级使用教程

一、如何流畅访问GitHub 1、网易uu加速器 输入网址&#xff0c;无脑下载网易加速器&#xff1b;https://uu.163.com/ 下载安装完毕后&#xff0c;创建账号进行登录 登录后&#xff0c;在右上角搜索框中搜索“学术资源”&#xff0c;并点击&#xff1b; 稍等一会儿就会跳…

微信小程序会议OA-登录获取手机号流程登录-小程序导入微信小程序SDK(从微信小程序和会议OA登录获取手机号到登录小程序导入微信小程序SDK)

目录 获取用户昵称头像和昵称 wx.getUserProfile bindgetuserinfo 登录过程 登录-小程序 wx.checkSession wx.login wx.request 后台 准备数据表 反向生成工具生成 准备封装前端传过来的数据 小程序服器配置 导入微信小程序SDK application.yml WxProperties …

PLC通过Modbus转profinet网关读取并控制恒压供水系统中的变频器频率

PLC通过Modbus转profinet网关读取并控制恒压供水系统中的变频器频率 PLC通过Modbus转Profinet网关(XD-MDPN100)在恒压供水系统中读取变频器的频率。该系统实时监控逆变器的频率&#xff0c;以确保水的供应能够保持恒定的压力。PLC通过Modbus与变频器通信&#xff0c;将读取的频…

配置中心

服务配置中心介绍 首先我们来看一下,微服务架构下关于配置文件的一些问题&#xff1a; 1. 配置文件相对分散。 在一个微服务架构下&#xff0c;配置文件会随着微服务的增多变的越来越多&#xff0c;而且分散 在各个微服务中&#xff0c;不好统一配置和管理。 2. 配置文件无…

【excel技巧】单元格内的公式如何隐藏?

Excel文件中最重要的除了数据还有就是一些公式了&#xff0c;但是只要点击单元格&#xff0c;公式就能显示出来&#xff0c;如果不想别人看到公式应该如何设置呢&#xff1f;今天分享隐藏excel单元格数据的方法。 选中单元格&#xff0c;点击右键打开【设置单元格格式】&#x…

深度了解LinkedBlockingQueue底层实现原理

文章目录 前言一、Queue接口的定义二、AbstractQueue实现Queue的基本操作1.AbstractQueue源码注释解析2.方法add、remove、element、clear、addAll的实现原理 三、BlockingQueue接口定义解析1.入列操作2.出列操作3.其他操作 四、LinkedBlockingQueue源码解析1.LinkedBlockingQu…

Python学习(打基础版)

以前只是大致的了解&#xff0c;现在比较完整的整理一下笔记&#xff0c;以后工作可能会用到。 学习地址如下所示&#xff1a;黑马程序员python教程&#xff0c;8天python从入门到精通&#xff0c;学python看这套就够了_哔哩哔哩_bilibili 第一章 环境配置 1 初识Python 人…

Git——感谢尚硅谷官方文档

Git——尚硅谷学习笔记 第1章 Git 概述1.1 何为版本控制1.2 为什么需要版本控制1.3 版本控制工具1.4 Git 简史1.5 Git 工作机制1.6 Git 和代码托管中心 第2章 Git 安装第 3 章 Git 常用命令3.1 设置用户签名3.2 初始化本地库3.3 查看本地库状态3.4 添加暂存区3.4.1 将工作区的文…

在vue-cli中快速使用webpack-bundle-analyzer

webpack-bundle-analyzer 是一个可视化资源分析工具&#xff0c;可以直观地分析打包出的文件有哪些&#xff0c;及它们的大小、占比情况、各文件 Gzip压缩后的大小、模块包含关系、依赖项等。 从vue-cli官方的更新记录可以看到&#xff0c;从vue-cli3开始集成report命令 当前环…

工业交换机的六种分类

工业交换机可以按照不同的标准进行分类&#xff0c;具体有六种分类方法。我们今天就来简单了解一下这六种分类方法&#xff0c;它们分别是&#xff1a;工业交换机的管理标准、工业交换机的结构标准、工业交换机的网络位置、工业交换机的传输速率、工业交换机的工作协议以及工业…

我觉得Ubuntu上的Ros2与单片机就是这么通讯的

首先Ubuntu上面建立一个功能包pkg ,包里面写一个cpp文件&#xff0c;然后在这个cpp文件里面建立一个node,然后使用这个node去获取单片机从串口传过来的数据。 平时都是使用串口调试助手来收发数据的&#xff0c;好像ros2里面有一个专门搞这个事情的东西叫做 serial库。学一下…

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《计及氢电混合动力车响应的多区域综合能源系统协调优化调度》

这个标题涉及到一个复杂的能源系统优化问题&#xff0c;其中考虑了氢电混合动力车的响应。下面是对标题中各个关键词的解读&#xff1a; 多区域综合能源系统&#xff1a; 涉及多个地理区域的综合能源系统&#xff0c;这可能包括电力网络、燃气网络、热能网络等&#xff0c;这些…

基于JAVA+SpringBoot+VUE+微信小程序的前后端分离咖啡小程序

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 随着社会的快速发展和…

用向量数据库Milvus Cloud搭建GPT大模型+私有知识库的定制商业文案助手

随着智能助手的不断普及和发展,商业文案的创作也变得更加智能化和定制化。在这个信息爆炸的时代,商业文案的撰写已经不再是简单的文字表达,而是需要结合大数据分析和人工智能技术,以更好地满足目标客群的需求。在本文中,我们将介绍如何利用向量数据库Milvus Cloud搭建GPT大…

tokenizers Tokenizer 类

Tokenizer 类 依赖安装 pip install tensorflow pip install tensorflow -i https://pypi.tuna.tsinghua.edu.cn/simple基类原型 tokenizers.Tokenizer(model)基类说明 Tokenizer 函数构造一个分词器对象。分词方式主要有word-level、subword-level、char-level三种&#x…

财报解读:第三季度营收净利双增,中通快递的进击根本停不下来?

快递业又变天了。 在极兔上市之前&#xff0c;快递行业的格局几乎已经稳定&#xff0c;“通达系们”占据了过半的市场份额。数据显示&#xff0c;2022年按包裹量计&#xff0c;中通、圆通、申通、韵达市占率分别为22.1%、15.81%、11.71%、15.92%&#xff0c;共计占比达65.54%。…

数据结构——散列表

参考书籍&#xff1a; 《数据结构与抽象&#xff1a;Java语言描述》 第四版 一、背景知识 散列&#xff08;hashing&#xff09;&#xff1a;是仅利用项的查找键&#xff0c;无需查找就可确定其下标的一项技术散列表&#xff08;hash table&#xff09;&#xff1a;数组散列索引…