Estaba buscando una manera de calcular la raíz cuadrada de un número de 8 bits dado usando solo una combinación digital o lógica secuencial. ¿Es eso posible?
Una forma puede ser simplemente usar una tabla de búsqueda ya que no estoy considerando partes fraccionarias (así que ) pero tiene que haber una mejor manera que esta. ¿Alguien puede señalarme eso?
digital-logic
Rick_2047
fuente
fuente
Respuestas:
Las tablas de búsqueda se han mencionado en los comentarios. Hay dos enfoques.
Rápido
Cree una tabla de 256 bytes de longitud, con cada valor siguiente la raíz cuadrada del índice correspondiente. Esto es rápido ya que utiliza el argumento como índice para acceder directamente al valor correcto. El inconveniente es que necesita una tabla larga, con muchos valores duplicados.
Compacto
Como se dijo, un número entero de 8 bits solo puede tener valores de 0 a 255, y las raíces cuadradas correspondientes son de 0 a 16 (redondeadas). Construya una tabla de 16 entradas (basada en cero) con la entrada n-ésima el valor máximo para el argumento para el cual la raíz cuadrada es n. La tabla se vería así:
Camina por la mesa y se detiene cuando encuentra un valor mayor o igual a su argumento. Ejemplo: raíz cuadrada de 18
Si bien la tabla de búsqueda rápida tiene un tiempo de ejecución fijo (solo una búsqueda), aquí el tiempo de ejecución es más largo para argumentos de mayor valor.
Para ambos métodos, al elegir diferentes valores para la tabla, puede seleccionar entre un valor redondeado o truncado para la raíz cuadrada.
fuente
Trabajando en 8 bits, básicamente está limitado a soluciones enteras. Si necesita la raíz cuadrada de X, lo más cercano que puede obtener es el número entero más grande cuyo cuadrado es menor o igual a X. Por ejemplo, para sqrt (50) obtendría 7, ya que 8 * 8 sería más que 50
Así que aquí hay un truco para hacerlo: cuente cuántos números impares, comenzando con 1, puede restar de X. Podría hacerlo con la lógica de esta manera: un registro R1 de 8 bits contiene el valor de trabajo, un contador R2 de 7 bits contiene (la mayoría de) el número impar, y un contador R3 de 4 bits contiene el resultado. En el reinicio, R1 se carga con el valor de X, R2 se borra a cero y R3 se borra a cero. Se alimenta un circuito de resta de 8 bits R1 para la entrada 'A', y el valor de R2 se combina con un LSB fijo en '1' (mediante pull-up) para la entrada 'B'. El sustractor genera una diferencia AB de 8 bits y un bit de préstamo. En cada reloj, si el bit de préstamo está libre, R1 se carga con la salida del sustractor, R2 se incrementa y R3 se incrementa. Si se establece el bit de préstamo, R1 no se carga y R2, R3 no se incrementan, b / c el resultado ahora está listo en R3.
ALTERNATIVAMENTE
Solo hay 16 valores de salida posibles, por lo que la respuesta es un número de cuatro bits. Básicamente, tiene cuatro funciones de un solo bit de los 8 bits de entrada. Ahora, no puedo dibujar un mapa de Karnaugh de 8 dimensiones, pero en principio podrías crear un circuito combinatorio para cada bit de la respuesta. Tome las salidas de esos cuatro circuitos combinatorios e inténtelos como la respuesta de cuatro bits. Voila Sin relojes, sin registros, solo un montón de NAND y NOR serían suficientes.
fuente
case
declaración importante y dejar que la herramienta de síntesis haga todo el trabajo. Por un lado, es como hacer una gran tabla de búsqueda en RAM distribuida (utilizada como ROM); Por otro lado, la herramienta debería encontrar optimizaciones como las que mencionas en tu comentario.No sé si esto es de alguna ayuda, pero hay una manera ingeniosamente simple de calcular una raíz cuadrada:
No sé mucho sobre lo que se puede y no se puede hacer en lógica secuencial, pero dado que este algoritmo termina en solo 4 bucles, es posible que pueda implementarlo en 4 etapas.
fuente
Ejecuté las tablas de verdad para la raíz cuadrada entera de 0-255 a través de un minimizador lógico Quine-McCluskey. La raíz cuadrada entera se puede hacer solo con lógica combinatoria, pero incluso para un tamaño de entrada relativamente pequeño de28 posibles valores, la respuesta no es para los débiles de corazón. Lo siguiente se ordena de MSB A a LSB D de la salida, en términos de abcdefgh como entradas, MSB a LSB:
fuente