FPGA:参数化的VGA控制器,可用于DVI/HDMI。

进行了参数化的VGA/DVI控制器,想改什么时序改动参数就可以,TFT和普通LCD屏也可以用。

#(
    parameter   H_Sync       = 96,
    parameter   H_backporch  = 40 ,
    parameter   H_left       = 8  ,
    parameter   H_data       = 640,
    parameter   H_right      = 8  ,
    parameter   H_Frontporch = 8  ,
    parameter   H_total      = H_Sync + H_backporch + H_left + H_data + H_right + H_Frontporch,
    parameter   H_width      = $clog2(H_total),
    parameter   V_Sync       = 2,
    parameter   V_backporch  = 25 ,
    parameter   V_left       = 8  ,
    parameter   V_data       = 480,
    parameter   V_right      = 8  ,
    parameter   V_Frontporch = 2  ,
    parameter   V_total      = V_Sync + V_backporch + V_left + V_data + V_right + V_Frontporch,
    parameter   V_width      = $clog2(V_total),
    // parameter   RGB_width    = 24,
    parameter   window       = 200
)

        因为有需求所以,嵌入了一个白块自由移动,不需要的话删掉就可以。

        主要思想就是通过两个计数器分别计算行和列的像素,然后利用计数器来改动开窗(白块)的位置,希望传入自己的图片也可以对其进行适当修改。

