HDLBit 生命游戏Conwaylife

题目:生命游戏
这道题目是著名的康威生命游戏,一个中心点周围有8个邻居,如果周围的邻居中1的数目为0-1个,那么中心点变为0;如果周围邻居中1的数目为2个,那么中心点状态不变;如果周围邻居中1的数目为3个,中心点变为1;如果周围邻居中1的数目大于3个,中心点变为0。

我们可以将周围的8个邻居的值都加起来来判断周围邻居中1的个数,但是直接做的话就要分很多情况讨论,
比如边角,首行末行,首列末列,因此这里使用了一个巧妙地方法,先进行padding,
提前把1616扩展成1818这样就方便计算了。

module top_module(
    input clk,
    input load,
    input [255:0] data,
    output [255:0] q ); 
 
    //padding
    wire [323:0] pq;    //padded q
    integer row;
    always @(*) begin
        {pq[0], pq[17], pq[306],pq[323]} = {q[255], q[240], q[15],q[0]}; // 4 corners
        {pq[16:1], pq[322:307]} = {q[255:240], q[15:0]}; // up and down side
        for (row = 0; row < 16; row ++) begin
            {pq[18*row+18], pq[18*row+35]} = {q[16*row+15], q[16*row]}; // left and right side
            pq[18*row+19 +: 16] = q[16*row +: 16]; // core
        end
    end
    
    //add calc
    integer r; // rows
    integer c; // columns
    integer m; // loc in 18*18 (pq)
    integer l; // loc in 16*16 (sum & q & qn)
    reg [3:0] sum [255:0]; // calc neighbours save in sum
    reg [255:0] qn; //next state
    always @(*) begin
        for (r = 0; r < 16; r++) begin
            for (c = 0; c < 16; c++) begin
                m = 18*r + c + 19;
                l = 16*r +c;
                            sum[l] = pq[m-19] + pq[m-18] + pq[m-17] + pq[m-1] + pq[m+1] + pq[m+17] + pq[m+18] + pq[m+19];
                qn[l] = (sum[l] < 4'd2)?(1'b0):((sum[l] < 4'd3)?(q[l]):((sum[l] < 4'd4)?(1'b1):(1'b0))); //conways rule
            end
        end
    end
    
    // state 
    always @(posedge clk) begin
        if (load)
            q <= data;
        else
            q <= qn;
    end
    
endmodule
                
                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值