как дублировать объекты, используя координаты X, Y - PullRequest
0 голосов
/ 03 мая 2019

для проекта колледжа нам нужно сделать SPACE INVADERS похожим на игру в verilog с использованием FPGA.В рамках игры нам нужно создать матрицу «монстров», которыми мы управляем, как мы можем это сделать?

У нас есть модуль VGA, который мы отправляем предпочтениям и координатам RGB через модуль Bitmap.Мы хотим создать матрицу путем дублирования одного объекта на несколько объектов, которые перемещаются вместе как один, но мы можем управлять ими по отдельности (можем дать любому из них разный цвет, включить и т. Д.)

Мы добавляем 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 голосов
/ 05 мая 2019

вы не можете описать синтезируемую n*n матрицу.Вам необходимо заполнить данные пикселей в ОЗУ правильной индексацией, которая может быть описана как массив [0: n * n].(например, если у вас есть изображение 5 * 5, вам нужна оперативная память размером 25.

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

, лучше избегать использования модов, потому что это может занять много оборудованияразмер. Я думаю, что этого можно избежать с помощью правильной индексации и некоторых изменений в вашем контроллере.

Я не смог получить никакого аппаратного впечатления от вашего кода. У вас есть какой-нибудь RTL-дизайн на бумаге? Если нетЯ настоятельно рекомендую вам сначала спроектировать схему на бумаге, а затем приступить к ее реализации.

(этот пост должен был быть комментарием, но моя репутация не позволяла мне комментировать ваш вопрос. Я обновлюответ, когда больше информации предоставлено.)

...