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 |