1 votos

¿Permite VHDL un puerto std_logic_vector sin límites?

Aquí hay un código de VUnit Avalon Master BFM:

entity avalon_master is
  generic (
    bus_handle          : bus_master_t;
    use_readdatavalid   : boolean := true;
    fixed_read_latency  : natural := 1;  -- (bus cycles).  This parameter is ignored when use_readdatavalid is true
    write_high_probability : real range 0.0 to 1.0 := 1.0;
    read_high_probability : real range 0.0 to 1.0 := 1.0
  );
  port (
    clk           : in  std_logic;
    address       : out std_logic_vector;
    byteenable    : out std_logic_vector;
    burstcount    : out std_logic_vector;
    waitrequest   : in  std_logic;
    write         : out std_logic;
    writedata     : out std_logic_vector;
    read          : out std_logic;
    readdata      : in  std_logic_vector;
    readdatavalid : in  std_logic
  );
end entity;

Hay tantos puertos que sólo dicen std_logic_vector sin dar ningún límite. Esto es, obviamente, sólo para su uso en la simulación en realidad. ¿Cómo es esto incluso válido VHDL?

5voto

vangelo Puntos 34

Esta declaración sin restricciones es válida, pero depende de otra definición fuera de este módulo. Tenga en cuenta que ninguna "genérico" para este sencillo ejemplo de Flip-Flop D:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity uncon_dff is
    Port ( d : in STD_LOGIC_VECTOR;
           clk, rst : in STD_LOGIC;
           q : out STD_LOGIC_VECTOR);
end uncon_dff;

architecture Behavioral of uncon_dff is
begin
    process (clk, rst)
    begin
        if (rst = '1') then
            q <= (others => '0');
        elsif rising_edge(clk) then
            q <= d;
        end if;
    end process;
end Behavioral;

El diseño de nivel superior define los rangos de los vectores en la instanciación (a partir de las señales/entradas/salidas locales):

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity top_dff is
    Port ( d : in STD_LOGIC_VECTOR (7 downto 0);
           clk, rst : in STD_LOGIC;
           q : out STD_LOGIC_VECTOR (7 downto 0));
end top_dff;

architecture Behavioral of top_dff is

    component uncon_dff is -- no range here (unconstrained)
        Port ( d : in STD_LOGIC_VECTOR;
               clk, rst : in STD_LOGIC;
               q : out STD_LOGIC_VECTOR);
    end component;

begin

    dff : uncon_dff port map ( -- ranges inherited
        d => d, clk => clk, rst => rst, q => q  
    );

end Behavioral;

Lo que genera la lógica esperada:

enter image description here

Esto fue probado en Vivado usando VHDL 2008. Si el diseño de nivel superior define por error rangos diferentes para 'd' y 'q', la síntesis falla:

[Synth 8-690] desajuste de anchura en la asignación; el destino tiene 9 bits, el origen tiene 8 bits ["/dev/shm/project_1/project_1.srcs/sources_1/new/uncon_dff.vhd":18]

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X