# HDLBits：在线学习 Verilog （二十四 · Problem 115-119）

Problem 115 Rule90

Rule90 是一道根据一些有趣的规则来生成一维序列的题目。

by the way,本题题目中的 Rule90 来自于上表中的 next state 这一列: 01011010 = 8'd90。

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

int i;
always @(posedge clk ) begin
q <= data;
else begin
q[0]        <=  q[1] ^ 0;
q[511]      <=  0 ^ q[510];
for(i = 1; i<511;i=i+1)
q[i] <= q[i - 1] ^ q[i + 1];
end
end
endmodule
```

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

always @(posedge clk) begin
q <= data;	// Load the DFFs with a value.
else begin
// At each clock, the DFF storing each bit position becomes the XOR of its left neighbour
// and its right neighbour. Since the operation is the same for every
// bit position, it can be written as a single operation on vectors.
// The shifts are accomplished using part select and concatenation operators.

//     left           right
//  neighbour       neighbour
q <= q[511:1] ^ {q[510:0], 1'b0} ;
end
end
endmodule
```

Problem 116 Rule110

Rule110 还是一道根据有趣的规则来生成一维序列的题目，比如用于：

https://en.wikipedia.org/wiki/Turing_completenessen.wikipedia.org

```module top_module(
input clk,
input [511:0] data,
output reg[511:0] q
);
int i;
always @(posedge clk ) begin
q <= data;
else begin
q[0]        <=  q[0];
q[511]      <=  (q[511] ^ q[510] )|| ( q[510] );
for(i = 1; i<511;i=i+1)
q[i] <= (q[i] ^ q[i - 1] )|| (!q[i+1] & q[i-1]);
end
end
endmodule
```

Problem 117 Conwaylift/conway's game of life 16x16

• 0-1 ，元素变为 0
• 2 ，元素保持不变
• 3 ，元素变为 1
• 4+ ，元素变为 0

HDLBit 支持使用 SystemVerilog，所以你也可以使用二维向量表示这个矩阵。load 信号有效时，更新 q 信号值为初始值 data, q 每个周期变换一次。

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

reg [15:0] q_2d [15:0]; //2-d q
wire [2:0] nghbr_num [255:0];
int idx_i_d,idx_i_u,idx_j_r,idx_j_l,i,j;

//count num of neighbours
always@(*) begin
for(i = 0 ; i < 16 ; i = i + 1) begin
for(j = 0 ; j < 16 ; j = j + 1) begin
idx_i_u = (i == 0) ? i-1+16 :i-1; //up idx
idx_i_d = (i == 15)? i+1-16 :i+1; //down idx
idx_j_l = (j == 0) ? j-1+16 :j-1; //left idx
idx_j_r = (j == 15)? j+1-16 :j+1; //right idx
nghbr_num[i*16+j] = q_2d[idx_i_u][idx_j_l] + q_2d[idx_i_u][j  ] + q_2d[idx_i_u][idx_j_r]
+   q_2d[i      ][idx_j_l]                      + q_2d[i      ][idx_j_r]
+   q_2d[idx_i_d][idx_j_l] + q_2d[idx_i_d][j  ] + q_2d[idx_i_d][idx_j_r];
end
end
end

//next state transform base on num of neighbours
always @(posedge clk) begin
for(i = 0 ; i < 16 ; i = i + 1) begin
for(j = 0 ; j < 16 ; j = j + 1) begin
q_2d[i][j]    <=  data[i*16+j];
end
end
end
else begin:set_val
for(i = 0 ; i < 16 ; i = i + 1) begin
for(j = 0 ; j < 16 ; j = j + 1) begin
if(nghbr_num[i*16+j] < 2)
q_2d[i][j]      <=  1'b0;
else if (nghbr_num[i*16+j] > 3)
q_2d[i][j]      <=  1'b0;
else if (nghbr_num[i*16+j] == 3)
q_2d[i][j]      <=  1'b1;
else
q_2d[i][j]      <=  q_2d[i][j];
end
end
end
end

//output
always@(*) begin
for(i = 0 ; i < 16 ; i = i + 1) begin
for(j = 0 ; j < 16 ; j = j + 1) begin
q[i*16+j] = q_2d[i][j];
end
end
end

endmodule
```

• 统计矩阵中每个元素的 8 -相邻元素中 1 的个数
• 根据相邻元素中的 1 的个数，决定元素下一状态的值

wire [2:0] nghbr_num [255:0];

```idx_i_u = (i == 0) ? i-1+16 :i-1; //up idx
idx_i_d = (i == 15)? i+1-16 :i+1; //down idx
idx_j_l = (j == 0) ? j-1+16 :j-1; //left idx
idx_j_r = (j == 15)? j+1-16 :j+1; //right idx
```

Problem 118 Simple FSM1 / Fsm1

```module top_module (
input clk,
input in,
input areset,
output out
);

// -----实现状态机
endmodule
```

```	// Give state names and assignments. I'm lazy, so I like to use decimal numbers.
// It doesn't really matter what assignment is used, as long as they're unique.
parameter A=0, B=1;
reg state;		// Ensure state and next are big enough to hold the state encoding.
reg next;

