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

标签 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

显然反馈是行不通的!我只是想把整个内容直接记在脑子里。我怎样才能让它达到一定程度 排列?根据阵列的大小需要多少个抽头?非常感谢任何帮助!

最佳答案

您在这里要求的内容没有意义。除非您已经有了一些重要的见解但尚未阐明,否则我认为没有任何方法可以使用 LFSR 来生成排列。正确配置的 LFSR 将生成最大长度的输出位序列(通过循环遍历除其中一个可能的内部状态之外的所有状态),但该序列与排列没有明显的关系。 (状态数量当然根本不匹配;LFSR 有 2^n - 1 状态,但排列有 n! 状态。)

回顾有关排列生成的数学文献(例如,计算机编程艺术中 Knuth 的“Generating All Permutations”)在这里可能会有一些用处。

关于permutation - 如何在 Verilog 中使用 LFSR 进行排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20822199/

相关文章:

algorithm - 关于循环排列

C# 货币排列

verilog - 参数警告 : truncated value with size 32 to match size of target

verilog - 如何生成异步复位verilog总是阻塞凿子

random - 在systemverilog中使用随机随机1位和2位错误

python - 自定义排列,对等分布

java - 堆的算法

python - 生成列表的随机排列

verilog - 括号在用于包裹参数时有什么特殊意义吗?

verilog - FPGA 上的 2 位 BCD 计数器