Dividir por entero en VHDL

1

Necesito dividir un entero por un entero en un ciclo de reloj. ¿Cómo debería hacer esto? Tengo una función que encontré en Internet, pero siempre devuelve una.

function  divide  (a : unsigned; b : unsigned) return integer is
    variable a1 : unsigned(15 downto 0):=a;
    variable b1 : unsigned(15 downto 0):=a;
    variable p1 : unsigned(16 downto 0):= (others => '0');
    variable i : integer:=0;
    begin
        for i in 0 to b'length-1 loop
            p1(b'length-1 downto 1) := p1(b'length-2 downto 0);
            p1(0) := a1(a'length-1);
            a1(a'length-1 downto 1) := a1(a'length-2 downto 0);
            p1 := p1-b1;
            if(p1(b'length-1) ='1') then
                a1(0) :='0';
                p1 := p1+b1;
            else
                a1(0) :='1';
            end if;
        end loop;
        return to_integer(a1);
    end divide;
    
pregunta Nuclear_Man_D

2 respuestas

4

Esta respuesta no es lo que estás buscando, pero la solución básica a este problema es la siguiente: No uses división .

Muchas arquitecturas de procesador e incluso los chips DSP no tienen ninguna instrucción de división, y donde sí tienen división, generalmente es una operación de varios ciclos, porque la división es fundamentalmente iterativa. La división es costosa en términos de área y lenta, por lo que generalmente se evita si es posible.

Le sugiero que usted o cualquiera que lea esta pregunta se esfuerza por evitar la implementación de una función de división de hardware de cualquier tipo, por no hablar de una de ciclo único. Como algunos comentarios han dicho, el enfoque estándar sería implementar una multiplicación por el recíproco del divisor. Incluso aquí, si espera un buen rendimiento en su FPGA, esto se implementaría utilizando una arquitectura segmentada, y por lo tanto no tendría una latencia de ciclo único.

Una solución aún mejor sería revisar su diseño para que no haya ninguna división o equivalente. Sin embargo, sin saber qué se supone que debe hacer tu diseño, es imposible sugerir alternativas.

Como nota al pie, y como se señaló en un comentario, la división por una potencia de dos es relativamente simple, ya que se reduce a una operación de cambio.

    
respondido por el scary_jeff
0

El algoritmo que dio originalmente es un algoritmo de "división de restauración"; requiere un ciclo de reloj para cada bit del cociente. La división no restauradora se usa normalmente en hardware; Esto también toma un ciclo por bit del cociente. Hay alrededor de mil millones de éxitos de Google en la división no restaurada. Es simple, pero un poco incómodo, pruébalo y pregunta si / cuándo no funciona.

Ni siquiera pienses en invertir / multiplicar a menos que el dividendo sea una constante, en cuyo caso es fácil y rápido, y ni siquiera requerirá un multiplicador (en su lugar, puedes usar sumadores).

    
respondido por el EML

Lea otras preguntas en las etiquetas