// A finite state machine is usually coded in three parts:
//   State transition logic
//   State flip-flops
//   Output logic
// It is sometimes possible to combine one or more of these blobs of code
// together, but be careful: Some blobs are combinational circuits, while some
// are clocked (DFFs).
```

• 状态跳转逻辑
• 状态触发器实现
• 输出逻辑

```    // Combinational always block for state transition logic. Given the current state and inputs,
// what should be next state be?
// Combinational always block: Use blocking assignments.
always@(*) begin
case (state)
A: next = in ? A : B;
B: next = in ? B : A;
endcase
end
```

```    // Edge-triggered always block (DFFs) for state flip-flops. Asynchronous reset.
always @(posedge clk, posedge areset) begin
if (areset) state <= B;		// Reset to state B
else state <= next;			// Otherwise, cause the state to transition
end
```

```	// Combinational output logic. In this problem, an assign statement is the simplest.
// In more complex circuits, a combinational always block may be more suitable.
assign out = (state==B);
```

Problem 119 Simple FSM1 / Fsm1s

0 条评论

• ### HDLBits：在线学习 Verilog （十四 · Problem 65-69）

本题中需要实现一个 2 进制 1bit 加法器，加法器将输入的两个 1bit 数相加，产生两数相加之和以及进位。

• ### HDLBits：在线学习 Verilog （十二 · Problem 55 - 59）

假设你正在设计一个电路来控制手机的振铃器和振动电机。当手机来电时(input ring)，电路必须把震动( output motor = 1 )或响铃( out...

• ### HDLBits：在线学习 Verilog （二十 · Problem 95 - 99）

在一个8bit的变量中，从一个周期到另一个周期期间，检测输入信号变化。即上升沿变化或下降沿变化。输出应在0变为1后产生。

• ### HDLBits：在线学习 Verilog （二十二 · Problem 105 - 109）

用计数器设计一个带am/pm的12小时时钟。该计数器通过一个CLK进行计时，用ena使能信号来驱动时钟的递增。

• ### HDLBits：在线学习 Verilog （二十一 · Problem 100 - 104）

设计一个0～9的计数器，共10个周期。该计数器采用同步复位且复位为0。但是本题是希望该计数器并不是随着clk的变化而递增，而是随着一个slowena使能信号来控...

• ### HDLBits：在线学习 Verilog （二十三 · Problem 110-114）

相比于上一题 5-bit 线性移位寄存器，本题原理上相同，但作者希望我们结合实际的板子（DE1-SoC，可能是一个教学板）和其外部接口（KEY&LED），实现一...

• ### HDLBits：在线学习 Verilog （二十七 · Problem 130-134）

前面Problem 125 Simple one-hot state transtion 3应该已经介绍过独热one-hot编码方式。这是一种生成逻辑最为简单的...

• ### HDLBits：在线学习 Verilog （二十八 · Problem 135-139）

Problem 135 PS/2 packet parser and datapath / Fsm ps2data

• ### HDLBits：在线学习 Verilog （二十九 · Problem 140-144）

Problem 140 Serial two's complementer (Mealy FSM)

• ### HDLBits：在线学习 Verilog （四 · Problem 15-19）

Problem 15 : Vector concatenation operator

• ### HDLBits：在线学习 Verilog （一 · Problem 0-9）

本文是系列文章的第一篇，讨论下前十道习题和解答，HDLBits 共有约 180 题。Step one - HDLBits

• ### HDLBits：在线学习 Verilog （十 · Problem 45 - 49）

解析：如上图所示， 一个异或门，一个同或门，我声明一个wire型的temp来存放同或门的输出。

• ### HDLBits：在线学习 Verilog （二 · Problem 10-14）

什么是 Verilog 中的向量（vector）？向量是一组 wire 信号的集合，通过赋予这一组信号的集合一个名称，以便于访问其中的 wire 信号。

• ### HDLBits：在线学习 Verilog （十一 · Problem 50 - 54）

在前面的练习中，我们使用简单的逻辑门和多个逻辑门的组合。这些电路是组合电路的例子。组合意味着电路的输出只是其输入的函数（在数学意义上）。这意味着对于任何给定的输...

• ### HDLBits：在线学习 Verilog （十三 · Problem 60-64）

Problem 60 : 2-to-1 multiplexer (Mux2to1)

• ### HDLBits：在线学习 Verilog （十五 · Problem 70 - 74）

题目要求我们创建一个100bit的二进制的加法器，该电路共包含两个100bit的输入和一个cin， 输出产生sum和cout。

• ### HDLBits：在线学习 Verilog （十六 · Problem 75 - 79）

一个4输入a, b, c, d和一输出的逻辑电路，当输入为2， 7或15时，输出为1， 当输入为0, 1, 4, 5, 6, 9, 10, 13, 或 14 时...

• ### HDLBits：在线学习 Verilog （十七 · Problem 80-84）

接下来的题目是属于触发器，锁存器的专题。我们会从用 Verilog 实现基础 D 触发器开始，学习触发器这一数字电路中最重要的电路之一。

• ### HDLBits：在线学习 Verilog （十八 · Problem 85-89）

Problem 85 : DFF with byte enable(Dff16e)