Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- `timescale 1ns / 1ps
- //////////////////////////////////////////////////////////////////////////////////
- // Company:
- // Engineer:
- //
- // Create Date: 29.03.2018 17:54:42
- // Design Name:
- // Module Name: DisplayEnemies
- // Project Name:
- // Target Devices:
- // Tool Versions:
- // Description:
- //
- // Dependencies:
- //
- // Revision:
- // Revision 0.01 - File Created
- // Additional Comments:
- //
- //////////////////////////////////////////////////////////////////////////////////
- `include "maindefs.vh"
- `include "states.vh"
- module DisplayEnemies#(
- parameter ECOUNT = 128
- )(
- input wire pclk,
- input wire[ECOUNT*`ENEMY_MEMORY_BITS-1:0] enemies,
- input wire`VGA vga_in,
- input wire [11:0] rgb_in,
- output reg`VGA vga_out,
- output reg`ENEM_ROM_BUS enemy_rom_bus_out
- );
- localparam ENEMY_WIDTH = 31;
- localparam ENEMY_HEIGHT = 31;
- reg`VGA vga_buf;
- integer i;
- reg[`ENEMY_MEMORY_BITS-1:0] currentEnemyData;
- reg`PX_COORD x_buf,y_buf;
- wire[`ENEMY_MEMORY_BITS-1:0] mappedEnemies[ECOUNT-1:0];
- generate//mapowanie wrogow na tablice 2d, dzieki temu do kazdego jest dostep po indeksie
- genvar m;
- for(m=0;m<ECOUNT;m=m+1) begin
- assign mappedEnemies[m] = enemies[`ENEMY_MEMORY_BITS*(m+1)-1:`ENEMY_MEMORY_BITS*m];
- end
- endgenerate
- always@(posedge pclk) begin
- vga_buf <= vga_in;
- //wyswietlenie ramki kontrolnej na brzegach
- if ((vga_buf[37:27] == 0) || (vga_buf[37:27]==799) || (vga_buf[26:16]==0) || (vga_buf[26:16]==599))
- vga_out <= {vga_buf[37:16],12'b111100000000,vga_buf[3:0]};
- else if(rgb_in == 0) //osbluga bezbarwnego piksela
- vga_out <= vga_buf;
- else //wyswietlenie piksela z romu wrogow
- vga_out <= {vga_buf[37:16],rgb_in,vga_buf[3:0]};
- end
- always @* begin
- //wyzwrowanie danych wroga (dzieki temu vivado nie stwozy zatrzasku)
- currentEnemyData = 0;
- for(i=0;i<ECOUNT;i=i+1) begin
- //przesuniecie koordynatow wroga ze srodka na lewy gorny rog
- x_buf = mappedEnemies[i]`ENEMY_POSX - (ENEMY_WIDTH-1)/2;
- y_buf = mappedEnemies[i]`ENEMY_POSY - (ENEMY_HEIGHT-1)/2;
- //porownanie pozycji lewego gornego rogu z aktuanlym pikselem
- x_buf = vga_in[37:27] - x_buf;
- y_buf = vga_in[26:16] - y_buf;
- if(x_buf < ENEMY_WIDTH && y_buf < ENEMY_HEIGHT && mappedEnemies[i]`ENEMY_TYPE != `EN_DEAD)
- currentEnemyData = mappedEnemies[i];
- end
- //wyslanie do romu wrogow bezbarwnego piksela
- if(vga_in[0] || vga_in[1] || currentEnemyData`ENEMY_TYPE == 0)
- enemy_rom_bus_out = 16'b0;
- else begin
- //wyznaczenie koordynatow do odczytu z romu
- x_buf = vga_in[37:27]+(ENEMY_WIDTH-1)/2 - currentEnemyData[`ENEMY_POSX_MSB:`ENEMY_POSX_LSB];
- y_buf = vga_in[26:16]+(ENEMY_HEIGHT-1)/2 - currentEnemyData[`ENEMY_POSY_MSB:`ENEMY_POSY_LSB];
- //wyslanie do romu koordynatow, bit aktywujacy, typ i zwrot grafiki
- enemy_rom_bus_out = {y_buf[4:0], x_buf[4:0], 1'b1, currentEnemyData`ENEMY_TYPE, currentEnemyData`ENEMY_FACING};
- end
- end
- endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement