如何在Verilog中使用LFSR进行排列

时间:2013-12-29 04:36:43

标签: permutation verilog

我对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直接在我脑中。我该如何做到这一点 排列?根据阵列的大小需要多少次点击?非常感谢任何帮助!

2 个答案:

答案 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位(序列)。