1 votos

Dividir por un entero en VHDL

Necesito dividir un número entero por otro número entero en un ciclo de reloj.
¿Cómo debo hacer esto?
Tengo una función para ello que encontré en internet pero siempre devuelve uno.

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):= (otros => '0');
    variable i : integer:=0;
    begin
        for i in 0 to b'longitud-1 loop
            p1(b'longitud-1 downto 1) := p1(b'longitud-2 downto 0);
            p1(0) := a1(a'longitud-1);
            a1(a'longitud-1 downto 1) := a1(a'longitud-2 downto 0);
            p1 := p1-b1;
            if(p1(b'longitud-1) ='1') then
                a1(0) :='0';
                p1 := p1+b1;
            else
                a1(0) :='1';
            end if;
        end loop;
        return to_integer(a1);
    end divide;

0 votos

La división siempre es un poco más difícil que la multiplicación. Piensa en multiplicar por el recíproco y obtener el recíproco del divisor de una tabla de búsqueda.

3 votos

Quizás "variable b1 : unsigned(15 downto 0):=b;" en lugar de ...":=a"

1 votos

¿Son tus entradas (dividendo y divisor) ambas variables? Hacer un divisor de 1 ciclo es posible, pero funcionará a baja frecuencia y ocupará mucha área (bueno, por supuesto, depende de la anchura de los operandos...).

5voto

Rob Donnelly Puntos 108

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

Muchas arquitecturas de procesador e incluso chips DSP no tienen una instrucción de división en absoluto, y donde 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.

Sugiero fuertemente que tú o cualquier persona que lea esta pregunta haga un esfuerzo muy grande para evitar implementar una función de división de hardware de cualquier tipo, y mucho menos 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 esperas un buen rendimiento en tu FPGA, esto se implementaría utilizando una arquitectura con canalización, por lo que no tendría latencia de ciclo único.

Una solución aún mejor sería revisar tu diseño de manera que no haya necesidad de 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ñaló un comentario, la división por una potencia de dos es relativamente simple, porque se reduce a una operación de desplazamiento.

1 votos

Todavía NECESITARÉ hacer división. ¿Cómo haría división de múltiples ciclos? Estoy haciendo un procesador en un fpga y la división será más que necesaria. No se requiere código, pero se prefiere. Lamento molestarle de nuevo.

1 votos

Te sugiero que crees un procesador funcional e implementes una rutina de división en software. Esto es lo que se ha hecho en la mayoría de los diseños de procesadores desde hace décadas. Los programadores son en su mayoría conscientes de que la 'división' es costosa y no colocarían esta operación en un bucle interno u otra sección crítica de código. Si resulta que este es realmente un cuello de botella en tu aplicación, siempre puedes volver atrás y agregar soporte de división de hardware más adelante.

0voto

Ken Liu Puntos 7779

El algoritmo que diste originalmente es un algoritmo de 'división restauradora'; 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 resultados en Google sobre la división no restauradora. Es simple, pero un poco complicado: inténtalo y pregunta si/no funciona.

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

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X