Advertisement
Guest User

Untitled

a guest
Mar 25th, 2019
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 15.58 KB | None | 0 0
  1. module Brick_Escape
  2. (
  3. CLOCK_50, // On Board 50 MHz
  4. // Your inputs and outputs here
  5. KEY,
  6. SW,
  7. // The ports below are for the VGA output. Do not change.
  8. VGA_CLK, // VGA Clock
  9. VGA_HS, // VGA H_SYNC
  10. VGA_VS, // VGA V_SYNC
  11. VGA_BLANK_N, // VGA BLANK
  12. VGA_SYNC_N, // VGA SYNC
  13. VGA_R, // VGA Red[9:0]
  14. VGA_G, // VGA Green[9:0]
  15. VGA_B // VGA Blue[9:0]
  16. );
  17.  
  18. input CLOCK_50; // 50 MHz
  19. input [9:0] SW;
  20. input [3:0] KEY;
  21.  
  22. // Declare your inputs and outputs here
  23. // Do not change the following outputs
  24. output VGA_CLK; // VGA Clock
  25. output VGA_HS; // VGA H_SYNC
  26. output VGA_VS; // VGA V_SYNC
  27. output VGA_BLANK_N; // VGA BLANK
  28. output VGA_SYNC_N; // VGA SYNC
  29. output [9:0] VGA_R; // VGA Red[9:0]
  30. output [9:0] VGA_G; // VGA Green[9:0]
  31. output [9:0] VGA_B; // VGA Blue[9:0]
  32.  
  33. wire resetn;
  34. assign resetn = ~SW[0];
  35.  
  36. // Create the colour, x, y and writeEn wires that are inputs to the controller.
  37. wire [2:0] colour;
  38. wire [6:0] x;
  39. wire [6:0] y;
  40.  
  41. // writeEn will always be high
  42. wire writeEn = 1'b1;
  43.  
  44. // Create an Instance of a VGA controller - there can be only one!
  45. // Define the number of colours as well as the initial background
  46. // image file (.MIF) for the controller.
  47. vga_adapter VGA(
  48. .resetn(resetn),
  49. .clock(CLOCK_50),
  50. .colour(colour),
  51. .x(x),
  52. .y(y),
  53. .plot(writeEn),
  54. /* Signals for the DAC to drive the monitor. */
  55. .VGA_R(VGA_R),
  56. .VGA_G(VGA_G),
  57. .VGA_B(VGA_B),
  58. .VGA_HS(VGA_HS),
  59. .VGA_VS(VGA_VS),
  60. .VGA_BLANK(VGA_BLANK_N),
  61. .VGA_SYNC(VGA_SYNC_N),
  62. .VGA_CLK(VGA_CLK));
  63. defparam VGA.RESOLUTION = "160x120";
  64. defparam VGA.MONOCHROME = "FALSE";
  65. defparam VGA.BITS_PER_COLOUR_CHANNEL = 1;
  66. defparam VGA.BACKGROUND_IMAGE = "black.mif";
  67.  
  68. // RATE DIVIDER TO SLOW DOWN THE UPDATE PROCESS FOR PLAYER AND ENEMIES
  69. wire update; // Will be used to update position of player and enemies
  70. rateDivider ratedivider(CLOCK_50, update);
  71.  
  72.  
  73. // PLAYER PROPERTIES /////////////////////////////////////////////////////////////////
  74. wire [6:0] playerx; // x position of the player
  75. wire [6:0] playery; // y position of the player
  76. wire collided;
  77.  
  78. Player player(CLOCK_50, update, resetn, playerx, playery, KEY, collided);
  79.  
  80.  
  81. // ENEMIES PROPERTIES ////////////////////////////////////////////////////////////////
  82. wire [6:0] enemyx;
  83. wire [6:0] enemyy;
  84. wire [6:0] collisionx;
  85. wire [6:0] collisiony;
  86. wire [3:0] enemyIterator;
  87. wire [3:0] collisionIterator;
  88.  
  89. EnemyController enemies(CLOCK_50, update, resetn, enemyx, enemyy, collisionx, collisiony, enemyIterator, collisionIterator);
  90.  
  91. // COLLISION /////////////////////////////////////////////////////////////////////
  92. Collision collision(CLOCK_50, playerx, playery, collisionx, collisiony, collided, collisionIterator);
  93.  
  94. // CONTROL AND DATAPATH PROPERTIES ///////////////////////////////////
  95. wire go_next, print_path, update_player, update_enemy, wait_screen; // ENABLE SIGNALS
  96.  
  97. Controller controller(CLOCK_50, resetn, go_next, print_path, update_player, update_enemy, wait_screen);
  98.  
  99. Datapath datapath(CLOCK_50, resetn, go_next, print_path, update_player, update_enemy, wait_screen, playerx, playery, enemyx, enemyy, enemyIterator, x, y, colour);
  100.  
  101. endmodule
  102.  
  103. module Collision(clk, playerx, playery, enemyx, enemyy, collided, collisionIterator);
  104. input clk;
  105. input [6:0] playerx;
  106. input [6:0] playery;
  107. input [6:0] enemyx;
  108. input [6:0] enemyy;
  109. output reg collided;
  110. output reg [3:0] collisionIterator;
  111.  
  112. always @(posedge clk)
  113. begin
  114. // if((playerx == enemyx) && (playery == enemyy) ||
  115. // !((7'd20 < playerx && playerx < 7'd30) && (7'd0 < playery && playery < 7'd50)) ||
  116. // !((7'd20 < playerx && playerx < 7'd50) && (7'd50 < playery && playery < 7'd60)) ||
  117. // !((7'd50 < playerx && playerx < 7'd60) && (7'd10 < playery && playery < 7'd60)) ||
  118. // !((7'd60 < playerx && playerx < 7'd65) && (7'd10 < playery && playery < 7'd20)) ||
  119. // !((7'd65 < playerx && playerx < 7'd75) && (7'd10 < playery && playery < 7'd100)) ||
  120. // !((7'd75 < playerx && playerx < 7'd95) && (7'd90 < playery && playery < 7'd100)) ||
  121. // !((7'd95 < playerx && playerx < 7'd105) && (7'd35 < playery && playery < 7'd100)) ||
  122. // !((7'd105 < playerx && playerx < 7'd127) && (7'd35 < playery && playery < 7'd45)))
  123. collisionIterator = collisionIterator + 1'd1;
  124. if(collisionIterator > 4'd10)
  125. begin
  126. collisionIterator = 1'd0;
  127. end
  128. else
  129. begin
  130. if((playerx == enemyx) && (playery == enemyy))
  131. begin
  132. collided = 1'd1;
  133. end
  134. else
  135. begin
  136. collided = 1'd0;
  137. end
  138. end
  139. end
  140. endmodule
  141.  
  142. module Datapath(clk, resetn, go_next, print_path, update_player, update_enemy, wait_screen, playerx, playery, enemyx, enemyy, enemyIterator, x, y, colour);
  143. input clk;
  144. input resetn;
  145. input print_path;
  146. input update_player;
  147. input update_enemy;
  148. input wait_screen;
  149. input [6:0] playerx;
  150. input [6:0] playery;
  151. input [6:0] enemyx;
  152. input [6:0] enemyy;
  153. parameter NUMOFENEMIES = 10;
  154. reg [30:0] wait_screen_counter;
  155. reg [6:0] screen_x;
  156. reg [6:0] clear_screen_y;
  157. output reg [3:0] enemyIterator;
  158. output reg go_next;
  159. output reg [6:0] x;
  160. output reg [6:0] y;
  161. output reg [2:0] colour;
  162.  
  163. // REGs for path datapath
  164. reg path1;
  165. reg path2;
  166. reg path3;
  167. reg path4;
  168. reg path5;
  169. reg path6;
  170. reg path7;
  171. reg path8;
  172. reg get_new_path;
  173. reg [6:0] pathx_beg;
  174. reg [6:0] pathy_beg;
  175. reg [6:0] pathx_end;
  176. reg [6:0] pathy_end;
  177.  
  178. initial begin
  179. get_new_path = 1'd1;
  180. end
  181.  
  182. always@(posedge clk)
  183. begin
  184. if(~resetn) // Basic reset functionality
  185. begin
  186. go_next = 1'd0;
  187. x = 1'd0;
  188. y = 1'd0;
  189. colour = 3'b000;
  190. end
  191. else
  192. begin
  193. if(print_path)
  194. begin
  195. go_next = 1'd0;
  196. colour = 3'b111;
  197. if(!path1 && get_new_path == 1'd1)
  198. begin
  199. pathx_beg = 7'd20;
  200. pathy_beg = 7'd0;
  201. x = pathx_beg;
  202. y = pathy_beg;
  203. pathx_end = 7'd30;
  204. pathy_end = 7'd50;
  205. get_new_path = 1'd0;
  206. end
  207. if(!path2 && get_new_path == 1'd1)
  208. begin
  209. pathx_beg = 7'd20;
  210. pathy_beg = 7'd50;
  211. x = pathx_beg;
  212. y = pathy_beg;
  213. pathx_end = 7'd50;
  214. pathy_end = 7'd60;
  215. get_new_path = 1'd0;
  216. end
  217. if(!path3 && get_new_path == 1'd1)
  218. begin
  219. pathx_beg = 7'd50;
  220. pathy_beg = 7'd10;
  221. x = pathx_beg;
  222. y = pathy_beg;
  223. pathx_end = 7'd60;
  224. pathy_end = 7'd60;
  225. get_new_path = 1'd0;
  226. end
  227. if(!path4 && get_new_path == 1'd1)
  228. begin
  229. pathx_beg = 7'd60;
  230. pathy_beg = 7'd10;
  231. x = pathx_beg;
  232. y = pathy_beg;
  233. pathx_end = 7'd65;
  234. pathy_end = 7'd20;
  235. get_new_path = 1'd0;
  236. end
  237. if(!path5 && get_new_path == 1'd1)
  238. begin
  239. pathx_beg = 7'd65;
  240. pathy_beg = 7'd10;
  241. x = pathx_beg;
  242. y = pathy_beg;
  243. pathx_end = 7'd75;
  244. pathy_end = 7'd100;
  245. get_new_path = 1'd0;
  246. end
  247. if(!path6 && get_new_path == 1'd1)
  248. begin
  249. pathx_beg = 7'd75;
  250. pathy_beg = 7'd90;
  251. x = pathx_beg;
  252. y = pathy_beg;
  253. pathx_end = 7'd95;
  254. pathy_end = 7'd100;
  255. get_new_path = 1'd0;
  256. end
  257. if(!path7 && get_new_path == 1'd1)
  258. begin
  259. pathx_beg = 7'd95;
  260. pathy_beg = 7'd35;
  261. x = pathx_beg;
  262. y = pathy_beg;
  263. pathx_end = 7'd105;
  264. pathy_end = 7'd100;
  265. get_new_path = 1'd0;
  266. end
  267. if(!path8 && get_new_path == 1'd1)
  268. begin
  269. pathx_beg = 7'd105;
  270. pathy_beg = 7'd35;
  271. x = pathx_beg;
  272. y = pathy_beg;
  273. pathx_end = 7'd126;
  274. pathy_end = 7'd45;
  275. get_new_path = 1'd0;
  276. end
  277. if(x > pathx_end)
  278. begin
  279. x = pathx_beg;
  280. y = y + 1'd1;
  281. end
  282. else if(x == pathx_end && y == pathy_end)
  283. begin
  284. get_new_path = 1'd1;
  285. if(!path1)
  286. path1 <= 1'd1;
  287. else if(!path2)
  288. path2 <= 1'd1;
  289. else if(!path3)
  290. path3 <= 1'd1;
  291. else if(!path4)
  292. path4 <= 1'd1;
  293. else if(!path5)
  294. path5 <= 1'd1;
  295. else if(!path6)
  296. path6 <= 1'd1;
  297. else if(!path7)
  298. path7 <= 1'd1;
  299. else if(!path8)
  300. begin
  301. go_next = 1'd1;
  302. path1 = 1'd0;
  303. path2 = 1'd0;
  304. path3 = 1'd0;
  305. path4 = 1'd0;
  306. path5 = 1'd0;
  307. path6 = 1'd0;
  308. path7 = 1'd0;
  309. end
  310. end
  311. x = x + 1'd1;
  312. end
  313. /* This will re-display the updated x and y position of the player
  314. */
  315. if(update_player)
  316. begin
  317. go_next = 1'd0;
  318. x = playerx;
  319. y = playery;
  320. colour = 3'b100;
  321. go_next = 1'd1;
  322. end
  323. /* This will re-display the updated x and y position of each enemy
  324. */
  325. if(update_enemy)
  326. begin
  327. go_next = 1'd0;
  328. x = enemyx;
  329. y = enemyy;
  330. colour = 3'b100;
  331. enemyIterator = enemyIterator + 1'd1;
  332. if(enemyIterator >= NUMOFENEMIES)
  333. begin
  334. go_next = 1'd1;
  335. enemyIterator = 1'd0;
  336. end
  337. end
  338. /* Acts as the end of the refresh
  339. */
  340. if(wait_screen)
  341. begin
  342. go_next = 1'd1;
  343. end
  344. end
  345. end
  346. endmodule
  347.  
  348. module Controller(clk, resetn, go_next, print_path, update_player, update_enemy, wait_screen);
  349. input clk;
  350. input resetn;
  351. input go_next;
  352. output reg print_path;
  353. output reg update_player;
  354. output reg update_enemy;
  355. output reg wait_screen;
  356.  
  357. reg [1:0] current_state, next_state;
  358.  
  359. // Represents the different states of the finite state machine
  360. localparam S_PRINT_PATH = 2'd0,
  361. S_UPDATE_PLAYER = 2'd1,
  362. S_UPDATE_ENEMY = 2'd2,
  363. S_WAIT_SCREEN = 2'd3;
  364.  
  365. always @(*)
  366. begin: state_table
  367. case (current_state)
  368. S_PRINT_PATH: next_state = go_next ? S_UPDATE_PLAYER : S_PRINT_PATH;
  369. S_UPDATE_PLAYER: next_state = go_next ? S_UPDATE_ENEMY : S_UPDATE_PLAYER;
  370. S_UPDATE_ENEMY: next_state = go_next ? S_WAIT_SCREEN : S_UPDATE_ENEMY;
  371. S_WAIT_SCREEN: next_state = go_next ? S_PRINT_PATH : S_WAIT_SCREEN;
  372. default: next_state = S_UPDATE_PLAYER;
  373. endcase
  374. end
  375.  
  376. always @(*)
  377. begin: enable_signals
  378. print_path = 1'd0;
  379. update_player = 1'd0;
  380. update_enemy = 1'd0;
  381. wait_screen = 1'd0;
  382. case (current_state)
  383. S_PRINT_PATH:
  384. begin
  385. print_path = 1'd1;
  386. end
  387. S_UPDATE_PLAYER:
  388. begin
  389. update_player = 1'd1;
  390. end
  391. S_UPDATE_ENEMY:
  392. begin
  393. update_enemy = 1'd1;
  394. end
  395. S_WAIT_SCREEN:
  396. begin
  397. wait_screen = 1'd1;
  398. end
  399. endcase
  400. end
  401.  
  402. always @(posedge clk)
  403. begin: curr_state_FSM
  404. if(~resetn)
  405. current_state <= S_PRINT_PATH;
  406. else
  407. current_state <= next_state;
  408. end
  409.  
  410. endmodule
  411.  
  412. module EnemyController(clk, update, resetn, enemyx, enemyy, collisionx, collisiony, enemyIterator, collisionIterator);
  413. input update;
  414. input resetn;
  415. input clk;
  416. input [3:0] enemyIterator;
  417. input [3:0] collisionIterator;
  418. parameter NUMOFENEMIES = 10;
  419. output reg [6:0] enemyx; // x position of the current enemy
  420. output reg [6:0] enemyy; // y position of the current enemy
  421. output reg [6:0] collisionx;
  422. output reg [6:0] collisiony;
  423. wire [6:0] enemyx_array [0:NUMOFENEMIES-1]; // x position of all enemies
  424. wire [6:0] enemyy_array [0:NUMOFENEMIES-1]; // y position of all enemies
  425.  
  426. Enemy enemy1(update, resetn, enemyx_array[0], enemyy_array[0], 1'b0, 7'd50, 7'd50);
  427. Enemy enemy2(update, resetn, enemyx_array[1], enemyy_array[1], 1'b1, 7'd90, 7'd90);
  428. Enemy enemy3(update, resetn, enemyx_array[2], enemyy_array[2], 1'b1, 7'd100, 7'd100);
  429. Enemy enemy4(update, resetn, enemyx_array[3], enemyy_array[3], 1'b0, 7'd40, 7'd40);
  430. Enemy enemy5(update, resetn, enemyx_array[4], enemyy_array[4], 1'b1, 7'd70, 7'd12);
  431. Enemy enemy6(update, resetn, enemyx_array[5], enemyy_array[5], 1'b0, 7'd23, 7'd90);
  432. Enemy enemy7(update, resetn, enemyx_array[6], enemyy_array[6], 1'b0, 7'd45, 7'd89);
  433. Enemy enemy8(update, resetn, enemyx_array[7], enemyy_array[7], 1'b1, 7'd45, 7'd50);
  434. Enemy enemy9(update, resetn, enemyx_array[8], enemyy_array[8], 1'b1, 7'd8, 7'd12);
  435. Enemy enemy10(update, resetn, enemyx_array[9], enemyy_array[9], 1'b1, 7'd5, 7'd100);
  436.  
  437. always @(posedge clk)
  438. begin
  439. enemyx = enemyx_array[enemyIterator];
  440. enemyy = enemyy_array[enemyIterator];
  441. collisionx = enemyx_array[collisionIterator];
  442. collisiony = enemyy_array[collisionIterator];
  443. end
  444.  
  445. endmodule
  446.  
  447. module Enemy(update, resetn, enemyx, enemyy, left_and_right, enemyx_init, enemyy_init);
  448.  
  449. input update;
  450. input resetn;
  451. input left_and_right; // if 0 the enemy will move up and down, if 1 the enemy will move left and right
  452. input [6:0] enemyx_init;
  453. input [6:0] enemyy_init;
  454. reg [3:0] movement_position;
  455. reg left_right; // if 0 move left, if 1 move right
  456. reg up_down; // if 0 move up, if 1 move down
  457. output reg [6:0] enemyx;
  458. output reg [6:0] enemyy;
  459. reg initialize;
  460.  
  461. initial
  462. begin
  463. initialize = 1'd1;
  464. end
  465.  
  466. always @(posedge update)
  467. begin
  468. if(initialize)
  469. begin
  470. enemyx = enemyx_init;
  471. enemyy = enemyy_init;
  472. initialize = 1'd0;
  473. end
  474. else if(~resetn)
  475. begin
  476. enemyx = 1'd0;
  477. enemyy = 1'd0;
  478. end
  479. else
  480. begin
  481. if(left_and_right) // Enemy will move left and right
  482. begin
  483. if(movement_position == 4'd10) // Change direction every time it moves 10 pixels left or right
  484. begin
  485. left_right = ~left_right;
  486. movement_position = 1'd0;
  487. end
  488. if(left_right == 1'b0)
  489. begin
  490. enemyx = enemyx - 1'd1; // Move enemy to the left by one pixel
  491. end
  492. else
  493. begin
  494. enemyx = enemyx + 1'd1; // Move enemy to the right by one pixel
  495. end
  496. end
  497. else // Enemy will move up and down
  498. begin
  499. if(movement_position == 4'd10) // Change direction everytime it moves 10 pixels up or down
  500. begin
  501. up_down = ~up_down;
  502. movement_position = 1'd0;
  503. end
  504. if(up_down == 1'b0)
  505. begin
  506. enemyy = enemyy + 1'd1; // Move enemy down by one pixel
  507. end
  508. else
  509. begin
  510. enemyy = enemyy - 1'd1; // Move enemy up by one pixel
  511. end
  512. end
  513. movement_position <= movement_position + 1'b1; // Iterate how much pixels the enemy has moved by 1
  514. end
  515. end
  516. endmodule
  517.  
  518. module Player(clk, update, resetn, playerx, playery, KEY, collided);
  519. input update;
  520. input resetn;
  521. input collided;
  522. input clk;
  523. output reg [6:0] playerx;
  524. output reg [6:0] playery;
  525. input [3:0] KEY;
  526.  
  527. // Initialize the starting position of the player
  528. initial
  529. begin
  530. playerx = 7'd25;
  531. playery = 7'd25;
  532. end
  533.  
  534. /* This will constantly check for player input and move the player
  535. accordingly.
  536. */
  537. always @(posedge clk)
  538. begin
  539. if(collided)
  540. begin
  541. playerx = 7'd25;
  542. playery = 7'd25;
  543. end
  544. else if(~resetn)
  545. begin
  546. playerx = 1'b0;
  547. playery = 1'b0;
  548. end
  549. else
  550. begin
  551. if(update)
  552. begin
  553. if(~KEY[3]) // MOVE PLAYER LEFT
  554. begin
  555. playerx = playerx - 1'b1;
  556. end
  557. else if(~KEY[2]) // MOVE PLAYER UP
  558. begin
  559. playery = playery - 1'b1;
  560. end
  561. else if(~KEY[1]) // MOVE PLAYER DOWN
  562. begin
  563. playery = playery + 1'b1;
  564. end
  565. else if(~KEY[0]) // MOVE PLAYER RIGHT
  566. begin
  567. playerx = playerx + 1'b1;
  568. end
  569. end
  570. end
  571. end
  572. endmodule
  573.  
  574. module rateDivider(clk, update);
  575. input clk;
  576. output reg update;
  577. reg [25:0] counter;
  578.  
  579. always @(posedge clk)
  580. begin
  581. counter = counter + 1'd1;
  582. if(counter > 26'd3124999)
  583. begin
  584. counter = 1'd0;
  585. end
  586. update = (counter == 1'd0) ? 1 : 0;
  587. end
  588.  
  589. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement