module LCD_CTRL # (parameter WORD_WIDTH = 24 ,parameter H_FRONT_PORCH = 8 ,parameter H_BACK_PORCH = 43 ,parameter H_SYNC = 4 //H——TOTAL=HFP +HBP +H_SYNC + H_ACTIVE=531 ,parameter V_FRONT_PORCH = 8 //V_TOTAL = VFP +VBP +V_SYNC + V_ACTIVE,V_TOTAL = 292 ,parameter V_BACK_PORCH = 12 ,parameter V_SYNC = 4 ,parameter H_ACTIVE = 480 ,parameter V_ACTIVE = 272// 120// ) (//input rst_n input sysclk ,input wire rst_n ,output lcd_A_vs ,output lcd_A_hs ,output lcd_A_de ,output lcd_A_clk ,output [WORD_WIDTH-1:0] lcd_A_rgb ///////////init ,output wire rgb_en ,output wire lcd_disp // ,output wire o_mosi // ,output wire o_mclk // ,output wire o_cs ); parameter BLACK = 24'h000000; //红色 parameter RED = 24'hFF0000; //红色 parameter GREEN = 24'h00FF00; //绿色 parameter BLUE = 24'h0000FF; //蓝色 //场同步信号的参数 parameter RED_CNT = 16'd90; //红色 parameter GREEN_CNT = 16'd180; //绿色 parameter BLUE_CNT = 16'd270; //蓝色 //行同步信号的参数 parameter H_RED_CNT = 16'd160; //红色 parameter H_GREEN_CNT = 16'd320; //绿色 parameter H_BLUE_CNT = 16'd479; //蓝色 //------------------------HSYNC的时间计数 begin reg[15:0] h_cnt; wire clk_9m; reg [WORD_WIDTH-1:0] pixel_data; Gowin_CLKDIV CLKDIV_9m ( .clkout(clk_9m), //output clkout .hclkin(sysclk), //input hclkin .resetn(1) //input resetn ); always @ (posedge clk_9m or negedge rst_n) begin if(!rst_n) h_cnt <= 'd0; else if(h_cnt >= H_SYNC+H_BACK_PORCH+H_ACTIVE+H_FRONT_PORCH-1) h_cnt <= 'd0; else h_cnt <= h_cnt + 'd1; end //------------------------HSYNC的时间计数 end //------------------------VSYNC的时间计数 begin reg[15:0] v_cnt; always @ (posedge clk_9m or negedge rst_n) begin if(!rst_n) v_cnt <= 'd0; else if(h_cnt == H_SYNC+H_BACK_PORCH+H_ACTIVE+H_FRONT_PORCH-1) begin//H_SYNC-2) if(v_cnt >= V_SYNC+V_BACK_PORCH+V_ACTIVE+V_FRONT_PORCH-1) v_cnt <= 'd0; else v_cnt <= v_cnt + 'd1; end else v_cnt <= v_cnt; end //------------------------VSYNC的时间计数 end //------------------------生成VSYNC信号 begin //vsync_r reg vsync_r; always @ (posedge clk_9m or negedge rst_n) begin if(!rst_n) vsync_r <= 'd1; else if((v_cnt >= 'd0) && (v_cnt <= V_SYNC-1)) //Negative vsync_r <= 'd0; else vsync_r <= 'd1; end //------------------------生成VSYNC信号 end //------------------------生成HSYNC信号 begin //hs reg hsync_r; always @ (posedge clk_9m or negedge rst_n) begin if(!rst_n) hsync_r <= 'd1; else if((h_cnt >= 'd0) && (h_cnt <= H_SYNC-1)) //Negative hsync_r <= 'd0; else hsync_r <= 'd1; end //------------------------生成HSYNC信号 end //------------------------生成DE信号 begin //de reg de_r; always @ (posedge clk_9m or negedge rst_n) begin if(!rst_n) begin de_r <= 0; end else if((h_cnt >= H_SYNC+H_BACK_PORCH) && (h_cnt <= H_SYNC+H_BACK_PORCH+H_ACTIVE-1) && (v_cnt >= V_SYNC+V_BACK_PORCH)&&(v_cnt <= V_SYNC+V_BACK_PORCH+V_ACTIVE-1)) begin de_r <= 1; end else begin de_r <= 'd0; end end //------------------------生成DE信号 end //------------------------把控制信号和FIFO读取的数据进行同步 begin reg de_r1,de_r2,de_r3; always @ (posedge clk_9m or negedge rst_n) begin if(!rst_n) begin de_r1 <= 0; de_r2 <= 0; de_r3 <= 0; end else begin de_r1 <= de_r; de_r2 <= de_r1; de_r3 <= de_r2; end end //------------------------把控制信号和FIFO读取的数据进行同步 end //------------------------将同步后的RGB数据按照协议进行映射输出 begin reg [WORD_WIDTH-1:0] lcd_rgb1_d; always @ (posedge clk_9m or negedge rst_n) begin if(!rst_n) begin lcd_rgb1_d <= 0; end else if(!de_r1) lcd_rgb1_d <= 0; else if(de_r1) begin lcd_rgb1_d <= pixel_data; end end //显示彩条红绿蓝 always @(posedge clk_9m or negedge rst_n) begin if(!rst_n) pixel_data <= BLACK; else begin if((v_cnt >= 0) && (v_cnt < RED_CNT)&de_r) pixel_data <= RED; else if ((v_cnt >= RED_CNT) && (v_cnt < GREEN_CNT)&de_r) pixel_data <= GREEN; else pixel_data <= BLUE; end end assign lcd_A_rgb = lcd_rgb1_d;//16'hf0;// assign lcd_A_vs = vsync_r; assign lcd_A_hs = hsync_r; assign lcd_A_de = de_r2; assign lcd_A_clk = ~clk_9m; endmodule |