之前,帮别人用VHDL实现了一个生命游戏的逻辑电路,觉得很有意思,所以分享出来大家一起学习。
1,github代码地址:https://github.com/zgw598243565/Game_of_Life
2,B站代码详解地址:https://www.bilibili.com/video/BV1fS4y1V7PJ?spm_id_from=333.999.0.0
生命游戏(Game of Life)是由英国数学家John Horton Conway于1970年发明的细胞单元自动机模型。该模型中,每个细胞单元cell具有2个状态(活着alive或者死亡dead),通常由一个2状态状态机来表示,而宇宙universe是由无数细胞单元cell构成的二维正交网格。在生命宇宙的演进中,每个细胞单元将其当前状态(alive或dead)传递给其8个邻近单元(NW,N,...,SW,W),同样它也会接受其8个邻近单元的状态。每个细胞单元的下个状态取决于其当前状态及其邻近的状态,规则如下:
(1)若活细胞单元具有0或1个活邻居,则将死亡;
(2)若活细胞单元具有2或3个活邻居,则可以存活;
(3)若活细胞单元具有4或更多活邻居,则将死亡;
(4)若死细胞单元刚好具有3个活邻居,则将转为活细胞。
图 1
图1显示了一小部分宇宙空间(9x8),从一个特定的初始状态开始,随时间向前演进了4次状态。图上半部分显示了两个连续状态转化之间的中间状态,下半部分无中间状态。
设计要求:
(1) 为单个细胞单元cell设计可综合的VHDL硬件模型。cell单元的接口信号参考表2进行定义。
Name | Direction | Description |
clk | Input | Global clock |
srstn | Input | Global synchronous active low reset (force to 0:dead) |
ce | Input | Clock enable |
load | Input | When set,take W as next state |
NW | Input | Current state of the north-west neightbour(0:dead,1:live) |
N | Input | Current state of the north neightbour(0:dead,1:live) |
NE | Input | Current state of the north-east neightbour(0:dead,1:live) |
E | Input | Current state of the east neightbour(0:dead,1:live) |
SE | Input | Current state of the south-east neightbour(0:dead,1:live) |
S | Input | Current state of the south neightbour(0:dead,1:live) |
SW | Input | Current state of the south-west neightbour(0:dead,1:live) |
W | Input | Current state of the west neightbour(0:dead,1:live) |
state | Output | Current state of CELL(0:dead,1:live) |
表 2
CELL模型工作于时钟信号clk的上升沿;接口信号中srstn为同步复位信号,低电平有效,优先级高于ce和load;时钟使能信号ce为高电平有效,优先级高于load,若ce为低电平,细胞单元停止工作;装载信号load也为高电平有效,若load为高电平,细胞单元将把其西边单元(W)的状态作为其下一个状态。
(2)基于上面设计的CELL单元,为一个rxc(r 行 c 列)的球环形宇宙空间,设计一个可综合的VHDL硬件模型,自行定义模型接口并提供仿真结果。下图3所示为一个3x3的球环形宇宙,坐标(i,j)代表该位置的细胞单元,图中虚线连接表示构成一个封闭球环。
图 3
要求1:该宇宙空间的最左列细胞单元能被外部输入的状态值进行初始化,即装载load。
要求2:该宇宙空间的细胞单元状态值能够通过最右列的细胞单元进行依次输出。