我对Verilog相对缺乏经验,对LFSR结构也很陌生。我想要完成的事情如下......
如果我有一个5字节的数组,这意味着最大排列为5!或120.我希望能做的是, 有办法快速返回此数组的任何排列。如果我将数组初始化为(0,1,2,3,4),那么对于这个5深的数组, 置换0产生数组(1,2,3,4,0)。置换40产生阵列(4,0,3,2,1)等
所以我认为LFSR是实现这一目标的最快捷方式,我理解它们是如何工作的,但我无法完全理解 应该使用什么水龙头或如何获得特定的排列。
reg [4:0] vals;
wire feedback
assign feedback = vals[0] ^ vals[1] ^ vals[2] ^ vals[3] ^ vals[4];
always@(posedge clk or negedge reset) begin
if (reset==1'b0) begin
vals[4:0]<=5'hF; //reset condition first
end
else begin
vals[0]<=feedback;
vals[1]<=vals[0];
vals[2]<=vals[1];
vals[3]<=vals[2];
vals[4]<=vals[3];
end
显然反馈不起作用!我只是试图让整个comtext直接在我脑中。我该如何做到这一点 排列?根据阵列的大小需要多少次点击?非常感谢任何帮助!
答案 0 :(得分:1)
你在这里要求的是没有意义的。除非你已经做了一些重要的见解并且没有明确表达,否则我认为没有办法使用LFSR来生成排列。正确配置的LFSR将生成最大长度的输出位序列(通过循环通过除一个可能的内部状态之外的所有状态),但该序列与排列没有明显的关系。 (状态数肯定不匹配; LFSR有2^n - 1
个状态,但排列有n!
个状态。)
回顾关于排列生成的数学文献(例如,来自计算机编程艺术的Knuth的“Generating All Permutations”)可能在这里有用。
答案 1 :(得分:0)
我写了一篇可能有用的Q&A style on implementing an LFSR。特别是关于选择分接点的部分。
根据我的经验,当不需要高级密码时,LFSR用于硬件随机序列或抖动,它们只是白噪声源。
由于它们用于随机性,它们将不断重复相同的序列,但不是为了按需提供比特y。虽然你可以提供64个正时钟边沿来获得第64位(序列)。