hdlbits.01xz.net /Circuits/Sequential Logic/More Circuits/Conway‘s Game of Life 16x16

该Verilog代码实现了一个在时钟边沿触发的模块,用于处理256位数据输入。当加载信号有效时,数据直接输出;否则,根据当前位置的边界条件,计算并更新每个位置的数据,考虑其相邻元素的影响。结果存储在内部寄存器buff中并在下一个时钟周期输出。
摘要由CSDN通过智能技术生成

无比愚蠢, 但是成功了

module top_module(
    input clk,
    input load,
    input [255:0] data,
    output [255:0] q ); 
    
    reg [255:0] buff;
    integer i, x, y, nb;
    
    always @(posedge clk) begin
        if(load)
            q = data;
        else begin
            for(i = 0; i<256; i=i+1) begin
                   nb = 0;
                
                if(i%16 == 0) begin /* at left boarder */
                    if(i<16) begin /* TL corner */
                        nb = nb+q[i-1 +16];     // L
                        nb = nb+q[i+1];        // R
                        nb = nb+q[i-16 +256];    // T
                        nb = nb+q[i+16];    // D
                        nb = nb+q[i-16-1 +16 +256];    // TL
                        nb = nb+q[i-16+1 +256];    // TR
                        nb = nb+q[i+16-1 +16];    // DL
                        nb = nb+q[i+16+1];    // DR                        
                    end else if(i >=240) begin /* DL corner */
                        nb = nb+q[i-1 +16];     // L
                        nb = nb+q[i+1];        // R
                        nb = nb+q[i-16];    // T
                        nb = nb+q[i+16 -256];    // D
                        nb = nb+q[i-16-1 +16];    // TL
                        nb = nb+q[i-16+1];    // TR
                        nb = nb+q[i+16-1 +16 -256];    // DL
                        nb = nb+q[i+16+1 -256];    // DR
                    end else begin /* Left side */
                        nb = nb+q[i-1 +16];     // L
                        nb = nb+q[i+1];        // R
                        nb = nb+q[i-16];    // T
                        nb = nb+q[i+16];    // D
                        nb = nb+q[i-16-1 +16];    // TL
                        nb = nb+q[i-16+1];    // TR
                        nb = nb+q[i+16-1 +16];    // DL
                        nb = nb+q[i+16+1];    // DR
                    end
                end else if(i%16 == 15) begin /* at right boarder */
                    if(i<16) begin /* TR corner */
                        nb = nb+q[i-1];     // L
                        nb = nb+q[i+1 -16];        // R
                        nb = nb+q[i-16 +256];    // T
                        nb = nb+q[i+16];    // D
                        nb = nb+q[i-16-1 +256];    // TL
                        nb = nb+q[i-16+1 -16 +256];    // TR
                        nb = nb+q[i+16-1];    // DL
                        nb = nb+q[i+16+1 -16];    // DR
                    end else if(i >=240) begin /* DR corner */
                        nb = nb+q[i-1];     // L
                        nb = nb+q[i+1 -16];        // R
                        nb = nb+q[i-16];    // T
                        nb = nb+q[i+16 -256];    // D
                        nb = nb+q[i-16-1];    // TL
                        nb = nb+q[i-16+1 -16];    // TR
                        nb = nb+q[i+16-1 -256];    // DL
                        nb = nb+q[i+16+1 -16 -256];    // DR
                    end else begin /* Right side */
                        nb = nb+q[i-1];     // L
                        nb = nb+q[i+1 -16];        // R
                        nb = nb+q[i-16];    // T
                        nb = nb+q[i+16];    // D
                        nb = nb+q[i-16-1];    // TL
                        nb = nb+q[i-16+1 -16];    // TR
                        nb = nb+q[i+16-1];    // DL
                        nb = nb+q[i+16+1 -16];    // DR
                    end
                    
                end else begin /* not at left right boarder */
                    if(i<16) begin /* TOP side */
                        nb = nb+q[i-1];     // L
                        nb = nb+q[i+1];        // R
                        nb = nb+q[i-16 +256];    // T
                        nb = nb+q[i+16];    // D
                        nb = nb+q[i-16-1 +256];    // TL
                        nb = nb+q[i-16+1 +256];    // TR
                        nb = nb+q[i+16-1];    // DL
                        nb = nb+q[i+16+1];    // DR
                    end else if(i >=240) begin /* Down side */
                        nb = nb+q[i-1];     // L
                        nb = nb+q[i+1];        // R
                        nb = nb+q[i-16];    // T
                        nb = nb+q[i+16 -256];    // D
                        nb = nb+q[i-16-1];    // TL
                        nb = nb+q[i-16+1];    // TR
                        nb = nb+q[i+16-1 -256];    // DL
                        nb = nb+q[i+16+1 -256];    // DR
                    end else begin /* not at any boarder */
                        nb = nb+q[i-1];     // L
                        nb = nb+q[i+1];        // R
                        nb = nb+q[i-16];    // T
                        nb = nb+q[i+16];    // D
                        nb = nb+q[i-16-1];    // TL
                        nb = nb+q[i-16+1];    // TR
                        nb = nb+q[i+16-1];    // DL
                        nb = nb+q[i+16+1];    // DR
                    end
                
                end
                
                /*now we get neighbor number of one point: nb*/
                case (nb)
                    //0: buff[i] = 0;
                    //1: buff[i] = 0;
                    2: buff[i] = q[i];
                    3: buff[i] = 1;
                    default: buff[i] = 0;
                endcase
                    
                   
            end
            
            q = buff;
        end
    end

endmodule
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值