VGA控制器(FPGA)

module VGA_top//--------------------------------顶层
(
    input refclk,
    input rst_n,
    output vs,
    output hs,
    output [4:0]r,
    output [5:0]g,
    output [4:0]b
);
pll    
pll_inst 
(
    .areset ( ~rst_n ),
    .inclk0 ( refclk ),
    .c0 ( clk ),
    .locked ( rst )
);
wire [9:0]cont_v;
vga
vga_inst
(
    .clk(clk),
    .rst(rst),
    .en(en),
    .vga_vs(vs),
    .vga_hs(hs),
    .cont_v(cont_v)
);

rgb
rgb_inst
(
    .clk(clk),
    .rst(rst),
    .en(en),
    .cont_v(cont_v),
    //.uart_s(out_uart),
    .r(r),
    .g(g),
    .b(b)
);
    
endmodule

//------------------------------------时序

module vga
(
    input clk,
    input rst,
    output en,
    output vga_vs,
    output vga_hs,
    output [9:0]cont_v
);

reg [10:0]cont_hs;
always@(posedge clk or negedge rst)
begin
    if(~rst)
        cont_hs<=11'd0;
    else if(cont_hs==11'd1055)
        cont_hs<=11'd0;
    else
        cont_hs<=cont_hs+1'b1;
end
reg [9:0]cont_vs;
always@(posedge clk or negedge rst)
begin
    if(~rst)
        cont_vs<=10'd0;
    else if(cont_hs==11'd1055)
    begin
        if(cont_vs==10'd627)
            cont_vs<=10'd0;
        else
            cont_vs<=cont_vs+1'b1;
    end
end
assign cont_v=cont_vs;
reg vga_vs1;//行同步
always@(posedge clk or negedge rst)
begin
    if(~rst)
        vga_vs1<=1'b0;
    else if(cont_vs==10'd0)
        vga_vs1<=1'b1;
    else if(cont_vs==10'd3)
        vga_vs1<=1'b0;
end
assign vga_vs=vga_vs1;
reg vga_hs1;//列同步
always@(posedge clk or negedge rst)
begin
    if(~rst)
        vga_hs1<=1'b0;
    else if(cont_hs==11'd0)
        vga_hs1=1'b1;
    else if(cont_hs==11'd128)
        vga_hs1<=1'b0;
end
assign vga_hs=vga_hs1;
//--------------------------------
reg en_vs;
always@(posedge clk or negedge rst)
begin
    if(~rst)
        en_vs<=1'b0;
    else if(cont_vs==10'd26)
        en_vs<=1'b1;
    else if(cont_vs==10'd626)
        en_vs<=1'b0;
end
reg en_hs;
always@(posedge clk or negedge rst)
begin
    if(~rst)
        en_hs<=1'b0;
    else if(cont_hs==11'd215)
        en_hs<=1'b1;
    else if(cont_hs==11'd1015)
        en_hs<=1'b0;
end
reg en1;//有效信号
always@(posedge clk or negedge rst)
begin
    if(~rst)
        en1<=1'b0;
    else if((en_vs==1'b1)&&(en_hs==1'b1))
        en1<=1'b1;
    else 
        en1<=1'b0;
end
assign en=en1;
endmodule
//-----------------------------------显示

module VGA_top
(
    input refclk,
    input rst_n,
    output vs,
    output hs,
    output [4:0]r,
    output [5:0]g,
    output [4:0]b
);
pll    
pll_inst 
(
    .areset ( ~rst_n ),
    .inclk0 ( refclk ),
    .c0 ( clk ),
    .locked ( rst )
);
wire [9:0]cont_v;
vga
vga_inst
(
    .clk(clk),
    .rst(rst),
    .en(en),
    .vga_vs(vs),
    .vga_hs(hs),
    .cont_v(cont_v)
);

rgb
rgb_inst
(
    .clk(clk),
    .rst(rst),
    .en(en),
    .cont_v(cont_v),
    .r(r),
    .g(g),
    .b(b)
);
    
endmodule

//-----------------------------测试

`timescale 1ns/1ns
module VGA_top_tb();

reg clk;
reg  rst_n;

initial
begin
rst_n=0;
#800 rst_n=1;
#100000000 $stop;
end


initial
begin
clk=0;
end 

always #20 clk<=~clk;

wire [4:0]r,b;
wire [5:0]g;
VGA_top
VGA_top_inst
(
    .refclk(clk),
    .rst_n(rst_n),
    .vs(vs),
    .hs(hs),
    .r(r),
    .g(g),
    .b(b)
);
endmodule


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yang_wei_bk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值