Encontrar Fmax en diseño FPGA sin agregar un ciclo adicional

0

Estoy tratando de encontrar el Fmax de mi diseño VHDL en Quartus II. Sé que necesita tener una ruta de registro a registro para encontrar el Fmax. Sin embargo, cuando registro la entrada, se agrega otro ciclo. Quiero que el código sea de 1 ciclo y aún muestre Fmax.

Código con entradas registradas:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity generic_RBSD is

    generic(
        BIN_WIDTH : integer := 4
    );
    port(
        bin_input : in signed(BIN_WIDTH-1 downto 0);
        RBSD_output : out STD_LOGIC_VECTOR(2*BIN_WIDTH-1 downto 0);
        clk : in STD_LOGIC
    );
end entity;
architecture behavioral of generic_RBSD is
    signal a : signed(BIN_WIDTH-1 downto 0);
begin
    process(clk)
        variable bin : signed(BIN_WIDTH-1 downto 0);
        variable RBSD : STD_LOGIC_VECTOR(2*BIN_WIDTH-1 downto 0);
    begin
        if rising_edge(clk) then
            a <= bin_input;
            if bin_input(BIN_WIDTH-1) = '1' then
                bin := -a;
            else
                bin := a;
            end if;
            for i in 0 to BIN_WIDTH-1 loop
                if bin(i) = '1' then
                    RBSD(2*i+1 downto 2*i) := "11";
                else
                    RBSD(2*i+1 downto 2*i) := "10";
                end if;
            end loop;
            if bin_input(BIN_WIDTH-1) = '1' then
                RBSD := not RBSD;
            end if;
        end if;
        RBSD_output <= RBSD;
    end process;
end architecture;

Sin entradas registradas (funciona, pero no muestra Fmax):

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity generic_RBSD is

    generic(
        BIN_WIDTH : integer := 4
    );
    port(
        bin_input : in signed(BIN_WIDTH-1 downto 0);
        RBSD_output : out STD_LOGIC_VECTOR(2*BIN_WIDTH-1 downto 0);
        clk : in STD_LOGIC
    );
end entity;
architecture behavioral of generic_RBSD is
    signal a : signed(BIN_WIDTH-1 downto 0);
begin
    process(clk)
        variable bin : signed(BIN_WIDTH-1 downto 0);
        variable RBSD : STD_LOGIC_VECTOR(2*BIN_WIDTH-1 downto 0);
    begin
        if rising_edge(clk) then
            if bin_input(BIN_WIDTH-1) = '1' then
                bin := -bin_input;
            else
                bin := bin_input;
            end if;
            for i in 0 to BIN_WIDTH-1 loop
                if bin(i) = '1' then
                    RBSD(2*i+1 downto 2*i) := "11";
                else
                    RBSD(2*i+1 downto 2*i) := "10";
                end if;
            end loop;
            if bin_input(BIN_WIDTH-1) = '1' then
                RBSD := not RBSD;
            end if;
        end if;
        RBSD_output <= RBSD;
    end process;
end architecture;
    
pregunta gilianzz

1 respuesta

1

Hay dos formas de obtener el tiempo:

1) Cree un contenedor para todo el módulo, que registre las entradas y salidas y haga que las herramientas calculen Fmax del sistema + contenedor. Aunque consideraría problemático que un IPcore reutilizable reclame un fmax alto y luego lo encuentre no registrado y descarte una carga de lógica combinatoria del lado del usuario.

2) Marque los pines de su diseño como pines virtuales. Ver por ejemplo ¿La configuración de los pines como virtual afecta el tiempo? Aquí el quartus analiza el tiempo asumir que la entrada de entrada de los registros y salidas 'cercanas' impulsa a los registros cercanos, lo que le permitirá obtener una estimación de tiempo decente sin ser penalizado por transportar las señales de IO hasta las almohadillas de E / S perhiphery (y le ahorrará la escritura de restricciones de tiempo para el mismo).

    
respondido por el shuckc

Lea otras preguntas en las etiquetas