Created
December 2, 2013 01:27
-
-
Save elliottsj/7743508 to your computer and use it in GitHub Desktop.
Conway's Game of Life in Verilog
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/***** | |
* | |
* CSC258, Fall 2013 | |
* Conway's Game of Life | |
* By: Spencer Elliott (999992539), Dean Britto (999895298) | |
* | |
*****/ | |
/** | |
* Main module to be instantiated in a project that uses a VGA controller | |
*/ | |
module game_of_life(KEY, CLOCK_50, x, y, r, g, b); | |
// KEYs are used to reset and cycle through presets | |
input [3:0] KEY; | |
// CLOCK_50 is used as a seed for the slower clock which controls the speed of Life generations | |
input CLOCK_50; | |
// x and y are pixel coordinates on the 640-by-480 VGA display | |
input [9:0] x, y; | |
// r, g, and b represent the colour of each pixel on the VGA display | |
output [9:0] r, g, b; | |
/** | |
* cells determines whether a square is on or off. | |
* For example, | |
* cells[4] == 1 means the square at the 5th column, 1st row is on. | |
* cells[454] == 1 means the square at the 7th column (454 % 64 + 1 == 7), 9th row (454 / 48 == 9) is on. | |
*/ | |
wire [0:64*48-1] cells; | |
// cells_reset_state and cells_preset represent the state to | |
// return all cells to when the reset KEY is pressed | |
wire [0:64*48-1] cells_reset_state; | |
reg [0:64*48-1] cells_preset; | |
reg [3:0] preset_state; | |
initial begin | |
// When the program is loaded, start with the first preset | |
cells_preset[0 :64*0+63 ] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*1 :64*1+63 ] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*2 :64*2+63 ] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*3 :64*3+63 ] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*4 :64*4+63 ] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*5 :64*5+63 ] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*6 :64*6+63 ] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*7 :64*7+63 ] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*8 :64*8+63 ] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*9 :64*9+63 ] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*10:64*10+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*11:64*11+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*12:64*12+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*13:64*13+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*14:64*14+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*15:64*15+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*16:64*16+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*17:64*17+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*18:64*18+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*19:64*19+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*20:64*20+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*21:64*21+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*22:64*22+63] <= 64'b0000000000000000000000000110010000000000000000000000000000000000; | |
cells_preset[64*23:64*23+63] <= 64'b0000000000000000000000000100010000000000000000000000000000000000; | |
cells_preset[64*24:64*24+63] <= 64'b0000000000000000000000000100110000000000000000000000000000000000; | |
cells_preset[64*25:64*25+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*26:64*26+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*27:64*27+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*28:64*28+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*29:64*29+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*30:64*30+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*31:64*31+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*32:64*32+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*33:64*33+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*34:64*34+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*35:64*35+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*36:64*36+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*37:64*37+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*38:64*38+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*39:64*39+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*40:64*40+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*41:64*41+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*42:64*42+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*43:64*43+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*44:64*44+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*45:64*45+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*46:64*46+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*47:64*47+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
preset_state <= 2; | |
end | |
// When KEY[2] is pressed, cycle through presets | |
always @(posedge KEY[2]) begin | |
if (preset_state == 1) begin | |
cells_preset[0 :64*0+63 ] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*1 :64*1+63 ] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*2 :64*2+63 ] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*3 :64*3+63 ] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*4 :64*4+63 ] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*5 :64*5+63 ] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*6 :64*6+63 ] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*7 :64*7+63 ] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*8 :64*8+63 ] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*9 :64*9+63 ] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*10:64*10+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*11:64*11+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*12:64*12+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*13:64*13+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*14:64*14+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*15:64*15+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*16:64*16+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*17:64*17+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*18:64*18+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*19:64*19+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*20:64*20+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*21:64*21+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*22:64*22+63] <= 64'b0000000000000000000000000110010000000000000000000000000000000000; | |
cells_preset[64*23:64*23+63] <= 64'b0000000000000000000000000100010000000000000000000000000000000000; | |
cells_preset[64*24:64*24+63] <= 64'b0000000000000000000000000100110000000000000000000000000000000000; | |
cells_preset[64*25:64*25+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*26:64*26+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*27:64*27+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*28:64*28+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*29:64*29+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*30:64*30+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*31:64*31+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*32:64*32+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*33:64*33+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*34:64*34+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*35:64*35+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*36:64*36+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*37:64*37+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*38:64*38+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*39:64*39+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*40:64*40+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*41:64*41+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*42:64*42+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*43:64*43+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*44:64*44+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*45:64*45+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*46:64*46+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*47:64*47+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
preset_state <= 2; | |
end else if (preset_state == 2) begin | |
cells_preset[0 :64*0+63 ] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*1 :64*1+63 ] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*2 :64*2+63 ] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*3 :64*3+63 ] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*4 :64*4+63 ] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*5 :64*5+63 ] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*6 :64*6+63 ] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*7 :64*7+63 ] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*8 :64*8+63 ] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*9 :64*9+63 ] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*10:64*10+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*11:64*11+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*12:64*12+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*13:64*13+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*14:64*14+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*15:64*15+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*16:64*16+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*17:64*17+63] <= 64'b0000000000000001100000000110000000000000000000000000000000000000; | |
cells_preset[64*18:64*18+63] <= 64'b0000000000000001100000001000000000000000000000000000000000000000; | |
cells_preset[64*19:64*19+63] <= 64'b0000000000000000000000000001000000000000000000000000000000000000; | |
cells_preset[64*20:64*20+63] <= 64'b0000000000000000000000011010000000000000000000000000000000000000; | |
cells_preset[64*21:64*21+63] <= 64'b0000000000000000000000011000000000000000000000000000000000000000; | |
cells_preset[64*22:64*22+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*23:64*23+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*24:64*24+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*25:64*25+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*26:64*26+63] <= 64'b0000000000000000000000110000000000000000000000000000000000000000; | |
cells_preset[64*27:64*27+63] <= 64'b0000000000000000000010110000000000000000000000000000000000000000; | |
cells_preset[64*28:64*28+63] <= 64'b0000000000000000000100000000000000000000000000000000000000000000; | |
cells_preset[64*29:64*29+63] <= 64'b0000000000000000000000100000001100000000000000000000000000000000; | |
cells_preset[64*30:64*30+63] <= 64'b0000000000000000000011000000001100000000000000000000000000000000; | |
cells_preset[64*31:64*31+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*32:64*32+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*33:64*33+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*34:64*34+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*35:64*35+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*36:64*36+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*37:64*37+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*38:64*38+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*39:64*39+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*40:64*40+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*41:64*41+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*42:64*42+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*43:64*43+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*44:64*44+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*45:64*45+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*46:64*46+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*47:64*47+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
preset_state <= 3; | |
end else if (preset_state == 3) begin | |
cells_preset[0 :64*0+63 ] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*1 :64*1+63 ] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*2 :64*2+63 ] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*3 :64*3+63 ] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*4 :64*4+63 ] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*5 :64*5+63 ] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*6 :64*6+63 ] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*7 :64*7+63 ] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*8 :64*8+63 ] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*9 :64*9+63 ] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*10:64*10+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*11:64*11+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*12:64*12+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*13:64*13+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*14:64*14+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*15:64*15+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*16:64*16+63] <= 64'b0000000000000000000011000000110000000000000000000000000000000000; | |
cells_preset[64*17:64*17+63] <= 64'b0000000000000000000100100001001000000000000000000000000000000000; | |
cells_preset[64*18:64*18+63] <= 64'b0000000000000000000101000000101000000000000000000000000000000000; | |
cells_preset[64*19:64*19+63] <= 64'b0000000000000000011001110011100110000000000000000000000000000000; | |
cells_preset[64*20:64*20+63] <= 64'b0000000000000000100000010010000001000000000000000000000000000000; | |
cells_preset[64*21:64*21+63] <= 64'b0000000000000000101100000000001101000000000000000000000000000000; | |
cells_preset[64*22:64*22+63] <= 64'b0000000000000000010100000000001010000000000000000000000000000000; | |
cells_preset[64*23:64*23+63] <= 64'b0000000000000000000110001100011000000000000000000000000000000000; | |
cells_preset[64*24:64*24+63] <= 64'b0000000000000000000000010100000000000000000000000000000000000000; | |
cells_preset[64*25:64*25+63] <= 64'b0000000000000000000000011000000000000000000000000000000000000000; | |
cells_preset[64*26:64*26+63] <= 64'b0000000000000000000110000000011000000000000000000000000000000000; | |
cells_preset[64*27:64*27+63] <= 64'b0000000000000000010100000000001010000000000000000000000000000000; | |
cells_preset[64*28:64*28+63] <= 64'b0000000000000000101100000000001101000000000000000000000000000000; | |
cells_preset[64*29:64*29+63] <= 64'b0000000000000000100000010010000001000000000000000000000000000000; | |
cells_preset[64*30:64*30+63] <= 64'b0000000000000000011001110011100110000000000000000000000000000000; | |
cells_preset[64*31:64*31+63] <= 64'b0000000000000000000101000000101000000000000000000000000000000000; | |
cells_preset[64*32:64*32+63] <= 64'b0000000000000000000100100001001000000000000000000000000000000000; | |
cells_preset[64*33:64*33+63] <= 64'b0000000000000000000011000000110000000000000000000000000000000000; | |
cells_preset[64*34:64*34+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*35:64*35+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*36:64*36+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*37:64*37+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*38:64*38+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*39:64*39+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*40:64*40+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*41:64*41+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*42:64*42+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*43:64*43+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*44:64*44+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*45:64*45+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*46:64*46+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*47:64*47+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
preset_state <= 4; | |
end else if (preset_state == 4) begin | |
cells_preset[0 :64*0+63 ] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*1 :64*1+63 ] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*2 :64*2+63 ] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*3 :64*3+63 ] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*4 :64*4+63 ] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*5 :64*5+63 ] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*6 :64*6+63 ] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*7 :64*7+63 ] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*8 :64*8+63 ] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*9 :64*9+63 ] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*10:64*10+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*11:64*11+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*12:64*12+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*13:64*13+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*14:64*14+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*15:64*15+63] <= 64'b0000000000000000000000100000000000000000000000000000000000000000; | |
cells_preset[64*16:64*16+63] <= 64'b0000000000000000000001110000000000000000000000000000000000000000; | |
cells_preset[64*17:64*17+63] <= 64'b0000000000000000000011010000010000000000000000000000000000000000; | |
cells_preset[64*18:64*18+63] <= 64'b0000000000000000000011100000111000000000000000000000000000000000; | |
cells_preset[64*19:64*19+63] <= 64'b0000000000000000000001100001001100011100000000000000000000000000; | |
cells_preset[64*20:64*20+63] <= 64'b0000000000000000000000000001110000100100000000000000000000000000; | |
cells_preset[64*21:64*21+63] <= 64'b0000000000000000000000000000000000000100000000000000000000000000; | |
cells_preset[64*22:64*22+63] <= 64'b0000000000000000000000000000000000000100000000000000000000000000; | |
cells_preset[64*23:64*23+63] <= 64'b0000000000000000000000000000000000001000000000000000000000000000; | |
cells_preset[64*24:64*24+63] <= 64'b0000000000000000000001110000000000000000000000000000000000000000; | |
cells_preset[64*25:64*25+63] <= 64'b0000000000000000000001001000000000000000000000000000000000000000; | |
cells_preset[64*26:64*26+63] <= 64'b0000000000000000000001000000000000000000000000000000000000000000; | |
cells_preset[64*27:64*27+63] <= 64'b0000000000000000000001000000000000000000000000000000000000000000; | |
cells_preset[64*28:64*28+63] <= 64'b0000000000000000000000100000000000000000000000000000000000000000; | |
cells_preset[64*29:64*29+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*30:64*30+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*31:64*31+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*32:64*32+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*33:64*33+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*34:64*34+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*35:64*35+63] <= 64'b0000000000000000000111000000000000000000000000000000000000000000; | |
cells_preset[64*36:64*36+63] <= 64'b0000000000000000000100100000000000010000000000000000000000000000; | |
cells_preset[64*37:64*37+63] <= 64'b0000000000000000000100000000000000111000000000000000000000000000; | |
cells_preset[64*38:64*38+63] <= 64'b0000000000000000000100000000000001101000000000000000000000000000; | |
cells_preset[64*39:64*39+63] <= 64'b0000000000000000000100000000000001110000000000000000000000000000; | |
cells_preset[64*40:64*40+63] <= 64'b0000000000000000000010000000000000110000000000000000000000000000; | |
cells_preset[64*41:64*41+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*42:64*42+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*43:64*43+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*44:64*44+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*45:64*45+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*46:64*46+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*47:64*47+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
preset_state <= 5; | |
end else if (preset_state == 5) begin | |
cells_preset[0 :64*0+63 ] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*1 :64*1+63 ] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*2 :64*2+63 ] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*3 :64*3+63 ] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*4 :64*4+63 ] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*5 :64*5+63 ] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*6 :64*6+63 ] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*7 :64*7+63 ] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*8 :64*8+63 ] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*9 :64*9+63 ] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*10:64*10+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*11:64*11+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*12:64*12+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*13:64*13+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*14:64*14+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*15:64*15+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*16:64*16+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*17:64*17+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*18:64*18+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*19:64*19+63] <= 64'b0000000000110001100011000110001100011000110001100000000000000000; | |
cells_preset[64*20:64*20+63] <= 64'b0000000000001100011000110001100011000110001100011000000000000000; | |
cells_preset[64*21:64*21+63] <= 64'b0000000000001100011000110001100011000110001100011000000000000000; | |
cells_preset[64*22:64*22+63] <= 64'b0000000000110001100011000110001100011000110001100000000000000000; | |
cells_preset[64*23:64*23+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*24:64*24+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*25:64*25+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*26:64*26+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*27:64*27+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*28:64*28+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*29:64*29+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*30:64*30+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*31:64*31+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*32:64*32+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*33:64*33+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*34:64*34+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*35:64*35+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*36:64*36+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*37:64*37+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*38:64*38+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*39:64*39+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*40:64*40+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*41:64*41+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*42:64*42+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*43:64*43+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*44:64*44+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*45:64*45+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*46:64*46+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
cells_preset[64*47:64*47+63] <= 64'b0000000000000000000000000000000000000000000000000000000000000000; | |
preset_state <= 1; | |
end | |
end | |
// The value of cells_reset_state is the same as the current value of cells_preset | |
assign cells_reset_state = cells_preset; | |
// Create a clock to control the speed of generations | |
wire Clk; | |
clock(Clk, CLOCK_50); | |
/** | |
* Assign neighbours for each cell depending on the cell's location. | |
* Cells on the edges and corners of the grid must be dealt with separately since | |
* their neighbours are not directly adjacent. | |
*/ | |
genvar i; | |
generate | |
for (i = 0; i < 64 * 48; i = i + 1) begin : CELLS | |
wire [7:0] neighbours; | |
if (i == 0) begin | |
// Top-left square | |
assign neighbours[0] = cells[64*48 - 1]; | |
assign neighbours[1] = cells[64*48 - 64]; | |
assign neighbours[2] = cells[64*48 - 64 + 1]; | |
assign neighbours[3] = cells[i + 64 - 1]; | |
assign neighbours[4] = cells[i + 1]; | |
assign neighbours[5] = cells[64 + 64 - 1]; | |
assign neighbours[6] = cells[64]; | |
assign neighbours[7] = cells[64 + 1]; | |
end else if (i == 63) begin | |
// Top-right square | |
assign neighbours[0] = cells[64*48 - 1 - 1]; | |
assign neighbours[1] = cells[64*48 - 1]; | |
assign neighbours[2] = cells[64*48 - 64]; | |
assign neighbours[3] = cells[i - 1]; | |
assign neighbours[4] = cells[0]; | |
assign neighbours[5] = cells[i + 64 - 1]; | |
assign neighbours[6] = cells[i + 64]; | |
assign neighbours[7] = cells[i + 1]; | |
end else if (i == 64*48 - 64) begin | |
// Bottom-left square | |
assign neighbours[0] = cells[i - 1]; | |
assign neighbours[1] = cells[i - 64]; | |
assign neighbours[2] = cells[i - 64 + 1]; | |
assign neighbours[3] = cells[i + 64 - 1]; | |
assign neighbours[4] = cells[i + 1]; | |
assign neighbours[5] = cells[0 + 64 - 1]; | |
assign neighbours[6] = cells[0]; | |
assign neighbours[7] = cells[0 + 1]; | |
end else if (i == 64*48 - 1) begin | |
// Bottom-right square | |
assign neighbours[0] = cells[i - 64 - 1]; | |
assign neighbours[1] = cells[i - 64]; | |
assign neighbours[2] = cells[i - 64 - 64 + 1]; | |
assign neighbours[3] = cells[i - 1]; | |
assign neighbours[4] = cells[i - 64 + 1]; | |
assign neighbours[5] = cells[0 + 64 - 1 - 1]; | |
assign neighbours[6] = cells[0 + 64 - 1]; | |
assign neighbours[7] = cells[0]; | |
end else if (i < 63) begin | |
// Top row | |
assign neighbours[0] = cells[64*48 - 64 + i - 1]; | |
assign neighbours[1] = cells[64*48 - 64 + i]; | |
assign neighbours[2] = cells[64*48 - 64 + i + 1]; | |
assign neighbours[3] = cells[i - 1]; | |
assign neighbours[4] = cells[i + 1]; | |
assign neighbours[5] = cells[i + 64 - 1]; | |
assign neighbours[6] = cells[i + 64]; | |
assign neighbours[7] = cells[i + 64 + 1]; | |
end else if (i > 64*48 - 64) begin | |
// Bottom row | |
assign neighbours[0] = cells[i - 64 - 1]; | |
assign neighbours[1] = cells[i - 64]; | |
assign neighbours[2] = cells[i - 64 + 1]; | |
assign neighbours[3] = cells[i - 1]; | |
assign neighbours[4] = cells[i + 1]; | |
assign neighbours[5] = cells[0 + i - 1]; | |
assign neighbours[6] = cells[0 + i]; | |
assign neighbours[7] = cells[0 + i + 1]; | |
end else if (i % 64 == 0) begin | |
// Leftmost column | |
assign neighbours[0] = cells[i - 1]; | |
assign neighbours[1] = cells[i - 64]; | |
assign neighbours[2] = cells[i - 64 + 1]; | |
assign neighbours[3] = cells[i + 64 - 1]; | |
assign neighbours[4] = cells[i + 1]; | |
assign neighbours[5] = cells[i + 64 + 64 - 1]; | |
assign neighbours[6] = cells[i + 64]; | |
assign neighbours[7] = cells[i + 64 + 1]; | |
end else if ((i + 1) % 64 == 0) begin | |
// Rightmost column | |
assign neighbours[0] = cells[i - 64 - 1]; | |
assign neighbours[1] = cells[i - 64]; | |
assign neighbours[2] = cells[i - 64 - 64 + 1]; | |
assign neighbours[3] = cells[i - 1]; | |
assign neighbours[4] = cells[i - 64 + 1]; | |
assign neighbours[5] = cells[i + 64 - 1]; | |
assign neighbours[6] = cells[i + 64]; | |
assign neighbours[7] = cells[i + 1]; | |
end else begin | |
// Middle squares | |
assign neighbours[0] = cells[i - 64 - 1]; | |
assign neighbours[1] = cells[i - 64]; | |
assign neighbours[2] = cells[i - 64 + 1]; | |
assign neighbours[3] = cells[i - 1]; | |
assign neighbours[4] = cells[i + 1]; | |
assign neighbours[5] = cells[i + 64 - 1]; | |
assign neighbours[6] = cells[i + 64]; | |
assign neighbours[7] = cells[i + 64 + 1]; | |
end | |
// Create the module for the cell | |
life_cell(neighbours, Clk, KEY[2], cells_reset_state[i], cells[i]); | |
end | |
endgenerate | |
// Show the cells on the VGA display | |
display(cells, x, y, r, g, b); | |
endmodule | |
/** | |
* Uses CLOCK_50 to slow down Clk to 2 Hz | |
*/ | |
module clock(Clk, Clk_50); | |
input Clk_50; | |
output Clk; | |
reg [31:0] counter; | |
always @(posedge Clk_50) begin | |
if (counter == 25000000) | |
counter <= 0; | |
else | |
counter <= counter + 1; | |
end | |
assign Clk = (counter == 25000000); | |
endmodule | |
/** | |
* Create a Conway's Game of Life cell with the specified | |
* neighbours, clock, reset, initial state, and current state | |
*/ | |
module life_cell(neighbours, Clk, Rst, initial_state, state); | |
input [7:0] neighbours; | |
input Clk; | |
input Rst; | |
input initial_state; | |
output reg state; | |
wire [3:0] population; | |
wire next_state; | |
// population is the count of neighbouring cells that are alive (i.e. on) | |
assign population = neighbours[7] + | |
neighbours[6] + | |
neighbours[5] + | |
neighbours[4] + | |
neighbours[3] + | |
neighbours[2] + | |
neighbours[1] + | |
neighbours[0]; | |
// next_state is the next state (alive or dead) of this cell | |
assign next_state = (population == 2 & state) | population == 3; | |
always @(posedge Clk or negedge Rst) begin | |
if (!Rst) begin | |
// When reset fires, return this cell to its initial state | |
state = initial_state; | |
end else begin | |
// When the clock fires, bring this cell to its next state | |
state = next_state; | |
end | |
end | |
endmodule | |
/** | |
* Display the grid of cells on the VGA display. | |
*/ | |
module display(cells, x, y, r, g, b); | |
input [0:64*48-1] cells; | |
input [9:0] x, y; | |
output [9:0] r, g, b; | |
// x and y change at a fast rate; | |
// the colour of the pixel at the current (x, y) coordinates is determined by RGB | |
reg [29:0] RGB; | |
always @(x or y) begin | |
// row = y / 10 | |
// column = x / 10 | |
// cell = (row * 64) + column | |
// Find the cell index using `(y / 10) * 64 + (x / 10)`. See pseudocode above. | |
if (cells[(y / 10) * 64 + (x / 10)]) begin | |
// The cell that covers this (x, y) coordinate is alive, so turn on the pixel on | |
RGB = 30'b111111111111111111111111111111; | |
end else begin | |
// The cell that covers this (x, y) coordinate is dead, so turn on the pixel off | |
RGB = 30'b000000000000000000000000000000; | |
end | |
end | |
assign r = RGB[29:20]; | |
assign g = RGB[19:10]; | |
assign b = RGB[9:0]; | |
endmodule |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Hey,
Hope you are doing well.
I was trying to recreate this code and found a little bug in it. For the neighbors of bottom row, neighbor 5,6 and 7 are incorrect. 5 and 7 are actually same as 3 and 4 in your code. I think the correct way for them is to use:
cells[0 + ( i % 64 ) +- 1].
Please correct me if I am wrong.
Anyway, thanks for keeping the code open source.
Regards.