首先分析 Lfsr5
首先要理解什么是抽头点(tap),注意到图中有两个触发器的输入为前级输出与q[0]的异或,这些位置被称为 tap position.通过观察上图,所谓抽头点指的就是第5个,第3个寄存器的输入经过了异或逻辑。
那么回到本题就是第 32,22,2,1 个寄存器的输入经过异或逻辑,也可以推断出这些寄存器的跳变逻辑。
- q[21] <= q[22]^q[0]
- q[1] <= q[2]^q[0]
- q[0] <= q[1]^q[0]
q[31]则比较特殊,其为输入端,异或门的一端固定为低电平,所以相当于输入q[0]本身。
可以看出此题就是一个移位寄存器,只不过某些输入不是上一级触发器的输出,而是有可能和其他级的输出进行了异或作为当前的输入。
普通的循环右移寄存器:q <= {q[0],q[31:1]}; 然后将其中有异或逻辑参与的比特替换即可。
q <= {q[0],q[31-:9],q[22]^q[0],q[21:3],q[2]^q[0],q[1]^q[0]};
q[31-:9] 这个语法表示从 q[31] 开始的 9 个 bit 。
或者写:q[31:31-9+1],[5:3]是[3],[4],[5]三个bit。所以第22个寄存器所在位为 【21】。
位30 至 21 为9.所以 可写为 q[31 : 23 ], q[21] 替换为q[22]^q[0],,q[20]~q[2] 有19个bit,所以
对应为q[21:21-19+1] , q[21:3].
module top_module(
input clk,
input reset, // Active-high synchronous reset to 32'h1
output [31:0] q
);
reg [31:0] qq;
always @(*)begin
//qq<= q>>1;
qq <= {q[0],q[31:1]};
qq[31] <= q[0];
qq[21] <= q[22]^q[0];
qq[1] <= q[2]^q[0];
qq[0] <= q[1]^q[0];
end
always @(posedge clk)begin
if(reset)
q <= 32'h1;
else
q <= qq;
end
endmodule
Lfsr5 此题为 q<= {q[0],q[4],q[3]^q[0],q[2],q[1]};