¿Es posible mover el código VHDL desde el nivel superior de un diseño a un subcomponente, sin cambiar la lógica subyacente?

1

Supongamos que tengo un componente, llamado Top_Level, que tiene un montón de registros que utiliza. Hay algunos subcomponentes que realizan alguna lógica combinacional utilizando los registros. También hay un proceso cronometrado, Process_1, que realiza operaciones secuenciales en los registros. Entonces, en cada ciclo de reloj, Process_1 hace algunas cosas secuenciales con los registros. Luego, los subcomponentes en Top_Level hacen su lógica combinacional.

El proceso_1 se está volviendo un poco grande, así que me gustaría convertirlo en un subcomponente de Top_Level llamado Component_1. Aquí está el problema : para que Process_1 sea un subcomponente de Top_Level, tengo que mover todos los registros que usa al nuevo Component_1. Pero entonces los otros subcomponentes en Top_Level no podrían acceder a esos registros.

¿Hay una manera de hacer que los registros de Component_1 actúen también como salidas de Component_1? Luego podría copiar / pegar mi código en Component_1 sin tener que cambiar el nombre de todos mis registros y señales.

    
pregunta user3716057

2 respuestas

1

Sí, y en realidad es una buena práctica. Parece que ya ha respondido la mayor parte de su propia pregunta: convierta los valores registrados en salidas del componente de nivel inferior. Esto debería ponerte en el camino correcto; Si necesita más detalles sobre cómo hacerlo, muéstrenos su código fuente.

Algunos otros consejos que podrían ser útiles:

  • En VHDL-2008, puede leer desde los puertos de salida, por lo que no tiene que cambiar el nombre de sus señales existentes. En versiones anteriores de VHDL, podría usar los puertos del modo de búfer con el mismo efecto.

  • Los IDE con refactorización integrada (como Sigasi) pueden cambiar el nombre de las señales de forma automática, por lo que esto es en realidad menos trabajo de lo que parece.

respondido por el rick
0

Si su preocupación es sobre la lectura de salidas desde dentro de la entidad, solo tiene que usar una señal regular para la retroalimentación interna deseada y también asignarla al puerto de salida. De esta manera, no está leyendo directamente la etiqueta de salida, que es la limitación del idioma. El siguiente código debería aclarar esto:

entity e is
port(
    clk   : in  std_logic,
    myin  : in  std_logic,
    myout : out std_logic
);
end entity;

architecture a of e is

signal result : std_logic; -- Becomes your output, and can be used for internal feedback.

function mylogic(a : std_logic; b : std_logic) return std_logic is
    variable ret : std_logic := 0;
begin
    -- assign ret using 'a' and 'b'...
    return ret;
end function;

begin

myout <= result;

process(clk)
begin
    if rising_edge(clk) then
        result <= mylogic(myin,result);
    end if;
end process;

end architecture;

En lo anterior, myout es lo mismo que result , que se usa internamente. Al hacer esto, usted está no duplicando sus registros, es la señal física de la misma y no se requieren recursos adicionales.

    
respondido por el apalopohapa

Lea otras preguntas en las etiquetas