HDLBits刷题Day19,3.2.4.1 Rule 90 - 3.2.4.2 Rule 110

3.2.4.1 Rule 90

问题描述

规则90是一个具有有趣特性的一维元胞自动机。

规则很简单。有一个一维的单元格数组(开或关)。在每个时间步,每个单元的下一个状态是单元的两个当前邻居的 XOR。下表是表达此规则的更详细的方式,其中单元格的下一个状态是其自身及其两个邻居的函数:

(“规则 90”的名称来自阅读“下一个状态”列:01011010 是十进制的 90。)
在此电路中,创建一个 512 单元系统 ( q[511:0] ),并在每个时钟周期前进一个时间步长。加载输入指示系统的状态应加载data[511:0]。假设边界(q[-1]和q[512])都为零。

代码:

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

3.2.4.2 Rule 110

问题描述


Rule 110是一个具有有趣特性(例如图灵完备)的一维元胞自动机。有一个一维的单元格数组(开或关)。在每个时间步,每个单元格的状态都会发生变化。在规则 110 中,每个单元格的下一个状态仅取决于它自己和它的两个邻居。

(“规则 110”的名称来自阅读“下一个状态”列:01101110 是十进制的 110。)

在此电路中,创建一个 512 单元系统 ( q[511:0] ),并在每个时钟周期前进一个时间步长。加载输入指示系统的状态应加载data[511:0]。假设边界(q[-1]和q[512])都为零。

分析:

代码:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值