输入时钟,fpga给出时序和数据。
接到显示屏上显示。
颜色
行列信号
abcde,opqrs都是图中的含义,分别是行列,每行发几个像素,发多少行。
有前后标定用的非图像像素的像素。
@60是显示屏刷新率,显示一个像素点的时间是1/60MHz,越大显示的越快。
时钟是指针对某一个尺寸的图像,总共需要的时间。
计算
`define HSYNC_A 16'd128
`define HSYNC_B 16'd216
`define HSYNC_C 16'd1016
`define HSYNC_D 16'd1056
`define VSYNC_A 16'd4
`define VSYNC_B 16'd27
`define VSYNC_C 16'd627
`define VSYNC_D 16'd628
module Vga_signal(
clk_ ,//40Mhz
rst_n ,
//他信号,举例dout
vsync,
hsync,
vga_data
);
//参数定义
parameter DATA_W = 8;
parameter CNT_W = 16;
//输入信号定义
input clk ;
input rst_n ;
output reg vsync;
output reg hsync;
//输出信号定义
output reg [DATA_W-1:0] vga_data ;
//中间信号定义
reg[CNT_W-1:0] hsync_cnt;//lie num
reg[CNT_W-1:0] vsync_cnt;//hang shu
reg vga_data_en;
//hsync_cnt 800 lie saomiao
always@(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
hsync_cnt<=0;
end
else if(hsync_cnt==`HSYNC_D) begin
hsync_cnt<=0;
end
else begin
hsync_cnt<=hsync_cnt+1;
end
end
//vsync_cnt
always@(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
vsync_cnt<=0;
end
else if(hsync_cnt==`HSYNC_D) begin
if(vsync_cnt==`VSYNC_D) begin
vsync_cnt<=0;
end
else begin
vsync_cnt<=vsync_cnt+1;
end
end
else begin
vsync_cnt<=vsync_cnt;
end
end
//vsync
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
vsync<=0;
end
else if(vsync_cnt<`VSYNC_A ) begin
vsync<=0;
end
else begin
vsync<=1;
end
end
//hsync
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
hsync<=0;
end
else if(hsync_cnt<`HSYNC_A ) begin
hsync<=0;
end
else begin
hsync<=1;
end
end
//vga_data_en
always @(*)begin
if(hsync_cnt>`HSYNC_B&&hsync_cnt<`HSYNC_C&&vsync_cnt>`VSYNC_B&&vsync_cnt<`VSYNC_C)
vga_data_en<=1;
else
vga_data_en<=0;
end
// vga_data 根据范围赋值
always @(*)begin
if(vga_data_en)begin
vga_data<=1;
end
else begin
vga_data<=0;
end
end
endmodule