División de números en un FPGA

3

Escribí un programa para un FPGA Cyclone II que divide 2 números de 64 bits y se 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 una manera de hacer división, módulo, o [si módulo == 0] de una manera que use menos celdas lógicas?

    
pregunta Eric Johnson

2 respuestas

5

Nuestra biblioteca de código abierto de PoC tiene un núcleo IP de división de múltiples ciclos, que se puede sintetizar como una canalización. El recuento de bits del dividendo y el divisor, así como el radix, se pueden configurar según las necesidades de los usuarios. Este módulo devuelve el cociente, así 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 obtener el implementación completa (es demasiado largo para publicarla aquí).

    
respondido por el Paebbels
3

¿Sabes algo sobre el divisor? Si lo haces, entonces hay varias cosas que se pueden hacer.

  • Si el divisor \ $ m = 2 ^ k \ $ es una potencia de 2, entonces $$ \ mathbb {mod} (x, m) = 0 \ iff x \ & (2 ^ k-1) = 0 $$.
  • Si el divisor es una constante conocida, hay varios trucos, consulte: enlace y enlace

La clave para resolver la división, en general, es la División Euclidiana. Lea enlace para comprender por qué es necesario canalizar este algoritmo. Básicamente, se reduce al mismo algoritmo que usarías para resolver la división a mano.

    
respondido por el Pål-Kristian Engstad

Lea otras preguntas en las etiquetas