3.2.4 More Circuit
3.2.4.1 Rule90
Rule90是一道根据一些有趣规则生成一维序列的题目
规则很简单,一维序列中有0
和1
两种状态
下表更详细地给出了跳变的规则,(可以视为状态转移表),元素下一个状态可以视作输出,输入为元素本身的状态与相应两个相邻元素的当前状态。
对于需要实现的电路,创建一个拥有 512
个元素的序列 q[511:0]
,每个时钟周期按照上述规则变换。load
信号有效时,序列更新 data
信号值为初始值。另外假设所有边界的值为 0
(q[-1]
以及 q[512]
)
从真值表中不难看出,center的下一个状态,是由center左右两个状态异或而得
module top_module(
input clk,
input load,
input [511:0] data,
output [511:0] q );
integer i;
always @ (posedge clk) begin
if(load) begin
q <= data;
end
else begin
q[0] <= q[1] ^ 0;
q[511] <= q[510] ^ 0;
for(i = 1; i < 511; i++) begin
q[i] <= q[i-1] ^ q[i+1];
end
end
end
endmodule
3.2.4.2 Rule110
在每个时钟上升沿,元素状态发生改变。在rule110
中,元素的下一个状态不仅与当前状态有关,还与当前状态两边的状态有关。
下图给出了更详细的状态变化关系:
在这个电路中,要求创建一个由512的元素组成的系统q[511:0]
,规定每个时钟上升沿前进一步,load
有效是,将所有状态赋值为data[51:0]
,且假设q[-1]
和q[512]
都是0
module top_module(
input clk,
input load,
input [511:0] data,
output [511:0] q
);
wire [511:0] left;
wire [511:0] right;
assign right = {q[510:0],1'b0};
assign left = {1'b0,q[511:1]};
always @ (posedge clk) begin
if(load) begin
q <= data;
end
else begin
q <= (q ^ right) | (q & (~left));
end
end
endmodule
从真值表中可以看出,输出out = (center ^ right) | (center & (~left))
在开始时,先设定两个变量来存储left
和right
,在load = 0
时,直接套用逻辑表达式即可
3.2.4.3 Conway’s Game of Life 16×16
game
是在二维网格上进行的,每个元素1
有效,0
无效
规则如下:
时钟上升沿时,元素的下一个状态会根据与其相邻的元素为1
的个数进行变化:
- 0-1 : 元素变为
0
- 2 : 状态步变
- 3 : 元素变为
1
- 4+ : 元素变为
0
二维矩阵可以是无限的,为了方便做题,本题矩阵设定为16×16
本题对二维矩阵做了环形处理,例如,元素(0,0)旁边的元素分别为 (15,1)、(15,0)、(15,15)、(0,1)、(0,15)、(1,1)、(1,0)和(1,15)。
16×16
矩阵由一个长度为256
的向量表示,其中q[15:0]
是第0
行,q[31:16]
是第一行
- load : 将
data
数据传给q
- q:每个时钟周期,更新一次状态
没有敲出来,放弃了~~~~~~~~~~~~~~~~~~~~~~~