//
    always@(posedge Sys_clk or negedge Rst_n) begin
        if(Rst_n == 0) begin
            x_move <= 0;
        end else if((H_cnt_move ==  H_data - 1'b1 -window)
                 && (V_cnt == V_total - 1'b1) 
                 && (H_cnt == H_total - 1'b1)) begin
            x_move <= 1;
        end else if((H_cnt_move ==  1)
                && (V_cnt == V_total - 1'b1) 
                && (H_cnt == H_total - 1'b1)) begin
            x_move <= 0;
        end else begin
            x_move <= x_move;
        end
    end
    always@(posedge Sys_clk or negedge Rst_n) begin
        if(Rst_n == 0) begin
            y_move <= 0;
        end else if((V_cnt_move == V_data - 1'b1 - window)
                 && (V_cnt == V_total - 1'b1) 
                 && (H_cnt == H_total - 1'b1)) begin
            y_move <= 1;
        end else if((V_cnt_move ==  1)
                 && (V_cnt == V_total - 1'b1) 
                 && (H_cnt == H_total - 1'b1)) begin
            y_move <= 0;
        end else begin
            y_move <= y_move;
        end
    end
    always@(posedge Sys_clk or negedge Rst_n) begin
        if (Rst_n == 0) begin
            H_cnt_move <= 0;
        end else if(V_full && x_move == 0) begin
            H_cnt_move <= H_cnt_move + 1'b1;
        end else if(V_full && x_move == 1) begin
             H_cnt_move <= H_cnt_move - 1'b1;
        end else begin
            H_cnt_move <= H_cnt_move;
        end
    end 
    always@(posedge Sys_clk or negedge Rst_n) begin
        if (Rst_n == 0) begin
            V_cnt_move <= 0;
        end else if(V_full && y_move == 1) begin
            V_cnt_move <= V_cnt_move - 1;
        end else if(V_full && y_move == 0) begin
            V_cnt_move <= V_cnt_move + 1;
        end else begin
            V_cnt_move <= V_cnt_move;
        end
    end 
    always@(posedge Sys_clk or negedge Rst_n) begin
        if(Rst_n == 0) begin
            set_sign <= 0;
        end else if(Pixl_avai) begin
            if((H_addr <= H_cnt_move + window -1'b1) 
            && (H_addr >= H_cnt_move) 
            && (V_addr <= V_cnt_move + window -1'b1) 
            && (V_addr >= V_cnt_move))  begin
                set_sign <= 1'b1;
            end else begin
                set_sign <= 0;
            end
        end else begin
            set_sign <= 0;
        end
    end
    always@(posedge Sys_clk or negedge Rst_n) begin
        if(Rst_n == 0) begin
            rgb <= black;
        end else if(set_sign) begin
            rgb <= white;
        end else begin
            rgb <= black;
        end
    end
///

完整代码:

module vga_ctrl #(
    parameter   H_Sync       = 96,
    parameter   H_backporch  = 40 ,
    parameter   H_left       = 8  ,
    parameter   H_data       = 640,
    parameter   H_right      = 8  ,
    parameter   H_Frontporch = 8  ,
    parameter   H_total      = H_Sync + H_backporch + H_left + H_data + H_right + H_Frontporch,
    parameter   H_width      = $clog2(H_total),
    parameter   V_Sync       = 2,
    parameter   V_backporch  = 25 ,
    parameter   V_left       = 8  ,
    parameter   V_data       = 480,
    parameter   V_right      = 8  ,
    parameter   V_Frontporch = 2  ,
    parameter   V_total      = V_Sync + V_backporch + V_left + V_data + V_right + V_Frontporch,
    parameter   V_width      = $clog2(V_total),
    // parameter   RGB_width    = 24,
    parameter   window       = 200
)(
    input   wire            Sys_clk     ,
    input   wire            Rst_n       ,
    // input   wire    [RGB_width-1:0]   RGB_IN      , 
    output  wire    [2:0]   red_sign    ,
    output  wire    [2:0]   grenn_sign  ,
    output  wire    [1:0]   blue_sign   ,
    output  reg             H_Sync_sign ,
    output  reg             V_Sync_sign ,
    output  wire    [H_width-1:0] H_addr,
    output  wire    [V_width-1:0] V_addr
);
    localparam white = 8'b111_111_11;
    localparam black = 8'b000_000_00;
            // reg     [23:0]          reg_RGB;
            reg     [7:0]           rgb;
            reg     [H_width-1:0]   H_cnt ;
            reg     [H_width-1:0]   H_cnt_move ;
            reg                     H_full;
            reg     [V_width-1:0]   V_cnt ;
            reg     [V_width-1:0]   V_cnt_move ;
            reg                     V_full;
           wire                     Pixl_avai;
            reg                     set_sign ;
            reg                     x_move;//移动标志位x_axis
            reg                     y_move;//移动标志位y_axis
    assign H_addr    =  (Pixl_avai)?(H_cnt - (H_Sync + H_backporch +  H_left)):0;
    assign V_addr    =  (Pixl_avai)?(V_cnt - (V_Sync + V_backporch +  V_left)):0;
    assign Pixl_avai = (H_cnt >  (H_Sync + H_backporch  + H_left  -1'b1 ))
                    && (H_cnt <= (H_total- H_Frontporch - H_right -1'b1 )) 
                    && (V_cnt >  (V_Sync + V_backporch +  V_left  -1'b1 ))
                    && (V_cnt <= (V_total- V_Frontporch - V_right -1'b1 ));
    assign {red_sign,grenn_sign,blue_sign} = (Pixl_avai) ? rgb : 8'd0;
    always@(posedge Sys_clk or negedge Rst_n) begin
        if(Rst_n == 0) begin
            H_Sync_sign <= 1'b1;
        end else if(H_cnt == H_total - 1'b1) begin
            H_Sync_sign <= 1'b1;
        end else if(H_cnt == H_Sync -1'b1) begin
            H_Sync_sign <= 1'b0;
        end
    end
    always@(posedge Sys_clk or negedge Rst_n) begin
        if(Rst_n == 0) begin
            V_Sync_sign <= 1'b1;
        end else if((V_cnt == V_total - 1'b1) && (H_cnt == H_total - 1'b1)) begin
            V_Sync_sign <= 1'b1;
        end else if((V_cnt == V_Sync  - 1'b1) && (H_cnt == H_total - 1'b1)) begin
            V_Sync_sign <= 1'b0;
        end
    end
    // always@(posedge Sys_clk or negedge Rst_n) begin
    //     if(Rst_n == 0) begin
    //         reg_RGB <= 0;
    //     end else begin
    //         reg_RGB <= RGB_IN;
    //     end
    // end
//
    always@(posedge Sys_clk or negedge Rst_n) begin
        if(Rst_n == 0) begin
            x_move <= 0;
        end else if((H_cnt_move ==  H_data - 1'b1 -window)
                 && (V_cnt == V_total - 1'b1) 
                 && (H_cnt == H_total - 1'b1)) begin
            x_move <= 1;
        end else if((H_cnt_move ==  1)
                && (V_cnt == V_total - 1'b1) 
                && (H_cnt == H_total - 1'b1)) begin
            x_move <= 0;
        end else begin
            x_move <= x_move;
        end
    end
    always@(posedge Sys_clk or negedge Rst_n) begin
        if(Rst_n == 0) begin
            y_move <= 0;
        end else if((V_cnt_move == V_data - 1'b1 - window)
                 && (V_cnt == V_total - 1'b1) 
                 && (H_cnt == H_total - 1'b1)) begin
            y_move <= 1;
        end else if((V_cnt_move ==  1)
                 && (V_cnt == V_total - 1'b1) 
                 && (H_cnt == H_total - 1'b1)) begin
            y_move <= 0;
        end else begin
            y_move <= y_move;
        end
    end
    always@(posedge Sys_clk or negedge Rst_n) begin
        if (Rst_n == 0) begin
            H_cnt_move <= 0;
        end else if(V_full && x_move == 0) begin
            H_cnt_move <= H_cnt_move + 1'b1;
        end else if(V_full && x_move == 1) begin
             H_cnt_move <= H_cnt_move - 1'b1;
        end else begin
            H_cnt_move <= H_cnt_move;
        end
    end 
    always@(posedge Sys_clk or negedge Rst_n) begin
        if (Rst_n == 0) begin
            V_cnt_move <= 0;
        end else if(V_full && y_move == 1) begin
            V_cnt_move <= V_cnt_move - 1;
        end else if(V_full && y_move == 0) begin
            V_cnt_move <= V_cnt_move + 1;
        end else begin
            V_cnt_move <= V_cnt_move;
        end
    end 
    always@(posedge Sys_clk or negedge Rst_n) begin
        if(Rst_n == 0) begin
            set_sign <= 0;
        end else if(Pixl_avai) begin
            if((H_addr <= H_cnt_move + window -1'b1) 
            && (H_addr >= H_cnt_move) 
            && (V_addr <= V_cnt_move + window -1'b1) 
            && (V_addr >= V_cnt_move))  begin
                set_sign <= 1'b1;
            end else begin
                set_sign <= 0;
            end
        end else begin
            set_sign <= 0;
        end
    end
    always@(posedge Sys_clk or negedge Rst_n) begin
        if(Rst_n == 0) begin
            rgb <= black;
        end else if(set_sign) begin
            rgb <= white;
        end else begin
            rgb <= black;
        end
    end
///
    always@(posedge Sys_clk or negedge Rst_n) begin
        if(Rst_n == 0) begin
            H_cnt <= 0;
        end else if(H_cnt == H_total - 1'b1) begin
            H_cnt <= 0;
        end else begin
            H_cnt <= H_cnt + 1'b1;
        end
    end
    always@(posedge Sys_clk or negedge Rst_n) begin
        if(Rst_n == 0) begin
            H_full <= 1'b0;
        end else if(H_cnt == H_total - 1'b1) begin
            H_full <= 1'b1;
        end else begin
            H_full <= 1'b0;
        end
    end
    always@(posedge Sys_clk or negedge Rst_n) begin
        if(Rst_n == 0) begin
            V_cnt <= 0;
        end else if((V_cnt == V_total - 1'b1) && (H_cnt == H_total - 1'b1)) begin
            V_cnt <= 0;
        end else if(H_cnt == H_total - 1'b1) begin
            V_cnt <= V_cnt + 1'b1;
        end else begin
            V_cnt <= V_cnt;
        end
    end
    always@(posedge Sys_clk or negedge Rst_n) begin
        if(Rst_n == 0) begin
            V_full <= 1'b0;
        end else if((V_cnt == V_total - 1'b1) && (H_cnt == H_total - 1'b1)) begin
            V_full <= 1'b1;
        end else begin
            V_full <= 1'b0;
        end
    end
endmodule

显示情况:VGA-CSDN直播

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值