Necesito dividir un entero por un entero en un ciclo de reloj. ¿Cómo debería hacer esto? Tengo una función para ella 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;
Esta respuesta no es lo que está buscando, pero la solución básica a este problema es esta: no use la división .
Muchas arquitecturas de procesador e incluso chips DSP no tienen ninguna instrucción de división y, cuando la tienen, suele ser 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 encarecidamente que usted o cualquier persona que lea esta pregunta se esfuerce por evitar implementar una función de división de hardware de cualquier tipo, y mucho menos una de ciclo único. Como han dicho algunos comentarios, 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 canalizada y, por lo tanto, no tendría una latencia de ciclo único.
Una solución aún mejor sería revisar su diseño de manera que no haya necesidad de ninguna división o equivalente. Sin embargo, sin saber lo que se supone que debe hacer su diseño, es imposible sugerir alternativas.
Como nota a pie de página, y como se señaló en un comentario, la división por una potencia de dos es relativamente simple, porque se reduce a una operación de cambio.
El algoritmo que diste originalmente es un algoritmo de 'restauración de la división'; requiere un ciclo de reloj para cada bit del cociente. La división sin restauración se usa normalmente en hardware; esto también toma un ciclo por bit del cociente. Hay alrededor de mil millones de visitas de Google en la división de no restauración. Es simple, pero un poco complicado: pruébalo y pregunta si/cuándo no funciona.
Ni siquiera piense 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 (puede usar sumadores en su lugar).
kevin blanco
TEMLIB
TEMLIB
Neil_ES
Hombre_nuclear_D
Jonathan Drolet
Hombre_nuclear_D
Jonathan Drolet
Hombre_nuclear_D
Jonathan Drolet
Xcodó
Hombre_nuclear_D
Hombre_nuclear_D