generar números aleatorios usando LFSR

1

Tengo que generar 2 números aleatorios de 5 bits y agregarlos usando un verilog estructural e implementarlo en FPGA. Tengo que diseñar LFSR con flip flops 5 D y el número pseudo aleatorio de 5 bits viene dado por las salidas de los flip-flops. Los 5 flip-flops están conectados en serie y el quinto flip-flop es xor-ed con el primero.

Este es el código que he escrito hasta ahora. Soy nuevo en verilog y conceptos eléctricos.

module dff (Q, D, Clock);
 output Q;
 input D;
 input reset;
 input Clock;

 reg Q;

 always @(posedge Clock)
 begin
   if (reset)
     Q = 1;
   else 
     Q = D;
 end
endmodule

module DFF_LFSR() ; 
 input D;
 input clk;
 input reset;
 output Q1, Q2, Q3, Q4, Q5;
 reg Q; 

 dff DFF1(Q1^Q5, D, reset, clk);
 dff DFF2(Q2, Q1, reset, clk);
 dff DFF3(Q3, Q2, reset, clk);
 dff DFF4(Q4, Q3, reset, clk);
 dff DFF5(Q5, Q4, reset, clk);
endmodule 
    
pregunta user3344978

2 respuestas

3

Con respecto a la idea general de usar LFSRs para generar números pseudoaleatorios:

Como diseñador digital, puedo decir que es bastante común ver que los LFSR se utilizan para generar números aleatorios de "baja calidad". Es un enfoque perfectamente aceptable para muchos diseños.

El mayor problema que veo con su enfoque fundamental es que desea un número aleatorio de 5 bits, pero solo está usando un LFSR de 5 bits. Ese diseño producirá valores que no son más aleatorios que un contador que cuenta de 1 a 31 y se repite; nunca verás el mismo valor dos veces sin ver primero todos los demás valores posibles.

El mejor enfoque sería crear un LFSR que sea mucho más ancho que 5 bits, y simplemente tome los 5 bits bajos como su valor "aleatorio".

En una nota lateral, Xilinx tiene una App Note que incluye una lista de toques para varios anchos de contadores LFSR de 3 a 168 bits.

    
respondido por el David Gardner
2

(Disculpe la respuesta en lugar de un comentario, todavía no tengo privilegios suficientes para un comentario).

Algunas notas que se agregan a las otras respuestas:

  • reset debe agregarse a la lista de puertos para dff
  • sería más convencional usar <= en lugar de = para la asignación de dff.
  • Como dijo greg, los pines de salida no se pueden conectar como una expresión

Además, es convencional conectar la salida final de nuevo a la entrada en lugar de tener una entrada D. Quieres algo como:

assign D = Q1 ^Q5;

También, la forma en que lo has codificado, todo se restablecerá a 0, y nada cambiará después de eso. Por lo tanto, también desea restablecer a un estado distinto de cero.

    
respondido por el sgauria

Lea otras preguntas en las etiquetas