如何使用X,Y坐标复制对象

时间:2019-05-03 13:30:19

标签: verilog fpga

对于一个大学项目,我们需要使用FPGA在verilog中制作类似于游戏的SPACE INVADERS。作为游戏的一部分,我们需要创建一个由我们控制的“怪物”矩阵,我们如何做到这一点?

我们有一个VGA模块,它通过Bitmap模块发送RGB首选项和坐标。 我们想通过将一个对象复制到一起移动的多个对象来创建矩阵,但是我们可以分别控制它们(可以为它们中的任何一个提供不同的颜色,启用等...)

我们添加了需要更改的create_matrix模块以显示完整矩阵(我们可以并且可能应该使用div和mod操作,但是我们实际上并不知道如何操作)。现在只显示一个。

module  create_matrix   (   
                    input       logic   clk,
                    input       logic   resetN,
                    input   logic   [10:0] pixelX,// current VGA pixel 
                    input   logic   [10:0] pixelY,
                    input   logic   [10:0] topLeftX, //position on the screen 
                    input   logic   [10:0] topLeftY,

                    input   logic enable,   

                    output  logic   [10:0] offsetX,// offset inside bracket from top left position 
                    output  logic   [10:0] offsetY,
                    output  logic   drawingRequest, // indicates pixel inside the bracket
                    output  logic   [7:0]    RGBout //optional color output for mux 
);

parameter  int OBJECT_WIDTH_X=100;
parameter  int OBJECT_HEIGHT_Y=100;
parameter  logic [7:0] OBJECT_COLOR=8'b11111111; 

localparam logic [7:0] TRANSPARENT_ENCODING = 8'hFF ;// bitmap  representation for a transparent pixel 

int rightX ; //coordinates of the sides  
int bottomY ;
logic insideBracket ; 

// Calculate object right  & bottom  boundaries
assign rightX   = (topLeftX + OBJECT_WIDTH_X);
assign bottomY  = (topLeftY + OBJECT_HEIGHT_Y);


always_ff@(posedge clk or negedge resetN)
begin
    if(!resetN) begin
        RGBout          <=  8'b0;
        drawingRequest  <=  1'b0;
    end
    else begin 

    insideBracket  =     ( (pixelX  >= topLeftX) &&  (pixelX < rightX)  
                           && (pixelY  >= topLeftY) &&  (pixelY < bottomY) )  ; 

        if (insideBracket && enable==1'b1) // test if it is inside the rectangle 
        begin 
            RGBout  <= OBJECT_COLOR ;   // colors table 
            drawingRequest <= 1'b1 ;
            offsetX <= (pixelX - topLeftX); //calculate relative offsets from top left corner
            offsetY <= (pixelY - topLeftY);
        end 

        else begin  
            RGBout <= TRANSPARENT_ENCODING ; // so it will not be displayed 
            drawingRequest <= 1'b0 ;// transparent color 
            offsetX <= 0; //no offset
            offsetY <= 0; //no offset
        end 

    end
end 
endmodule 

非常感谢您对我们的帮助

1 个答案:

答案 0 :(得分:0)

您无法描述可合成的n*n矩阵。您需要使用正确的索引填充RAM中的像素数据,该索引可以描述为[0:n * n]数组。 (例如,如果您有5 * 5的图片,则需要一个大小为25的RAM。

reg [word_size : 0] RAM [0:25];

最好避免使用mod操作,因为它可能会占用很多硬件大小。我认为可以通过正确的索引编制和控制器状态机的一些更改来避免这种情况。

我无法从您的代码中获得任何硬件印象。您在纸上有RTL设计吗?如果不是,我绝对鼓励您先在纸上设计电路,然后再开始实施。

(这篇文章原本应该是评论,但我的声誉不允许我对您的问题发表评论。当提供更多信息时,我将更新答案。)