En informática , un registro de desplazamiento de retroalimentación lineal ( LFSR ) es un registro de desplazamiento cuyo bit de entrada es una función lineal de su estado anterior.
La función lineal de bits individuales más utilizada es la función exclusiva-o (XOR). Por lo tanto, un LFSR suele ser un registro de desplazamiento cuyo bit de entrada está controlado por la función XOR de algunos bits del valor total del registro de desplazamiento.
El valor inicial del LFSR se denomina semilla y, como el funcionamiento del registro es determinista, el flujo de valores producido por el registro está completamente determinado por su estado actual (o anterior). Asimismo, como el registro tiene un número finito de estados posibles, eventualmente debe ingresar en un ciclo repetitivo. Sin embargo, un LFSR con una función de retroalimentación bien elegida puede producir una secuencia de bits que parezca aleatoria y tenga un ciclo muy largo .
Las aplicaciones de los LFSR incluyen la generación de números pseudoaleatorios , secuencias pseudorruido , contadores digitales rápidos y secuencias de blanqueamiento . Las implementaciones de LFSR tanto en hardware como en software son comunes.
Las matemáticas de una verificación de redundancia cíclica , que se utiliza para proporcionar una verificación rápida de errores de transmisión, están estrechamente relacionadas con las de un LFSR. [1] En general, la aritmética detrás de los LFSR los hace muy elegantes como un objeto para estudiar e implementar. Se pueden producir lógicas relativamente complejas con bloques de construcción simples. Sin embargo, también se deben considerar otros métodos, que son menos elegantes pero funcionan mejor.
Las posiciones de los bits que afectan al siguiente estado se denominan tomas . En el diagrama, las tomas son [16,14,13,11]. El bit más a la derecha del LFSR se denomina bit de salida, que siempre es también una toma. Para obtener el siguiente estado, los bits de la toma se combinan secuencialmente mediante XOR; luego, todos los bits se desplazan un lugar hacia la derecha, y se descarta el bit más a la derecha. El resultado de combinar los bits de la toma se devuelve al bit más a la izquierda, que ahora está vacío. Para obtener el flujo de salida pseudoaleatorio, lea el bit más a la derecha después de cada transición de estado.
La secuencia de números generada por un LFSR o su contraparte XNOR puede considerarse un sistema numérico binario tan válido como el código Gray o el código binario natural.
La disposición de las tomas para la retroalimentación en un LFSR se puede expresar en aritmética de campo finito como un polinomio módulo 2. Esto significa que los coeficientes del polinomio deben ser 1 o 0. Esto se denomina polinomio de retroalimentación o polinomio característico recíproco. Por ejemplo, si las tomas están en los bits 16, 14, 13 y 11 (como se muestra), el polinomio de retroalimentación es
El "uno" en el polinomio no corresponde a una toma, sino a la entrada del primer bit (es decir, x 0 , que es equivalente a 1). Las potencias de los términos representan los bits tomados, contando desde la izquierda. El primer y el último bit siempre están conectados como una toma de entrada y salida respectivamente.
La LFSR tiene una longitud máxima si y solo si el polinomio de retroalimentación correspondiente es primitivo sobre el campo de Galois GF(2). [3] [4] Esto significa que las siguientes condiciones son necesarias (pero no suficientes):
A continuación y en las referencias se proporcionan tablas de polinomios primitivos a partir de los cuales se pueden construir LFSR de longitud máxima.
Puede haber más de una secuencia de derivaciones de longitud máxima para una longitud de LFSR dada. Además, una vez que se ha encontrado una secuencia de derivaciones de longitud máxima, otra sigue automáticamente. Si la secuencia de derivaciones en un LFSR de n bits es [ n , A , B , C , 0] , donde el 0 corresponde al término x 0 = 1, entonces la secuencia "espejo" correspondiente es [ n , n − C , n − B , n − A , 0] . Por lo tanto, la secuencia de derivaciones [32, 22, 2, 1, 0] tiene como contraparte [32, 31, 30, 10, 0] . Ambas dan una secuencia de longitud máxima.
A continuación se muestra un ejemplo en C :
#include <stdint.h> unsigned lfsr_fib ( void ) { uint16_t start_state = 0xACE1u ; /* Cualquier estado de inicio distinto de cero funcionará. */ uint16_t lfsr = start_state ; uint16_t bit ; /* Debe ser de 16 bits para permitir el bit<<15 más adelante en el código */ unsigned period = 0 ; hacer { /* toques: 16 14 13 11; polinomio de retroalimentación: x^16 + x^14 + x^13 + x^11 + 1 */ bit = (( lfsr >> 0 ) ^ ( lfsr >> 2 ) ^ ( lfsr >> 3 ) ^ ( lfsr >> 5 )) & 1u ; lfsr = ( lfsr >> 1 ) | ( bit << 15 ); ++ período ; } while ( lfsr != estado_inicial ); periodo de retorno ; }
Si está disponible una operación de paridad rápida o de recuento de bits , el bit de retroalimentación se puede calcular de manera más eficiente como el producto escalar del registro con el polinomio característico:
bit = parity(lfsr & 0x002Du);
, o equivalentementebit = popcnt(lfsr & 0x002Du) /* & 1u */;
(Esto & 1u
convierte el popcnt en una verdadera función de paridad, pero el bitshift posterior bit << 15
hace que los bits superiores sean irrelevantes).Si está disponible una operación de rotación, el nuevo estado se puede calcular como
lfsr = rotateright((lfsr & ~1u) | (bit & 1u), 1);
, o equivalentementelfsr = rotateright(((bit ^ lfsr) & 1u) ^ lfsr, 1);
Esta configuración LFSR también se conoce como estándar , puertas XOR externas o de muchos a uno . La configuración Galois alternativa se describe en la siguiente sección.
Una implementación de ejemplo en Python de un LFSR de Fibonacci similar (tomas de 16 bits en [16,15,13,4]) sería
estado_inicial = 1 << 15 | 1 lfsr = estado_inicial periodo = 0mientras sea verdadero : # tomas: 16 15 13 4; polinomio de retroalimentación: x^16 + x^15 + x^13 + x^4 + 1 bit = ( lfsr ^ ( lfsr >> 1 ) ^ ( lfsr >> 3 ) ^ ( lfsr >> 12 )) & 1 lfsr = ( lfsr >> 1 ) | ( bit << 15 ) periodo += 1 si lfsr == estado_inicial : print ( periodo ) break
Donde se utiliza un registro de 16 bits y la toma xor en el cuarto, decimotercero, decimoquinto y decimosexto bit establece una longitud de secuencia máxima.
Un LFSR en configuración Galois, que recibe su nombre del matemático francés Évariste Galois , también conocido como modular , XOR interno o LFSR uno a muchos , es una estructura alternativa que puede generar el mismo flujo de salida que un LFSR convencional (pero desplazado en el tiempo). [5] En la configuración Galois, cuando el sistema está sincronizado, los bits que no son tomas se desplazan una posición a la derecha sin cambios. Las tomas, por otro lado, se combinan con el bit de salida antes de almacenarse en la siguiente posición. El nuevo bit de salida es el siguiente bit de entrada. El efecto de esto es que cuando el bit de salida es cero, todos los bits del registro se desplazan a la derecha sin cambios y el bit de entrada se convierte en cero. Cuando el bit de salida es uno, todos los bits en las posiciones de las tomas se invierten (si son 0, se convierten en 1, y si son 1, se convierten en 0), y luego todo el registro se desplaza a la derecha y el bit de entrada se convierte en 1.
Para generar el mismo flujo de salida, el orden de las tomas es el equivalente (ver arriba) del orden del LFSR convencional; de lo contrario, el flujo estará en sentido inverso. Tenga en cuenta que el estado interno del LFSR no es necesariamente el mismo. El registro de Galois que se muestra tiene el mismo flujo de salida que el registro de Fibonacci en la primera sección. Existe un desfase temporal entre los flujos, por lo que se necesitará un punto de inicio diferente para obtener la misma salida en cada ciclo.
A continuación se muestra un ejemplo de código C para el ejemplo LFSR de Galois de período máximo de 16 bits en la figura:
#include <stdint.h> unsigned lfsr_galois ( void ) { uint16_t start_state = 0xACE1u ; /* Cualquier estado de inicio distinto de cero funcionará. */ uint16_t lfsr = start_state ; unsigned period = 0 ; do { #ifndef LEFT unsigned lsb = lfsr & 1u ; /* Obtener LSB (es decir, el bit de salida). */ lfsr >>= 1 ; /* Registro de desplazamiento */ if ( lsb ) /* Si el bit de salida es 1, */ lfsr ^= 0xB400u ; /* aplicar máscara de alternancia. */ #else unsigned msb = ( int16_t ) lfsr < 0 ; /* Obtener MSB (es decir, el bit de salida). */ lfsr <<= 1 ; /* Registro de desplazamiento */ if ( msb ) /* Si el bit de salida es 1, */ lfsr ^= 0x002Du ; /* aplicar máscara de alternancia. */ #endif ++ period ; } while ( lfsr != start_state ); periodo de retorno ; }
La rama también se puede escribir como , lo que puede producir un código más eficiente en algunos compiladores. Además, la variante de desplazamiento a la izquierda puede producir un código incluso mejor, ya que el bit más significativo es el acarreo de la adición de a sí mismo.if (lsb) lfsr ^= 0xB400u;
lfsr ^= (-lsb) & 0xB400u;
lfsr
Los bits de estado y resultantes también se pueden combinar y calcular en paralelo. La siguiente función calcula los siguientes 64 bits utilizando el polinomio de 63 bits x⁶³ + x⁶² + 1:
#include <stdint.h> uint64_t prsg63 ( uint64_t lfsr ) { lfsr = lfsr << 32 | ( lfsr << 1 ^ lfsr << 2 ) >> 32 ; lfsr = lfsr << 32 | ( lfsr << 1 ^ lfsr << 2 ) >> 32 ; devolver lfsr ; }
Los LFSR binarios de Galois como los que se muestran arriba se pueden generalizar a cualquier alfabeto q -ario {0, 1, ..., q − 1} (por ejemplo, para binario, q = 2, y el alfabeto es simplemente {0, 1}). En este caso, el componente o exclusivo se generaliza a la suma módulo - q (nótese que XOR es suma módulo 2), y el bit de retroalimentación (bit de salida) se multiplica (módulo - q ) por un valor q -ario, que es constante para cada punto de toma específico. Nótese que esto también es una generalización del caso binario, donde la retroalimentación se multiplica por 0 (sin retroalimentación, es decir, sin toma) o 1 (hay retroalimentación). Dada una configuración de toma apropiada, tales LFSR se pueden usar para generar campos de Galois para valores primos arbitrarios de q .
Como lo demostró George Marsaglia [6] y lo analizó más a fondo Richard P. Brent [7] , los registros de desplazamiento con retroalimentación lineal se pueden implementar utilizando operaciones XOR y Shift. Este enfoque se presta a una ejecución rápida en software porque estas operaciones suelen asignarse de manera eficiente a las instrucciones de los procesadores modernos.
A continuación se muestra un ejemplo de código C para un LFSR Xorshift de período máximo de 16 bits que utiliza el triplete 7,9,13 de John Metcalf: [8]
#include <stdint.h> unsigned lfsr_xorshift ( void ) { uint16_t start_state = 0xACE1u ; /* Cualquier estado de inicio distinto de cero funcionará. */ uint16_t lfsr = start_state ; unsigned period = 0 ; hacer { // 7,9,13 triplete de http://www.retroprogramming.com/2017/07/xorshift-pseudorandom-numbers-in-z80.html lfsr ^= lfsr >> 7 ; lfsr ^= lfsr << 9 ; lfsr ^= lfsr >> 13 ; ++ período ; } mientras ( lfsr != estado_inicial ); periodo de retorno ; }
Los LFSR binarios de las configuraciones de Fibonacci y Galois se pueden expresar como funciones lineales utilizando matrices en (ver GF(2) ). [9] Utilizando la matriz compañera del polinomio característico del LFSR y denotando la semilla como un vector columna , el estado del registro en la configuración de Fibonacci después de los pasos se da por
La matriz para la forma de Galois correspondiente es:
Para una inicialización adecuada,
El coeficiente superior del vector columna:
da el término a k de la secuencia original.
Estas formas se generalizan naturalmente a campos arbitrarios.
La siguiente tabla enumera ejemplos de polinomios de retroalimentación de longitud máxima ( polinomios primitivos ) para longitudes de registro de desplazamiento de hasta 24. El formalismo para LFSR de longitud máxima fue desarrollado por Solomon W. Golomb en su libro de 1967. [10] El número de polinomios primitivos diferentes crece exponencialmente con la longitud del registro de desplazamiento y se puede calcular exactamente utilizando la función totient de Euler [11] (secuencia A011260 en la OEIS ).
Xilinx publicó una lista ampliada de contadores de toques de hasta 168 bits. Las tablas de polinomios de longitud máxima están disponibles en http://users.ece.cmu.edu/~koopman/lfsr/ y se pueden generar mediante el proyecto https://github.com/hayguen/mlpolygen.
Los LFSR se pueden implementar en hardware, lo que los hace útiles en aplicaciones que requieren una generación muy rápida de una secuencia pseudoaleatoria, como la radio de espectro ensanchado de secuencia directa . Los LFSR también se han utilizado para generar una aproximación de ruido blanco en varios generadores de sonido programables .
La secuencia repetitiva de estados de un LFSR permite que se lo utilice como divisor de reloj o como contador cuando una secuencia no binaria es aceptable, como suele ser el caso donde las ubicaciones de índice o encuadre de la computadora deben ser legibles por máquina. [12] Los contadores LFSR tienen una lógica de retroalimentación más simple que los contadores binarios naturales o los contadores de código Gray y, por lo tanto, pueden operar a velocidades de reloj más altas. Sin embargo, es necesario garantizar que el LFSR nunca entre en un estado de bloqueo (todos ceros para un LFSR basado en XOR y todos unos para un LFSR basado en XNOR), por ejemplo, preestableciéndolo en el inicio en cualquier otro estado en la secuencia. Es posible contar hacia arriba y hacia abajo con un LFSR. Los LFSR también se han utilizado como un contador de programa para CPU, esto requiere que el programa en sí esté "mezclado" y se hace para ahorrar en puertas cuando son una prima (usando menos puertas que un sumador) y para la velocidad (ya que un LFSR no requiere una cadena de acarreo larga).
La tabla de polinomios primitivos muestra cómo se pueden organizar las secuencias de polinomios de fase lineal en forma de Fibonacci o Galois para obtener períodos máximos. Se puede obtener cualquier otro período agregando a una secuencia de polinomios de fase lineal que tenga un período más largo alguna lógica que acorte la secuencia saltando algunos estados.
Los LFSR se han utilizado durante mucho tiempo como generadores de números pseudoaleatorios para su uso en cifrados de flujo , debido a la facilidad de construcción a partir de circuitos electromecánicos o electrónicos simples , períodos largos y flujos de salida distribuidos de manera muy uniforme . Sin embargo, un LFSR es un sistema lineal, lo que conduce a un criptoanálisis bastante fácil . Por ejemplo, dado un tramo de texto simple conocido y el texto cifrado correspondiente , un atacante puede interceptar y recuperar un tramo del flujo de salida del LFSR utilizado en el sistema descrito, y a partir de ese tramo del flujo de salida puede construir un LFSR de tamaño mínimo que simule el receptor previsto utilizando el algoritmo Berlekamp-Massey . A continuación, este LFSR puede alimentarse con el tramo interceptado del flujo de salida para recuperar el texto simple restante.
Se emplean tres métodos generales para reducir este problema en los cifrados de flujo basados en LFSR:
Entre los cifrados de flujo basados en LFSR más importantes se encuentran A5/1 y A5/2 , utilizados en teléfonos móviles GSM , E0 , utilizado en Bluetooth , y el generador de encogimiento . El cifrado A5/2 ha sido descifrado y tanto A5/1 como E0 presentan graves debilidades. [14] [15]
El registro de desplazamiento de retroalimentación lineal tiene una fuerte relación con los generadores congruenciales lineales . [16]
Los LFSR se utilizan en pruebas de circuitos para la generación de patrones de prueba (para pruebas exhaustivas, pruebas pseudoaleatorias o pruebas pseudoexhaustivas) y para el análisis de firmas.
Los LFSR completos se utilizan comúnmente como generadores de patrones para pruebas exhaustivas, ya que cubren todas las entradas posibles para un circuito de n entradas. Los LFSR de longitud máxima y los LFSR ponderados se utilizan ampliamente como generadores de patrones de prueba pseudoaleatorios para aplicaciones de prueba pseudoaleatorias.
En las técnicas de autoprueba incorporada (BIST), no es posible almacenar todas las salidas del circuito en el chip, pero la salida del circuito se puede comprimir para formar una firma que luego se comparará con la firma dorada (del circuito en buen estado) para detectar fallas. Dado que esta compresión tiene pérdidas, siempre existe la posibilidad de que una salida defectuosa también genere la misma firma que la firma dorada y las fallas no se puedan detectar. Esta condición se denomina enmascaramiento de errores o aliasing. BIST se logra con un registro de firma de múltiples entradas (MISR o MSR), que es un tipo de LFSR. Un LFSR estándar tiene una sola compuerta XOR o XNOR, donde la entrada de la compuerta está conectada a varias "tomas" y la salida está conectada a la entrada del primer flip-flop. Un MISR tiene la misma estructura, pero la entrada a cada flip-flop se alimenta a través de una compuerta XOR/XNOR. Por ejemplo, un MISR de 4 bits tiene una salida paralela de 4 bits y una entrada paralela de 4 bits. La entrada del primer flip-flop es XOR/XNORd con el bit de entrada paralelo cero y los "taps". Cada entrada de cada flip-flop es XOR/XNORd con la salida del flip-flop anterior y el bit de entrada paralelo correspondiente. En consecuencia, el siguiente estado del MISR depende de los últimos estados en lugar de solo del estado actual. Por lo tanto, un MISR siempre generará la misma firma dorada dado que la secuencia de entrada es la misma cada vez. Aplicaciones recientes [17] proponen flip-flops de restablecimiento de configuración como "taps" del LFSR. Esto permite que el sistema BIST optimice el almacenamiento, ya que los flip-flops de restablecimiento de configuración pueden guardar la semilla inicial para generar todo el flujo de bits del LFSR. Sin embargo, esto requiere cambios en la arquitectura de BIST y es una opción para aplicaciones específicas.
Para evitar que secuencias cortas repetidas (por ejemplo, series de 0 o 1) formen líneas espectrales que puedan complicar el seguimiento de símbolos en el receptor o interferir con otras transmisiones, la secuencia de bits de datos se combina con la salida de un registro de retroalimentación lineal antes de la modulación y la transmisión. Esta codificación se elimina en el receptor después de la demodulación. Cuando el LFSR se ejecuta a la misma velocidad de bits que el flujo de símbolos transmitido, esta técnica se denomina codificación . Cuando el LFSR se ejecuta considerablemente más rápido que el flujo de símbolos, la secuencia de bits generada por el LFSR se denomina código de chipping . El código de chipping se combina con los datos utilizando modulación exclusiva o antes de transmitir utilizando modulación por desplazamiento de fase binaria o un método de modulación similar. La señal resultante tiene un ancho de banda mayor que los datos y, por lo tanto, este es un método de comunicación de espectro ensanchado . Cuando se utiliza solo para la propiedad de espectro ensanchado, esta técnica se denomina espectro ensanchado de secuencia directa ; cuando se utiliza para distinguir varias señales transmitidas en el mismo canal al mismo tiempo y frecuencia, se denomina acceso múltiple por división de código .
Ninguno de estos esquemas debe confundirse con el cifrado o la codificación ; la codificación y la propagación con LFSR no protegen la información de las escuchas clandestinas. En cambio, se utilizan para producir flujos equivalentes que poseen propiedades de ingeniería convenientes para permitir una modulación y demodulación robustas y eficientes.
Sistemas de transmisión digital que utilizan registros de retroalimentación lineal:
Otros sistemas de comunicaciones digitales que utilizan LFSR:
Los LFSR también se utilizan en sistemas de interferencia de radio para generar ruido pseudoaleatorio que eleva el nivel de ruido de un sistema de comunicación objetivo.
La señal horaria alemana DCF77 , además de la modulación de amplitud, emplea modulación por desplazamiento de fase impulsada por un LFSR de 9 etapas para aumentar la precisión del tiempo recibido y la robustez del flujo de datos en presencia de ruido. [19]
{{cite book}}
: |journal=
ignorado ( ayuda )CS1 maint: location missing publisher (link)