verilog實現Conwaylife二維元胞自動機(cellular automaton)

本文首發於CSDN,未經授權禁止轉載。

轉載請進行申請,經同意後可轉載,否則屬於侵權行為。

原部落格連結:https://blog。csdn。net/qq_38305370

同名博主暱稱:城外南風起

原文連結:https://blog。csdn。net/qq_38305370/article/details/112271911

最近在做HDLBits,做到Conwaylife

(https://hdlbits。01xz。net/wiki/Conwaylife)

,覺得還挺有意思的,記錄一下。

Conwaylife是要用verilog實現一種二維元胞自動機(cellular automaton)。

我的實現步驟: 1。由於矩陣需要toroid,對初始資料進行

padding

,將16x16的矩陣擴充套件為18x18的矩陣 2。根據演化規則和擴充套件後的矩陣,

統計

目標位的alive neighbours,並根據alive neighbours的個數

更新

輸出。

其中,

裝載和更新資料使用同步時序邏輯,padding、count 和 update使用組合邏輯

。同時,應使用中間變數避免在不同的邏輯塊中對同一輸出進行賦值。 程式碼:

module top_module( input clk, input load, input [255:0] data, output [255:0] q ); reg [323:0] data_padding; //18*18 wire [255:0] q_next; integer i,j,neighbour_cnt; always @(*) begin //padding data_padding[17:0] = {q[240],q[255:240],q[255]}; data_padding[323:306] = {q[0],q[15:0],q[15]}; for(i=1;i<17;i=i+1) begin data_padding[i*18 +:18] = {q[(i-1)*16],q[(i-1)*16 +: 16],q[i*16-1]}; end //count and update for(i=0;i<16;i=i+1) begin for(j=0;j<16;j=j+1) begin neighbour_cnt = data_padding[(i+1)*18+j+1-1]+data_padding[(i+1)*18+j+1+1]+data_padding[i*18+j+1-1]+data_padding[i*18+j+1]+data_padding[i*18+j+1+1]+data_padding[(i+2)*18+j+1-1]+data_padding[(i+2)*18+j+1]+data_padding[(i+2)*18+j+1+1]; if(neighbour_cnt <= 1 | neighbour_cnt >=4) q_next[i*16+j] = 0; else if(neighbour_cnt == 3) q_next[i*16+j] = 1; else q_next[i*16+j] = q[i*16+j]; //not change end end end always @(posedge clk) begin if(load) q <= data; else q <= q_next; endendmodule

我是城外南風起,歡迎關注我的公眾號【

木葉芯

】。

木葉飛舞之處,火亦生生不息。