Problemas de asignación excesiva de VHDL y constricción de tiempo en Xilinx-ISE

0

Tengo un problema con un módulo que uso para la rotación de un vector. Tengo dos operaciones, una usa 2 módulos rotLeft y la otra usa 2 rotRights. Originalmente, había ocupado problemas de overmapping de Slices, lo que me llevó a combinar los módulos que me ayudaron mucho, sin embargo ahora tengo problemas con las restricciones de tiempo en Xilinx, lo que resulta en una salida incorrecta cuando se programa en una placa de desarrollo FPGA. Me he dado cuenta de que el problema son los módulos de rotación, al comentar los cuatro módulos de rotación en el mapa de puertos, la velocidad máxima de los diseños es de alrededor de 111Mhz y cuando está en uso 1.66Mhz, cuando solo se usan 2, es de alrededor de 44Mhz máx. 25Mhz. Sus son 4 módulos de rotación en uso; sin embargo, solo se necesitan 2 a la vez, dependiendo de si se presiona un botón en el tablero o no. Intenté desactivar dos a la vez cambiando la cláusula with / select con un protector de proceso y una declaración de caso; sin embargo, termino con problemas de LUT Overmapped (158%, generalmente 71%).

¿Alguien tiene algún consejo para lidiar con las restricciones de tiempo y los problemas de overmapping en Xilinx, o una manera de mejorar el siguiente módulo?

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;

ENTITY rotLeft IS
    PORT (
    din     : IN STD_LOGIC_VECTOR(31 DOWNTO 0);  -- Input to be rotated
    amnt    : IN STD_LOGIC_VECTOR(4 DOWNTO 0);   --Amount to Rotate by
    dout    : OUT STD_LOGIC_VECTOR(31 DOWNTO 0) -- Rotated Input
     );
END rotLeft;

ARCHITECTURE rtl OF rotLeft IS
    SIGNAL rot  : STD_LOGIC_VECTOR(31 DOWNTO 0);
BEGIN
    WITH amnt SELECT -- din <<< amnt
        rot<= 
            din(30 DOWNTO 0) & din(31)           WHEN "00001", --01
            din(29 DOWNTO 0) & din(31 DOWNTO 30) WHEN "00010", --02
            din(28 DOWNTO 0) & din(31 DOWNTO 29) WHEN "00011", --03
            din(27 DOWNTO 0) & din(31 DOWNTO 28) WHEN "00100", --04
            din(26 DOWNTO 0) & din(31 DOWNTO 27) WHEN "00101", --05
            din(25 DOWNTO 0) & din(31 DOWNTO 26) WHEN "00110", --06
            din(24 DOWNTO 0) & din(31 DOWNTO 25) WHEN "00111", --07
            din(23 DOWNTO 0) & din(31 DOWNTO 24) WHEN "01000", --08
            din(22 DOWNTO 0) & din(31 DOWNTO 23) WHEN "01001", --09
            din(21 DOWNTO 0) & din(31 DOWNTO 22) WHEN "01010", --10
            din(20 DOWNTO 0) & din(31 DOWNTO 21) WHEN "01011", --11
            din(19 DOWNTO 0) & din(31 DOWNTO 20) WHEN "01100", --12
            din(18 DOWNTO 0) & din(31 DOWNTO 19) WHEN "01101", --13
            din(17 DOWNTO 0) & din(31 DOWNTO 18) WHEN "01110", --14
            din(16 DOWNTO 0) & din(31 DOWNTO 17) WHEN "01111", --15
            din(15 DOWNTO 0) & din(31 DOWNTO 16) WHEN "10000", --16
            din(14 DOWNTO 0) & din(31 DOWNTO 15) WHEN "10001", --17
            din(13 DOWNTO 0) & din(31 DOWNTO 14) WHEN "10010", --18
            din(12 DOWNTO 0) & din(31 DOWNTO 13) WHEN "10011", --19
            din(11 DOWNTO 0) & din(31 DOWNTO 12) WHEN "10100", --20
            din(10 DOWNTO 0) & din(31 DOWNTO 11) WHEN "10101", --21
            din(09 DOWNTO 0) & din(31 DOWNTO 10) WHEN "10110", --22
            din(08 DOWNTO 0) & din(31 DOWNTO 09) WHEN "10111", --23
            din(07 DOWNTO 0) & din(31 DOWNTO 08) WHEN "11000", --24
            din(06 DOWNTO 0) & din(31 DOWNTO 07) WHEN "11001", --25
            din(05 DOWNTO 0) & din(31 DOWNTO 06) WHEN "11010", --26
            din(04 DOWNTO 0) & din(31 DOWNTO 05) WHEN "11011", --27
            din(03 DOWNTO 0) & din(31 DOWNTO 04) WHEN "11100", --28
            din(02 DOWNTO 0) & din(31 DOWNTO 03) WHEN "11101", --29  
            din(01 DOWNTO 0) & din(31 DOWNTO 02) WHEN "11110", --30
            din(0)           & din(31 DOWNTO 01) WHEN "11111", --31
            din                                  WHEN OTHERS;

        dout <= rot;
END rtl;

EDITAR: Este es el código para el cifrado / descifrado enlace

    
pregunta kdgwill

2 respuestas

3

Desde el informe de temporización que adjuntó, la ruta crítica tiene 378 niveles de lógica. No puedo enfatizar lo suficiente la cantidad de 378 niveles, del proyecto en el que estoy trabajando (compresión de video), mi ruta crítica tiene solo 8 niveles de profundidad.

Esto es parte de su problema, no solo los retrasos en la propagación son enormes como consecuencia de tantos LUT, el ISE tiene muchos problemas para enrutar el diseño de manera eficiente. Necesita agregar registros para canalizar su diseño, es mucho más fácil enrutar un diseño canalizado y obtendrá una velocidad más rápida y un área más pequeña. Además, los registros son prácticamente gratuitos en los FPGA.

Por ejemplo, su entidad rotLeft debería tener entradas y salidas registradas, y luego se ejecutará fácilmente a 100MHz, incluso en un Spartan-3E. En mi diseño, siempre registro mi salida y asumo que las entradas están registradas (ya que provienen de la salida de otro módulo).

Otra parte de su problema son estos bucles combinacionales que ISE informa. Es probable que cambien o incluso desaparezcan una vez que rediseñes para agregar registros de tuberías, pero ni siquiera deberías probar un flujo de bits con estos.

    
respondido por el Jonathan Drolet
2

El operador de rotación derecha / izquierda es simplemente un árbol mux, por lo que las razones reales de esto podrían no estar relacionadas con el ror / rol:

  • es posible que esté conectando los módulos de forma incorrecta o parcialmente recursiva, sin suficientes registros para cortar las rutas combinacionales. Si está utilizando un FPGA moderno, no hay forma de que un mux tree pueda obstaculizar tanto la frecuencia si está correctamente conectado al resto del diseño.
  • es posible que no tenga registros en absoluto en el diseño, ni siquiera para las entradas y salidas. Esto podría fácilmente resultar en caminos muy lentos.
  • su dispositivo puede estar demasiado lleno, lo que dificulta su colocación y amp; Enrutamiento para converger a una buena solución.

Puede que tampoco sea ninguna de las cosas que sugerí. Definitivamente, deberías revisar las advertencias en síntesis y P & R y quizás también verificar que la lista de redes sintetizada es la misma que esperarías.

    
respondido por el Francesco Conti

Lea otras preguntas en las etiquetas