FPGA 26 RGB888 简单屏幕显示(demo)测试
主要功能 :设计了disp_ctrl_module 的显示测试模块
实现(设计)流程:根据RGB888 屏幕的工作原理以及数据传输协议方式,编写输出信号的发送,进而将我们要显示的图像显示到屏幕上。
实验目的 : 结合上个小节设计的rgb888 驱动模块,通过该模块输出的rgb888 的X ,Y 坐标,作为输入给本次的数据结果,然后再输出坐标即可。(本次在内部使用的组合逻辑,并没有用到时序逻辑,可以根据实际的情况,设计时序逻辑也是可以的)
实验现象 : 通过内部设计一个屏幕驱动显示模块,实现屏幕2*4=8 区域颜色显示的效果
整体设计过程如下所示:(由实验目的分析下面该图即可)
注: 下面的文件,包括了所有的顶层文件和逻辑文件,实际上,最好的方式是将 disp_ctrl_module 给独立出来,便于在其他环境下的一个使用,顶层文件一般来说,只有连线,而不应该存在的代码编译的部分,虽然可以用,但是这是不规范的.
module TFT_CTRL_test(
Clk, //50MHZ时钟
Rst_n,
TFT_RGB,//TFT数据输出
TFT_HS, //TFT行同步信号
TFT_VS, //TFT场同步信号
TFT_CLK,
TFT_DE,
TFT_PWM
);
input Clk;
input Rst_n;
output [15:0]TFT_RGB;
output TFT_HS;
output TFT_VS;
output TFT_CLK;
output TFT_DE;
output TFT_PWM;
reg [15:0]disp_data;
wire [9:0]hcount;
wire [9:0]vcount;
wire Clk33M;
TFT_pll TFT_pll_01 (
.inclk0(Clk),
.c0(Clk33M)
);
TFT_LCD TFT_LCD_01
(
.Clk33M(Clk33M),
.Rst_n(Rst_n),
.Data_in(disp_data),
.vcount(vcount),
.hcount(hcount),
.TFT_RGB(TFT_RGB),
.TFT_VS(TFT_VS),
.TFT_HS(TFT_HS),
.TFT_CLK(TFT_CLK),
.TFT_DE(TFT_DE),
.TFT_PWM(TFT_PWM)
);
//定义颜色编码
localparam
//BLACK = 16'h0000, //黑色
BLACK = 16'h4000, //棕色
BLUE = 16'h001F, //蓝色
RED = 16'hF800, //红色
PURPPLE = 16'hF81F, //紫色
GREEN = 16'h07E0, //绿色
CYAN = 16'h07FF, //青色
YELLOW = 16'hFFE0, //黄色
WHITE = 16'hFFFF; //白色
//定义每个像素块的默认显示颜色值
localparam
R0_C0 = BLACK, //第0行0列像素块
R0_C1 = BLUE, //第0行1列像素块
R1_C0 = RED, //第1行0列像素块
R1_C1 = PURPPLE,//第1行1列像素块
R2_C0 = GREEN, //第2行0列像素块
R2_C1 = CYAN, //第2行1列像素块
R3_C0 = YELLOW, //第3行0列像素块
R3_C1 = WHITE; //第3行1列像素块
wire R0_act = vcount >= 0 && vcount < 120; //正在扫描第0行
wire R1_act = vcount >= 120 && vcount < 240;//正在扫描第1行
wire R2_act = vcount >= 240 && vcount < 360;//正在扫描第2行
wire R3_act = vcount >= 360 && vcount < 480;//正在扫描第3行
wire C0_act = hcount >= 0 && hcount < 400; //正在扫描第0列
wire C1_act = hcount >= 400 && hcount < 800;//正在扫描第1列
wire R0_C0_act = R0_act & C0_act; //第0行0列像素块处于被扫描中标志信号
wire R0_C1_act = R0_act & C1_act; //第0行1列像素块处于被扫描中标志信号
wire R1_C0_act = R1_act & C0_act; //第1行0列像素块处于被扫描中标志信号
wire R1_C1_act = R1_act & C1_act; //第1行1列像素块处于被扫描中标志信号
wire R2_C0_act = R2_act & C0_act; //第2行0列像素块处于被扫描中标志信号
wire R2_C1_act = R2_act & C1_act; //第2行1列像素块处于被扫描中标志信号
wire R3_C0_act = R3_act & C0_act; //第3行0列像素块处于被扫描中标志信号
wire R3_C1_act = R3_act & C1_act; //第3行1列像素块处于被扫描中标志信号
always@(*)
case({R3_C1_act,R3_C0_act,R2_C1_act,R2_C0_act,
R1_C1_act,R1_C0_act,R0_C1_act,R0_C0_act})
8'b0000_0001:disp_data = R0_C0;
8'b0000_0010:disp_data = R0_C1;
8'b0000_0100:disp_data = R1_C0;
8'b0000_1000:disp_data = R1_C1;
8'b0001_0000:disp_data = R2_C0;
8'b0010_0000:disp_data = R2_C1;
8'b0100_0000:disp_data = R3_C0;
8'b1000_0000:disp_data = R3_C1;
default:disp_data = R0_C0;
endcase
endmodule