Escribí un programa para un FPGA Cyclone II que divide 2 números de 64 bits y devuelve si el resto es 0 usando la operación de módulo (%).
Cuando compilé el programa con números de 64 bits para el divisor y el dividendo, usó casi todas las celdas lógicas del dispositivo.
¿Hay alguna manera de hacer la división, o el módulo, o [si el módulo == 0] de una manera que use menos celdas lógicas?
Nuestra biblioteca PoC de código abierto tiene un núcleo IP de división de ciclo múltiple, que se puede sintetizar como una canalización. El recuento de bits del dividendo y el divisor, así como la base, se pueden configurar según las necesidades de los usuarios. Este módulo devuelve tanto el cociente como el resto.
entity arith_div is
generic (
A_BITS : positive; -- Dividend Width
D_BITS : positive; -- Divisor Width
RAPOW : positive := 1; -- Power of Compute Radix (2**RAPOW)
PIPELINED : boolean := false -- Computation Pipeline
);
port (
-- Global Reset/Clock
clk : in std_logic;
rst : in std_logic;
-- Ready / Start
start : in std_logic;
ready : out std_logic;
-- Arguments / Result (2's complement)
A : in std_logic_vector(A_BITS-1 downto 0); -- Dividend
D : in std_logic_vector(D_BITS-1 downto 0); -- Divisor
Q : out std_logic_vector(A_BITS-1 downto 0); -- Quotient
R : out std_logic_vector(D_BITS-1 downto 0); -- Remainder
Z : out std_logic -- Division by Zero
);
end arith_div;
Consulte la fuente de PoC.arith.div para ver la implementación completa (es demasiado largo para publicarlo aquí).
¿Sabes algo sobre el divisor? Si lo hace, entonces hay varias cosas que se pueden hacer.
La clave para resolver la división, en general, es la División Euclidiana. Lea https://en.wikipedia.org/wiki/Euclidean_division para comprender por qué es necesario canalizar este algoritmo. Básicamente se reduce al mismo algoritmo que usarías para resolver divisiones a mano.
chris stratton
eric johnson
alex.forencich
eric johnson
eric johnson
pjc50