大家好,又见面了,我是你们的朋友全栈君。
module top_module(
input clk,
input resetn,
input in,
output out
);
reg [3:0] q;
always @(posedge clk) begin
if (resetn == 1'b0) begin
q <= 4'd0;
end
else begin
q <= {
in,q[3:1]};//右移
end
end
assign out = q[0];
endmodule
module top_module(
input clk,
input load,
input ena,
input [1:0] amount,
input [63:0] data,
output reg [63:0]q
);
always @(posedge clk ) begin
if (load) begin
q <= data;
end
else if (ena) begin
case(amount)
2'b00:q <= q<<1; //左移一位
2'b01:q <= q<<8; //左移八位
2'b10:begin //右移一位
if(q[63] == 0)begin
q <= q>>1;
end
else begin
q <= {
1'b1,q[63:1]};
end
end
2'b11:begin //右移八位
if(q[63] == 0)begin
q <= q >> 8;
end
else begin
q <= {
8'b1111_1111,q[63:8]};
end
end
endcase
end
end
endmodule
LFSR用于产生可重复的伪随机序列PRBS,。如图所示。其中gn为反馈系数,取值只能为0或1,取为0时表明不存在该反馈之路,取为1时表明存在该反馈之路;这里的反馈系数决定了产生随机数的算法的不同。
伽罗瓦LFSR是一到多型的LFSR,即最后一个触发器的输出 与抽头序列对应位置触发器前一级触发器的输出 相异或逻辑来驱动多个抽头序列对应位置触发器的输入,如下图所示。
Galois LFSR:其中抽头的位置与输出位异或,以产生其下一个值。如果仔细选择抽头位置,则LFSR可以设置为“最大长度”。n位的最大长度LFSR有2n-1个状态(永远不会达到全零状态)。
module top_module(
input clk,
input reset,
output reg [31:0]q
);
reg [31:0] q_next;
integer i;
always @(*) begin
for(i = 0;i<32;i++)begin
if(i == 0 ||i == 1||i == 21)begin
q_next[i] <= q[i+1] ^ q[0];
end
else if (i == 31) begin
q_next[i] <= 1'b0 ^ q[0];
end
else begin
q_next[i] <= q[i+1];
end
end
end
always @(posedge clk) begin
if (reset) begin
q <= 32'h1;
end
else begin
q <= q_next;
end
end
endmodule
斐波那契LFSR也可以称为多到一型LFSR,即抽头序列对应bit位置的多个触发器的输出通过异或逻辑来驱动一个触发器的输入。如下图所示。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/160245.html原文链接:https://javaforall.cn