只使用一个八位寄存器,用verilog设计一个伪随机序列发生器,采用的生成多项式为1+x^3+X^7。要求具有一个RESET端和两个控制端来调整寄存器初值(程序中设定好四种非零初值可选),给出testbunch,手动改变控制端值能改变寄存器初值并继续运行
时间: 2024-05-13 07:17:10 浏览: 10
下面是使用Verilog描述的伪随机序列发生器的代码:
```verilog
module pseudo_random_generator(
input clk, rst_n, control_1, control_2,
output reg [7:0] rand_out
);
reg [7:0] shift_reg;
parameter [3:0] initial_values [4] = '{8'h01, 8'h7E, 8'hAA, 8'hFF};
always @(posedge clk or negedge rst_n) begin
if (~rst_n) begin
shift_reg <= initial_values[0];
rand_out <= shift_reg[0];
end else begin
if (control_1) begin
shift_reg <= initial_values[1];
rand_out <= shift_reg[0];
end else if (control_2) begin
shift_reg <= initial_values[2];
rand_out <= shift_reg[0];
end else begin
shift_reg <= {shift_reg[6:0], shift_reg[0] ^ shift_reg[3] ^ shift_reg[7]};
rand_out <= shift_reg[0];
end
end
end
endmodule
```
该模块接受一个时钟信号 `clk`,一个低电平有效的复位信号 `rst_n`,以及两个控制信号 `control_1` 和 `control_2`。在 `rst_n` 为低电平时,寄存器初值被设置为 `initial_values[0]`,并将 `rand_out` 的值设置为 `shift_reg[0]`。在 `rst_n` 为高电平时,如果 `control_1` 为高电平,则将寄存器初值设置为 `initial_values[1]`,如果 `control_2` 为高电平,则将寄存器初值设置为 `initial_values[2]`,否则执行伪随机序列生成算法,并将 `rand_out` 的值设置为当前寄存器的最低位。
我们可以通过以下测试用例来验证该模块的功能:
```verilog
module testbench;
reg clk, rst_n, control_1, control_2;
wire [7:0] rand_out;
pseudo_random_generator dut (
.clk(clk), .rst_n(rst_n), .control_1(control_1), .control_2(control_2),
.rand_out(rand_out)
);
initial begin
clk = 0;
forever #5 clk = ~clk;
end
initial begin
rst_n = 0;
#10 rst_n = 1;
end
initial begin
control_1 = 0;
control_2 = 0;
#50 control_1 = 1;
#100 control_1 = 0;
#50 control_2 = 1;
#100 control_2 = 0;
#50 control_1 = 1;
#100 control_1 = 0;
#50 control_2 = 1;
#100 control_2 = 0;
#200 $finish;
end
endmodule
```
该测试用例首先定义了时钟信号 `clk`、复位信号 `rst_n`、控制信号 `control_1` 和 `control_2`,并将它们连接到被测试的模块中。然后使用 `forever` 循环生成一个时钟信号,并在初始化阶段将复位信号 `rst_n` 设为低电平,10个时钟周期后再将其设为高电平。接下来,通过改变控制信号的值来设置不同的寄存器初值,并检查伪随机序列的输出是否符合预期。最后等待一段时间后结束仿真。
在仿真的过程中,我们可以通过修改控制信号的值来改变寄存器的初值,从而验证模块的可配置性和正确性。