2. Pregunta de respuesta corta 1 ¿Cuáles son las características del uso del lenguaje VHDL para diseñar un sistema digital? 2. Explique cómo FPGA implementa sus funciones lógicas a través de tablas de búsqueda.
Puntos básicos del diseño del sistema VHDL:
(1) En comparación con otros lenguajes de descripción de hardware, VHDL tiene las siguientes características:
(2) Potente, flexible diseño.
(3) Fuertes capacidades de descripción del hardware del sistema.
(4) Fácil de disfrutar y reutilizar.
2. Dé un ejemplo de cómo FPGA implementa sus funciones lógicas a través de tablas de búsqueda.
Respuesta de referencia: En informática, las tablas de búsqueda se utilizan para reemplazar estructuras de datos como matrices o matrices asociativas calculadas en tiempo de ejecución con operaciones de consulta simples. Debido a que la recuperación de valores de la memoria suele ser mucho más rápida que los cálculos complejos, la ganancia de velocidad obtenida de esta manera es significativa.
Un ejemplo clásico es la mesa triangular. En algunas aplicaciones, la cantidad de valores de seno necesarios para cada cálculo puede resultar inasequible. Para evitar esto, la aplicación puede calcular el seno de un número determinado de ángulos al principio, por ejemplo, calculando el seno de cada ángulo entero. Cuando se necesita el valor del seno más adelante en el programa, se usa una tabla de búsqueda para extraer el valor del seno del ángulo adyacente de la memoria en lugar de usar una fórmula matemática para calcularlo.
Antes de la llegada de las computadoras, la gente usaba tablas similares para acelerar los cálculos manuales. Las tablas muy populares incluyen funciones trigonométricas, logarítmicas y de densidad estadística. Otra herramienta utilizada para acelerar los cálculos manuales es la regla de cálculo.
Algún compromiso es utilizar tablas de búsqueda e interpolación, lo que requiere un pequeño cálculo. Este enfoque puede proporcionar una mayor precisión para la porción entre dos valores precalculados, lo que aumenta ligeramente el esfuerzo computacional pero mejora en gran medida la precisión requerida para la aplicación. Este método también reduce el tamaño de la tabla de búsqueda en función de valores precalculados.
En el procesamiento de imágenes, una tabla de búsqueda a menudo se denomina lut, y asocia un número de índice con un valor de salida. Como LUT común, se utiliza una tabla de colores para determinar el color y la intensidad de una imagen específica que se mostrará.
Otra cosa a tener en cuenta es que, aunque las tablas de búsqueda suelen ser eficientes, si el cálculo de reemplazo es muy simple, la ganancia supera la ganancia, no solo porque lleva más tiempo recuperar el resultado de la memoria, sino también porque el cálculo de reemplazo es muy simple porque aumenta la memoria requerida y corrompe el caché. Si la tabla de búsqueda es demasiado grande, casi todos los accesos a la tabla de búsqueda invertirán una pérdida de caché, lo que se convierte en un problema cada vez mayor cuando la velocidad del procesador excede la velocidad de la memoria. Surgen problemas similares durante la refactorización de optimizaciones del compilador. En algunos entornos, como el lenguaje de programación Java, el costo de una tabla de búsqueda puede ser mayor debido al proceso adicional de comparación y bifurcación para cada búsqueda causado por la verificación de límites forzados.
Existen dos limitaciones básicas sobre cuándo crear una tabla de búsqueda. Uno es la cantidad de memoria disponible; aunque se pueden crear tablas de búsqueda basadas en disco a expensas de la velocidad de búsqueda, no se pueden crear tablas que excedan el espacio de memoria disponible. Otra restricción es el tiempo inicial para calcular la tabla de búsqueda; aunque este trabajo no necesita realizarse con frecuencia, si el tiempo que lleva es inaceptable, no es adecuado utilizar una tabla de búsqueda.
[Editar este párrafo]
Ejemplos
[Editar este párrafo]
Cálculo de valores sinusoidales
Muchos Las computadoras solo pueden realizar operaciones aritméticas básicas y no pueden calcular directamente el seno de un valor determinado. Utilizan fórmulas complejas como la serie de Taylor para calcular los valores de los senos con una precisión considerable:
(x está cerca de 0)
Sin embargo, este tipo de cálculos pueden resultar muy costosos, especialmente en procesadores lentos. Hay muchas aplicaciones, especialmente los gráficos por computadora tradicionales, que requieren miles de cálculos sinusoidales por segundo. Una solución común es calcular primero el seno de muchos valores distribuidos uniformemente y luego buscar en una tabla el seno más cercano al x deseado, que está muy cerca del valor correcto ya que la función seno es una función continua con finito. tasa de cambio.
Por ejemplo:
Matriz real sine_table[-1000..1000]
Para x de -1000 a 1000
Sine_table[x] := Sine(x /1000/pi)
Función lookup_sine(x)
retorno sine _ table[round(x/1000/pi)]
Imagen: ejemplo de interpolación lineal .png
Interpolación lineal de funciones seno parciales Desafortunadamente, la tabla de búsqueda requiere algo de espacio: si se utilizan números de coma flotante de doble precisión IEEE, se necesitarán 16000 bytes. Si se utilizan menos puntos de muestreo, la precisión se reducirá significativamente. Una mejor solución es la interpolación lineal. En la tabla, se conecta una línea recta entre los valores de los dos puntos en los lados izquierdo y derecho del punto a calcular. El valor en la línea recta correspondiente a este punto es el valor del seno del punto calculado. Este método también es muy rápido y tiene mayor precisión para funciones suaves como las funciones sinusoidales. El siguiente es un ejemplo que utiliza la interpolación lineal:
Función lookup_sine(x)
x1 := límite inferior (x/1000/pi)
y1 := sine_table [x1]
y2:= sine _ table[x 1+1]
Devuelve y 1+(y2-y 1)*(x/1000/pi-x 1 )
Al utilizar la interpolación, puede beneficiarse del muestreo no uniforme, lo que significa utilizar menos puntos de muestreo en lugares cercanos a líneas rectas y más puntos de muestreo en lugares que cambian rápidamente para maximizar la aproximación real. Consulte Interpolación para obtener más información.
[Editar este párrafo]
Calcula el número de dígitos en 1
Función de población. Por ejemplo, la forma binaria del número 37 es 100101, entonces. contiene un valor establecido en 1 de tres. Un programa sencillo en lenguaje C para contar el número de unos en un entero de 32 bits es:
int count_ones(entero sin signo x) {
int i, resultado = 0; p>
for(I = 0;i<32;i++) {
resultado += x & 1;
x = x & gt& gt1;
}
Devuelve resultados;
}
Desafortunadamente, este algoritmo simple requiere cientos de ciclos de reloj para completarse en las arquitecturas modernas, porque causa muchas bifurcaciones y bucles. , la velocidad de ramificación es muy lenta. Esto se puede mejorar utilizando el desenrollado de bucles y otras técnicas inteligentes, pero la solución más sencilla y rápida es una tabla de búsqueda: simplemente cree una tabla con 256 entradas, que contenga 1 valor posible para cada byte. Luego use esta tabla para encontrar el número 1 contenido en cada byte de un número entero y sume los resultados. Sin ramas, cuatro accesos a la memoria y casi sin operaciones aritméticas, lo que puede mejorar enormemente la velocidad en comparación con el algoritmo anterior.
int count_ones(entero sin signo x) {
Devuelve bits_set[x&255]+bits_set[(x>>8)&255]
+bits_set [(x>>16);255]+bits_set[(x>>24)&255];
}
[Editar este párrafo]
Hardware tabla de búsqueda
En lógica digital, se puede implementar una tabla de búsqueda de N bits usando un multiplexor, su línea de selección es la entrada de la LUT y su entrada es una constante. LUT de N bits puede codificar cualquier entrada de N bits modelando una función lógica booleana como una tabla de verdad, que es una forma eficaz de codificar funciones lógicas booleanas. Los LUT de 4 bits son en realidad un elemento básico de los FPGA modernos.