「HDLBits题解」Cellular automata

本专栏的目的是分享可以通过HDLBits仿真的Verilog代码 以提供参考 各位可同时参考我的代码和官方题解代码 或许会有所收益


题目链接:Rule90 - HDLBits

module top_module(
    input clk,
    input load,
    input [511:0] data,
    output [511:0] q );

    always @ (posedge clk) begin 
        if (load) 
            q <= data ; 
		else
            q <= {1'b0, q[511:1]} ^ {q[510:0], 1'b0} ;
    end
endmodule

题目链接:Rule110 - HDLBits

module top_module(
    input clk,
    input load,
    input [511:0] data,
    output [511:0] q
);
	always @(posedge clk) begin
		if (load) begin
			q <= data;
		end
		else begin
			q <= (((q[511:0] ^ {q[510:0], 1'b0}) & q[511:1]) | ((q[511:0] | {q[510:0], 1'b0}) & (~q[511:1])));
		end
	end
endmodule

题目链接:Conwaylife - HDLBits

module top_module(
    input clk,
    input load,
    input [255:0] data,
    output [255:0] q ); 

    reg [255:0] q_next;
    reg [3:0] sum;

    always@(posedge clk) begin
        if(load)
            q <= data;
        else begin
            for(int i=0; i<256; i++) begin  //使用阻塞赋值,使sum得出后在该时钟周期内q立即变化,而不需要等到下个周期。
                if(i == 0)  //左上角
                    sum = q[1] + q[16] + q[17] + q[240] + q[241] + q[15] + q[31] + q[255];
                else if(i == 15)    //右上角
                    sum = q[14] + q[16] + q[0] + q[240] + q[254] + q[30] + q[31] + q[255];
                else if(i == 240)   //左下角
                    sum = q[0] + q[15] + q[239] + q[241] + q[1] + q[224] + q[225] + q[255];
                else if(i == 255)   //右下角
                    sum = q[0] + q[15] + q[14] + q[224] + q[238] + q[240] + q[239] + q[254];
                else if(0<i & i<15) //上边界
                    sum = q[i-1] + q[i+1] + q[i+15] + q[i+16] + q[i+17] + q[i+239] + q[i+240] + q[i+241];
                else if(i%16 == 0)  //左边界
                    sum = q[i-1] + q[i+1] + q[i+15] + q[i+16] + q[i+17] + q[i-16] + q[i-15] + q[i+31];
                else if(i%16 == 15) //右边界
                    sum = q[i-1] + q[i+1] + q[i+15] + q[i+16] + q[i-17] + q[i-16] + q[i-15] + q[i-31];
                else if(240<i & i<255)  //下边界
                    sum = q[i-1] + q[i+1] + q[i-17] + q[i-16] + q[i-15] + q[i-239] + q[i-240] + q[i-241];
                else //非边界
                    sum = q[i-1] + q[i+1] + q[i-17] + q[i-16] + q[i-15] + q[i+15] + q[i+16] + q[i+17];
          		
                case(sum) //根据邻居数量判断次态
                    2:q_next[i] = q[i];
                    3:q_next[i] = 1;
                    default:q_next[i] = 0;
                endcase
            end
            	q = q_next;
        end
    end
endmodule
相关推荐
小桶qa4 小时前
verilog水仙花数 & RAM实现_2024年8月5日
verilog
今天你fpga了嘛2 天前
五、一个quad同时支持pcie和sfp两种高速接口的ref时钟配置
fpga开发
电子小白的每一天2 天前
FPGA开发——状态机的使用
vscode·fpga开发·fpga
千穹凌帝2 天前
SpinalHDL之仿真(八)
fpga开发
电子小白的每一天3 天前
FPGA开发——基于Quartus的工程建立以及下载仿真全过程
vscode·fpga开发·fpga
在路上-正出发3 天前
【Verilog-CBB】开发与验证(2)——单比特信号CDC同步器
verilog·cdc·cbb
cckkppll3 天前
vivado MAX_NAMES
fpga开发
nwpu0617013 天前
modelsim仿真quartus IP
fpga开发
十三啊嘞4 天前
高速总线概述(二):高速总线技术要点(比特流高速数据传输,编、解码、CRC校验及扰码结构,链路同步)
fpga开发·串行高速总线
神仙约架4 天前
【INTEL(ALTERA)】当使用 F-Tile 以太网 FPGA 硬 IP 并启用自动协商和链路训练 (AN/LT) 时,为什么链路训练无法完成?
网络协议·tcp/ip·fpga开发