Simplificación lógica de VHDL

3

He estado teniendo un problema recurrente común cuando escribo el código VHDL. Termino escribiendo un código similar a este (como ejemplo):

ENTITY registerfile IS
    PORT(VX : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
         RS1: IN  STD_LOGIC_VECTOR(3 DOWNTO 0));
END registerfile;

ARCHITECTURE rtl OF registerfile IS
    TYPE FeedbackSignal IS ARRAY(15 DOWNTO 0) OF STD_LOGIC_VECTOR(7 DOWNTO 0);
    SIGNAL V_F : FeedbackSignal;
BEGIN
    PROCESS(RS1, V_F)
    BEGIN
        CASE RS1 IS
            WHEN "0000" =>
                VX <= V_F(0);
            WHEN "0001" =>
                VX <= V_F(1);
            WHEN "0010" =>
                VX <= V_F(2);
            WHEN "0011" =>
                VX <= V_F(3);
            WHEN "0100" =>
                VX <= V_F(4);
            WHEN "0101" =>
                VX <= V_F(5);
            WHEN "0110" =>
                VX <= V_F(6);
            WHEN "0111" =>
                VX <= V_F(7);
            WHEN "1000" =>
                VX <= V_F(8);
            WHEN "1001" =>
                VX <= V_F(9);
            WHEN "1010" =>
                VX <= V_F(10);
            WHEN "1011" =>
                VX <= V_F(11);
            WHEN "1100" =>
                VX <= V_F(12);
            WHEN "1101" =>
                VX <= V_F(13);
            WHEN "1110" =>
                VX <= V_F(14);
            WHEN "1111" =>
                VX <= V_F(15);
            WHEN OTHERS =>
                VX <= (OTHERS => 'Z');
        END CASE;
    END PROCESS;
END rtl;

Suponga que V_F está conectado a un registro interno o algo similar. Siento que esto es extremadamente repetitivo, y parece que no puedo encontrar una mejor manera. ¿Hay una forma más concisa similar a algo como:

VX <= V_F(RS1);
    
pregunta Steven Goldade

3 respuestas

4

Yo mismo resolví este problema de una manera diferente y más compacta.

Básicamente he usado lo siguiente:

PROCESS(RS1, V_F)
BEGIN
    VX <= V_F(TO_INTEGER(UNSIGNED(RS1)));
END PROCESS;
    
respondido por el Steven Goldade
2

Parece que esta es una de esas ocasiones en las que un bucle funciona muy bien:

if (RS1 > 15) then
    VX <= (others => 'Z';
end if;

for i in 0 to 15 loop
    if RS1 = i then
        VX <= V_F(i);
    end if;
end loop

He utilizado estas construcciones para expandir FIFO de 8 bits a buses de datos de 32 bits y también para implementar lecturas de registro para matrices de componentes similares (por ejemplo, 8 puertos serie idénticos con sus conjuntos de registros en un bloque contiguo de E / S memoria).

    
respondido por el akohlsmith
0
VX <= V_F(RS1);

no funcionará ya que las indicaciones vectoriales deben poder determinarse en tiempo de compilación (para sentencias concurrentes).

En cambio, la forma más compacta de describir el comportamiento que desea es usar sentencias secuenciales. Mira la sugerencia de Kohlsmith.

    
respondido por el Carl

Lea otras preguntas en las etiquetas