# Homework5
> 資工二1 黃柏芸
> 指導老師:林宏益
### 實驗目的:
請設計Pseudo Random Pattern Generator具有同步正準位設定的功能,當設定時,輸出為1102 ,並撰寫testbench,產生僞隨機數的方法最常見的是利用一種線性反饋移位寄存器(LFSR)
1) Design a Pseudo Random Pattern Generator
1.1) A linear feedback shift Register (LFSR)
1.2) Feedback equation X3+X+1
1.3) Random sequence 1、3、7、6、5、2、4 、1……( without 0)
1.4) For N stage, LFSR can generate 2N-1 sequence ( i.e., 1~ 2N-1)
2) This LFSR with positive Synchronous set, when the set is activate,
the output of LFSR is (110)2
### 程式碼:
>design部分
```verilog=
`timescale 1ns / 100ps
module LFSR #(parameter NUM_BITS=3)
(
input i_Clk,
input i_Enable,
input i_Seed_DV,
input [32:0] i_Seed_Data,
output [32:0] o_LFSR_Data,
output o_LFSR_Done
);
reg [32:1] r_LFSR = 0;
reg r_XNOR;
always @(posedge i_Clk)
begin
if (i_Enable == 1'b1)
begin
if (i_Seed_DV == 1'b1)
r_LFSR <= i_Seed_Data;
else
r_LFSR <= {r_LFSR[NUM_BITS-1:1], r_XNOR};
end
end
always @(*)
begin
case (NUM_BITS)
3: begin
r_XNOR = r_LFSR[3] ^~ r_LFSR[2];
end
4: begin
r_XNOR = r_LFSR[4] ^~ r_LFSR[3];
end
5: begin
r_XNOR = r_LFSR[4] ^~ r_LFSR[3];
end
6: begin
r_XNOR = r_LFSR[6] ^~ r_LFSR[5];
end
7: begin
r_XNOR = r_LFSR[7] ^~ r_LFSR[6];
end
8: begin
r_XNOR = r_LFSR[8] ^~ r_LFSR[6] ^~ r_LFSR[5] ^~ r_LFSR[4];
end
9: begin
r_XNOR = r_LFSR[9] ^~ r_LFSR[5];
end
10: begin
r_XNOR = r_LFSR[10] ^~ r_LFSR[7];
end
11: begin
r_XNOR = r_LFSR[11] ^~ r_LFSR[9];
end
12: begin
r_XNOR = r_LFSR[12] ^~ r_LFSR[6] ^~ r_LFSR[4] ^~ r_LFSR[1];
end
13: begin
r_XNOR = r_LFSR[13] ^~ r_LFSR[4] ^~ r_LFSR[3] ^~ r_LFSR[1];
end
14: begin
r_XNOR = r_LFSR[14] ^~ r_LFSR[5] ^~ r_LFSR[3] ^~ r_LFSR[1];
end
15: begin
r_XNOR = r_LFSR[15] ^~ r_LFSR[14];
end
16: begin
r_XNOR = r_LFSR[16] ^~ r_LFSR[15] ^~ r_LFSR[13] ^~ r_LFSR[4];
end
17: begin
r_XNOR = r_LFSR[17] ^~ r_LFSR[14];
end
18: begin
r_XNOR = r_LFSR[18] ^~ r_LFSR[11];
end
19: begin
r_XNOR = r_LFSR[19] ^~ r_LFSR[6] ^~ r_LFSR[2] ^~ r_LFSR[1];
end
20: begin
r_XNOR = r_LFSR[20] ^~ r_LFSR[17];
end
21: begin
r_XNOR = r_LFSR[21] ^~ r_LFSR[19];
end
22: begin
r_XNOR = r_LFSR[22] ^~ r_LFSR[21];
end
23: begin
r_XNOR = r_LFSR[23] ^~ r_LFSR[18];
end
24: begin
r_XNOR = r_LFSR[24] ^~ r_LFSR[23] ^~ r_LFSR[22] ^~ r_LFSR[17];
end
25: begin
r_XNOR = r_LFSR[25] ^~ r_LFSR[22];
end
26: begin
r_XNOR = r_LFSR[26] ^~ r_LFSR[6] ^~ r_LFSR[2] ^~ r_LFSR[1];
end
27: begin
r_XNOR = r_LFSR[27] ^~ r_LFSR[5] ^~ r_LFSR[2] ^~ r_LFSR[1];
end
28: begin
r_XNOR = r_LFSR[28] ^~ r_LFSR[25];
end
29: begin
r_XNOR = r_LFSR[29] ^~ r_LFSR[27];
end
30: begin
r_XNOR = r_LFSR[30] ^~ r_LFSR[6] ^~ r_LFSR[4] ^~ r_LFSR[1];
end
31: begin
r_XNOR = r_LFSR[31] ^~ r_LFSR[28];
end
32: begin
r_XNOR = r_LFSR[32] ^~ r_LFSR[22] ^~ r_LFSR[2] ^~ r_LFSR[1];
end
endcase
end
assign o_LFSR_Data = r_LFSR[NUM_BITS:1];
assign o_LFSR_Done = (r_LFSR[NUM_BITS:1] == i_Seed_Data) ? 1'b1 : 1'b0;
endmodule
```
>test bench部分
```verilog=
`timescale 1ns / 100ps
`define N_BITS 4
module tb_lfsr;
reg i_Clk;
reg i_Enable;
reg i_Seed_DV;
reg [32:0] i_Seed_Data;
wire [32:0] o_LFSR_Data;
wire o_LFSR_Done;
LFSR #(.NUM_BITS(`N_BITS)) dut(
.i_Clk(i_Clk),
.i_Enable(i_Enable),
.i_Seed_DV(i_Seed_DV),
.i_Seed_Data(i_Seed_Data),
.o_LFSR_Data(o_LFSR_Data),
.o_LFSR_Done(o_LFSR_Done));
always #10 i_Clk = ~i_Clk;
initial begin
i_Clk = 0;
i_Enable = 0;
i_Seed_DV = 0;
i_Seed_Data = 0;
#15;
i_Enable = 1;
i_Seed_DV = 1;
@(posedge i_Clk);
#5;
i_Seed_DV = 0;
end
endmodule
```
### 分析:
n個D觸發器最多可以提供2^n-1個狀態(不包括全0的狀態):所以3個D觸發器會有1、3、7、6、5、2、4 不段循環的7種狀態
### 心得:
因為Pseudo Random Pattern Generator是我第一次聽到、接觸到的東西,所以在網路上找了很多資料,且理解程式是一回事,實現出來又是一回事了,我得更加努力才行!
### github連結:
https://gist.github.com/BoyunHuang/fd4d8239120945d0e35dae1fdcaa1ccb