Secuencia de bits aleatoria usando Verilog

4

Quiero generar una secuencia de bits aleatoria usando Verilog. es decir, la secuencia aleatoria de bits estaría compuesta de 1 y 0. ¿Puede alguien guiarme sobre cómo hacerlo? ¿Existe algo equivalente a rand () en C / C ++ en Verilog?

Actualización-1: FPGA es Spartan 3E Starter Kit

    
pregunta Neel Mehta

6 respuestas

7

Probablemente quieras algo como el circuito que muestra clabacchio.

Esto se procesa fácilmente en Verilog como

reg [4:0] d;
always @(posedge clk) begin
    d <= { d[3:0], d[4] ^ d[3] };
end

Esto es, como han mencionado otros, un registro de desplazamiento de retroalimentación lineal , o LFSR, y genera la longitud máxima secuencia de bits pseudoaleatoria que se puede producir con una Máquina de estado de 5 bits. La máquina de estado atraviesa 31 estados (\ $ 2 ^ n-1 \ $, donde n es el número de registros) antes de repetirse.

De todos los estados que pueden estar codificados por 5 registros, solo uno no se usa, que es el estado de todo-0. El estado del todo-0 es un estado de bloqueo --- si la máquina de estado entra en ese estado por un error, se quedará atascado permanentemente en el estado del todo-0, como puede ver porque 0 ^ 0 = 0. significa que tiene que estar seguro (utilizando una directiva de síntesis en el archivo Verilog o de restricciones) de que los registros no se inicializan al estado de todo-0.

Si necesita que el estado del todo-0 no se bloquee, puede utilizar un XNOR en lugar de la puerta XOR, y obtener una secuencia que incluya el estado del todo-0 y se bloquee en el estado del todo-1.

También tenga en cuenta que la serie más larga de 1 producida por esta máquina de estado es 5 en una fila, y la serie más larga de 0 es 4 en una fila. Esto puede ser importante si está utilizando la PRBS para probar un sistema con acoplamiento de CA ... las ejecuciones más largas harán que el sistema haga más hincapié.

En las pruebas de comunicaciones, las secuencias más largas son más comunes, principalmente para ejercitar más el comportamiento de baja frecuencia del sistema:

PRBS7

reg [6:0] d;
always @(posedge clk) begin
    d <= { d[5:0], d[6] ^ d[5] };
end

PRBS23

reg [22:0] d;
always @(posedge clk) begin
    d <= { d[22:0], d[22] ^ d[17] };
end

PRBS31

reg [30:0] d;
always @(posedge clk) begin
    d <= { d[30:0], d[30] ^ d[27] };
end

Observe que no siempre son los "últimos" registros los que se "giran" para generar el bit entrante del registro de desplazamiento.

nota de la aplicación Xilinx XAPP052 ofrece una tabla práctica de conexiones para usar para generar cualquier tamaño PRBS de 3 a 168 registros.

Nota de la aplicación XAPP211 muestra cómo implementarlas de manera eficiente en los dispositivos Xilinx. Esencialmente, se puede usar una sola tabla de consulta en un solo bloque lógico para implementar hasta 32 registros de registros de desplazamiento (según la arquitectura).

Los LFSR también se pueden usar para implementar un contador de manera eficiente si no le importan los estados intermedios, cuánto tiempo lleva la cuenta regresiva hasta un valor terminal.

    
respondido por el The Photon
3

La forma estándar de generar secuencias pseudoaleatorias con lógica digital es mediante un registro de cambio de retroalimentación lineal.

ver, por ejemplo, Wikipedia "Registro de desplazamiento de retroalimentación lineal"

Si necesitas una secuencia aleatoria real , necesitas algún elemento no determinista, por ejemplo. una fuente de ruido. Es decir. No puedes hacerlo solo con lógica estándar.

    
respondido por el Curd
2

Si la salida pseudoaleatoria de un registro de retroalimentación lineal es aceptable para su aplicación, entonces recomiendo usar el generador de núcleo Xilinx. Viene gratis con Xilinx ISE (¡incluso el paquete web!)

enlace

CoreGen tiene un montón de plantillas para crear bloques lógicos digitales. Uno de ellos es el LFSR. CoreGen le permitirá especificar varios parámetros (tipo, tamaño, restablecimiento, habilitación, etc.). También le permite generar salidas VHDL o Verilog.

Tenga en cuenta que LFSR puede implementarse de manera muy eficiente en un FPGA Xilinx utilizando una implementación SRL16, que CoreGen puede hacer.

    
respondido por el ajs410
2

Si puede conformarse con números pseudoaleatorios (es decir, cambian todo el tiempo pero la secuencia es repetible desde un punto de inicio dado), puede optar por un generador pseudoaleatorio basado en el registro de desplazamiento (enlace en la imagen) :

Consulte también esta alternativa página

Puede ampliarlo a la cantidad de bits que necesita en la salida, pero asegúrese de que el XOR "mezcle" los bits para que no caiga en un bucle con un número limitado de secuencias de salida diferentes.

Aquí hay una herramienta para generar CRC (¿Código de redundancia cíclica?) en VHDL y Verilog, y también se analiza aquí

    
respondido por el clabacchio
1

Sí, quieres la llamada $ random. Por ejemplo, las Preguntas frecuentes sobre Verilog dicen:

  

P: ¿Existe una función en verilog para generar números aleatorios?

     

Sí. Eso   es $ aleatorio (semilla). La semilla es opcional. La secuencia de números al azar para   una semilla dada (o ninguna semilla) siempre será la misma. Donde b > 0, el   expresión ($ random% b) da un número en el siguiente rango:   [(-b + 1) :( b-1)].

    
respondido por el Brian Carlton
1

Hay una muy buena presentación sobre la generación de números aleatorios aquí . Pasa por varias implementaciones y describe cómo funcionan. Esencialmente se trata de un par de contadores de anillos de carreras. También hay un artículo que describe y compara varias técnicas de generación de números aleatorios para los FPGA aquí , aunque Es más académico.

    
respondido por el akohlsmith

Lea otras preguntas en las etiquetas