[吾题有解] HDLBits : Conway‘s Game of Life 16x16

Conwaylife是FSM之前的最后一题,题解由于使用了较多的for语句,让描述少了一丝硬件逻辑描述的直观,多了一分软件算法实现的抽象。

module top_module(
    input clk,
    input load,
    input [255:0] data,

    output [255:0] q
);
	// 将输入的data对应到一个“二维”寄存器组中,方便计算存活的邻居数
    reg [15:0] q_2d [15:0];
    // 每个cell有8个邻居,邻居存活数为0-8,共需4位二进制表示
    reg [3:0] ngbr_num [255:0];
    // 表示当前cell上下左右邻居的坐标、用于for循环的计数变量
    integer idx_i_u, idx_i_d, idx_j_l, idx_j_r, i, j;
    
	// 组合逻辑,统计每个cell的存活邻居数量并写入对应的4位ngbr_num寄存器组中
    always @(*)
        for(i = 0; i < 16; i = i + 1)
            for(j = 0; j < 16; j = j + 1) begin
                idx_i_u = (i == 0) ? i - 1 + 16 : i - 1;
                idx_i_d = (i == 15) ? i + 1 - 16 : i + 1;
                idx_j_l = (j == 0) ? j - 1 + 16 : j - 1;
                idx_j_r = (j == 15) ? j + 1 - 16 : j + 1;
                ngbr_num[16*i + j]= q_2d[idx_i_u][idx_j_l] + q_2d[idx_i_u][j] + q_2d[idx_i_u][idx_j_r] + 
                                    q_2d[i      ][idx_j_l] +                  + q_2d[i      ][idx_j_r] + 
                                    q_2d[idx_i_d][idx_j_l] + q_2d[idx_i_d][j] + q_2d[idx_i_d][idx_j_r];
            end
	
	// 时序逻辑,load高电平则将data一一对应写入q_2d中,用于初始化,
	// 不初始化时则根据每个cell的存活邻居数量决定该cell的下一个状态值
    always @(posedge clk)
        if(load)
            for(i = 0; i < 16; i = i + 1)
                for(j = 0; j < 16; j = j + 1)
                    q_2d[i][j] <= data[16*i + j];
        else begin
            for(i = 0; i < 16; i = i + 1)
                for(j = 0; j < 16; j = j + 1)
                    case(ngbr_num[16*i + j])
                        4'd2 : q_2d[i][j] <= q_2d[i][j];
                        4'd3 : q_2d[i][j] <= 1'b1;
                        default : q_2d[i][j] <= 1'b0;
                    endcase
        end

	// 组合逻辑,类似上述初始化的描述方法,将各个cell的值一一对应输出
    always @(*)
        for(i = 0; i < 16; i = i + 1)
            for(j = 0; j < 16; j = j + 1)
                q[16*i + j] = q_2d[i][j];
endmodule

代码中三个always块,只有在load时(根据题目描述)以及由cell的现态得到次态时才需要时序逻辑实现,其余无论是计算cell的存活邻居数还是对cell状态进行输出都是组合逻辑。本题还有许多更加简便的解法,但是这种方法较为直观,更便于理解Conwaylife,故记录于此。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝莲花正开

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值