对于一个大学项目,我们需要使用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
非常感谢您对我们的帮助
答案 0 :(得分:0)
您无法描述可合成的n*n
矩阵。您需要使用正确的索引填充RAM中的像素数据,该索引可以描述为[0:n * n]数组。 (例如,如果您有5 * 5的图片,则需要一个大小为25的RAM。
reg [word_size : 0] RAM [0:25];
最好避免使用mod操作,因为它可能会占用很多硬件大小。我认为可以通过正确的索引编制和控制器状态机的一些更改来避免这种情况。
我无法从您的代码中获得任何硬件印象。您在纸上有RTL设计吗?如果不是,我绝对鼓励您先在纸上设计电路,然后再开始实施。
(这篇文章原本应该是评论,但我的声誉不允许我对您的问题发表评论。当提供更多信息时,我将更新答案。)