1.原理图,VGA原理不同的显示要求有不同的显示协议,对于640*480@60HZ,时钟的频率需要达到25MHZ。
2.xilinx的spartan-6时钟为50MHZ可以利用之前的IP核调用分频器,也可以自己写一个模块。
module rgb_ctrl(
input wire rst_n,
input wire sclk, //时钟是25M
output reg h_sync,
output reg v_sync,
output reg [7:0] rgb_data
);
reg [9:0] h_cnt;
reg [9:0] v_cnt;
parameter H_max=799;
parameter V_max=524;
always@(posedge sclk or negedge rst_n)
if(!rst_n)
h_cnt<=10'd0;
else if(h_cnt==10'd799)
h_cnt<=10'd0;
else h_cnt<=h_cnt+1'b1;
always@(posedge sclk or negedge rst_n)
if(!rst_n)
v_cnt<=10'd0;
else if(v_cnt==10'd524&&h_cnt==10'd799)
v_cnt<=10'd0;
else if(h_cnt==10'd799)
v_cnt<=v_cnt+1'b1;
always@(posedge sclk or negedge rst_n)
if(!rst_n)
h_sync<=1'b0;
else if(h_cnt==96)
h_sync<=1'b0;
else if(h_cnt==0)
h_sync<=1'b1;
always@(posedge sclk or negedge rst_n)
if(!rst_n)
v_sync<=1'b0;
else if(v_cnt==10'd1&&h_cnt==10'd799)
v_sync<=1'b0;
else if(v_cnt==10'd524&&h_cnt==10'd799)
v_sync<=1'b1;
always@(posedge sclk or negedge rst_n)
if(!rst_n)
rgb_data<=8'd0;//
else if(34<=v_cnt&&v_cnt<=524&&143<=h_cnt&&h_cnt<=783)
rgb_data<=8'b1110_0000;
else
rgb_data<=8'd0;
endmodule
//实现三基色全显示always@(posedge sclk or negedge rst_n)
// if(!rst_n)
// rgb_data<=8'd0;//
// else if(34<=v_cnt&&v_cnt<=209&&143<=h_cnt&&h_cnt<=783)
// rgb_data<=8'b1110_0000;
// else if(209<=v_cnt&&v_cnt<=384&&143<=h_cnt&&h_cnt<=783)
// rgb_data<=8'b0001_1100;
// else if(384<=v_cnt&&v_cnt<=524&&143<=h_cnt&&h_cnt<=783)
// rgb_data<=8'b0000_0011;
// else
// rgb_data<=8'd0;
3.至于想显示那种颜色,只需要修改rgb_data的数据就可以。
4.仿真图就不P了,但是h_sync和v_sync信号的拉高条件希望自己可以理解透。