Advertisement
Guest User

Untitled

a guest
Apr 16th, 2018
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. `timescale 1ns / 1ps
  2. //////////////////////////////////////////////////////////////////////////////////
  3. // Company:
  4. // Engineer:
  5. //
  6. // Create Date: 29.03.2018 17:54:42
  7. // Design Name:
  8. // Module Name: DisplayEnemies
  9. // Project Name:
  10. // Target Devices:
  11. // Tool Versions:
  12. // Description:
  13. //
  14. // Dependencies:
  15. //
  16. // Revision:
  17. // Revision 0.01 - File Created
  18. // Additional Comments:
  19. //
  20. //////////////////////////////////////////////////////////////////////////////////
  21.  
  22.  
  23. `include "maindefs.vh"
  24. `include "states.vh"
  25.  
  26. module DisplayEnemies#(
  27.         parameter ECOUNT = 128
  28.     )(
  29.         input wire pclk,
  30.         input wire[ECOUNT*`ENEMY_MEMORY_BITS-1:0] enemies,
  31.         input wire`VGA vga_in,
  32.         input wire [11:0] rgb_in,
  33.         output reg`VGA vga_out,
  34.         output reg`ENEM_ROM_BUS enemy_rom_bus_out
  35.     );
  36.    
  37.     localparam ENEMY_WIDTH = 31;
  38.     localparam ENEMY_HEIGHT = 31;
  39.     reg`VGA vga_buf;
  40.     integer i;
  41.     reg[`ENEMY_MEMORY_BITS-1:0] currentEnemyData;
  42.     reg`PX_COORD x_buf,y_buf;
  43.    
  44.     wire[`ENEMY_MEMORY_BITS-1:0] mappedEnemies[ECOUNT-1:0];
  45.     generate//mapowanie wrogow na tablice 2d, dzieki temu do kazdego jest dostep po indeksie
  46.         genvar m;
  47.         for(m=0;m<ECOUNT;m=m+1) begin
  48.             assign mappedEnemies[m] = enemies[`ENEMY_MEMORY_BITS*(m+1)-1:`ENEMY_MEMORY_BITS*m];
  49.         end
  50.     endgenerate
  51.    
  52.    
  53.     always@(posedge pclk) begin
  54.         vga_buf <= vga_in;
  55.         //wyswietlenie ramki kontrolnej na brzegach
  56.         if ((vga_buf[37:27] == 0) || (vga_buf[37:27]==799) || (vga_buf[26:16]==0) || (vga_buf[26:16]==599))
  57.             vga_out <= {vga_buf[37:16],12'b111100000000,vga_buf[3:0]};
  58.         else if(rgb_in == 0) //osbluga bezbarwnego piksela
  59.             vga_out <= vga_buf;
  60.         else //wyswietlenie piksela z romu wrogow
  61.             vga_out <= {vga_buf[37:16],rgb_in,vga_buf[3:0]};
  62.     end
  63.    
  64.     always @* begin
  65.         //wyzwrowanie danych wroga (dzieki temu vivado nie stwozy zatrzasku)
  66.         currentEnemyData = 0;
  67.         for(i=0;i<ECOUNT;i=i+1) begin
  68.             //przesuniecie koordynatow wroga ze srodka na lewy gorny rog
  69.             x_buf = mappedEnemies[i]`ENEMY_POSX - (ENEMY_WIDTH-1)/2;
  70.             y_buf = mappedEnemies[i]`ENEMY_POSY - (ENEMY_HEIGHT-1)/2;
  71.             //porownanie pozycji lewego gornego rogu z aktuanlym pikselem
  72.             x_buf = vga_in[37:27] - x_buf;
  73.             y_buf = vga_in[26:16] - y_buf;
  74.             if(x_buf < ENEMY_WIDTH && y_buf < ENEMY_HEIGHT && mappedEnemies[i]`ENEMY_TYPE != `EN_DEAD)
  75.                 currentEnemyData = mappedEnemies[i];
  76.         end
  77.        
  78.         //wyslanie do romu wrogow bezbarwnego piksela
  79.         if(vga_in[0] || vga_in[1] || currentEnemyData`ENEMY_TYPE == 0)
  80.             enemy_rom_bus_out = 16'b0;
  81.         else begin
  82.             //wyznaczenie koordynatow do odczytu z romu
  83.             x_buf = vga_in[37:27]+(ENEMY_WIDTH-1)/2 - currentEnemyData[`ENEMY_POSX_MSB:`ENEMY_POSX_LSB];
  84.             y_buf = vga_in[26:16]+(ENEMY_HEIGHT-1)/2 - currentEnemyData[`ENEMY_POSY_MSB:`ENEMY_POSY_LSB];
  85.             //wyslanie do romu koordynatow, bit aktywujacy, typ i zwrot grafiki
  86.             enemy_rom_bus_out = {y_buf[4:0], x_buf[4:0], 1'b1, currentEnemyData`ENEMY_TYPE, currentEnemyData`ENEMY_FACING};
  87.         end
  88.     end
  89. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement