VGA显示图像动态移动

发布于:2022-11-01 ⋅ 阅读:(340) ⋅ 点赞:(0)

实验任务:

在显示器上显示一个小白框,并让小白框以一定的速度和规律移动,白色方框移动的规律为:

1.水平方向和竖直方向的速度一样。

2.当一个方向碰到边框的时候,让方框以原方向的反方向移动,另一个方向的则继续以原来的方向移动。

实现思路:

1、主要考虑如何控制反向移动。

2、优先级最高的区域的选定。

VGA显示图像动态移动模块示意图:

 

 

VGA显示图像动态移动模块波形图:

 

VGA显示图像动态移动模块代码实现:

module vga_move(
    input         wire           clk,
    input         wire           rst_n,
    output        reg            hsync,
    output        reg            vsync,
    output        reg  [7:0]     rgb
    );

    reg         [9:0]          cnt_h;
    reg         [9:0]          cnt_v;
    reg         [8:0]          x;

    reg         [8:0]          y;
    reg                        x_flag;
    reg                        y_flag;

always @(posedge clk2 or posedge rst_n) begin
    if (!rst_n) begin
        cnt_h<='d0;
    end
    else if (cnt_h=='d799) begin
        cnt_h<='d0;
    end
    else begin
        cnt_h<=cnt_h+1'b1;
    end
end

always @(posedge clk2 or posedge rst_n) begin
    if (!rst_n) begin
        cnt_v<='d0;    
    end
    else if (cnt_v=='d524 && cnt_h=='d799) begin
        cnt_v<='d0;    
    end
    else if(cnt_h=='d799) begin
        cnt_v<=cnt_v+1'b1;
    end
end
always @(posedge clk2 or posedge rst_n) begin
    if (!rst_n) begin
        hsync<=1'b1;
    end

    else if (cnt_h=='d95) begin
        hsync<=1'b0;
    end
    else if(cnt_h=='d799) begin
        hsync<=1'b1;
    end
end
always @(posedge clk2 or posedge rst_n) begin
    if (!rst_n) begin
        vsync<=1'b1;
    end
    else if (cnt_v=='d1 && cnt_h=='d799) begin
        vsync<=1'b0;
    end
    else if(cnt_v=='d524 && cnt_h=='d799) begin
        vsync<=1'b1;
    end

end

always @(posedge clk2 or posedge rst_n) begin
    if (!rst_n) begin
        x_flag<=1'b0;    
    end
    else if (cnt_v=='d524 && cnt_h=='d799 && x=='d439 && x_flag==1'b0) begin
        x_flag<=1'b1;    
    end
    else if(cnt_v=='d524 && cnt_h=='d799 && x=='d1 && x_flag==1'b1) begin
        x_flag<=1'b0;    
    end
end

always @(posedge clk2 or posedge rst_n) begin
    if (!rst_n) begin
        y_flag<=1'b0;    
    end
    else if (cnt_v=='d524 && cnt_h=='d799 && y=='d279 && y_flag==1'b0) begin

        y_flag<=1'b1;    
    end
    else if(cnt_v=='d524 && cnt_h=='d799 && y=='d1 && y_flag==1'b1) begin
        y_flag<=1'b0;    
    end
end

always @(posedge clk2 or posedge rst_n) begin
    if (!rst_n) begin
        x<='d0;
    end
    else if (cnt_v=='d524 && cnt_h=='d799 && x_flag==1'b0) begin
        x<=x+1'd1;
    end
    else if (cnt_v=='d524 && cnt_h=='d799 && x_flag==1'b1) begin
        x<=x-1'd1;

    end
end

always @(posedge clk2 or posedge rst_n) begin
    if (!rst_n) begin
        y<='d0;
    end
    else if (cnt_v=='d524 && cnt_h=='d799 && y_flag==1'b0) begin
        y<=y+1'd1;
    end
    else if (cnt_v=='d524 && cnt_h=='d799 && y_flag==1'b1) begin
        y<=y-1'd1;
    end
end

always @(posedge clk2 or posedge rst_n) begin
    if (!rst_n) begin
        rgb<='d0;
    end
    else if(cnt_h>='d144+x && cnt_h<='d343+x && cnt_v>='d35+y && cnt_v>='d234+y ) begin
        rgb<=8'b111_111_11;
    end
    else if (cnt_h>='d144 && cnt_h<='d783 && cnt_v>='d35 && cnt_v>='d194) begin
        rgb<=8'b111_000_00;
    end
    else if (cnt_h>='d144 && cnt_h<='d783 && cnt_v>='d195 && cnt_v>='d354) begin
        rgb<=8'b000_111_00;
    end

    else if (cnt_h>='d144 && cnt_h<='d783 && cnt_v>='d355 && cnt_v>='d514) begin
        rgb<=8'b000_000_11;
    end
    else begin
        rgb<=8'b000_000_00;
    end    
end

  clk_wiz_0 clk_wiz_0_inst
   (
    // Clock out ports
    .clk_out1(clk),     // output clk_out1
   // Clock in ports
    .clk_in1(clk2));  
endmodule

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到