asignación de señal interna VHDL

1

Soy nuevo en VHDL y traté de implementar un ejemplo simple de un libro, que representa un registro de 2 bits y el banco de pruebas.

La compilación de los archivos funciona bien y señala que el registro (reinicio, reloj y datos) se transmite correctamente desde el banco de pruebas al registro.

Pero la asignación de señales internas a cualquier valor permanece sin ninguna acción, por lo que tampoco hay salida.

Intenté simularlo con ModelSimPE Student Version y Xilinx Viacom Webpack edition 2014.3.

En ambos IDE incluí los archivos y se compilan sin ningún error. q0_s, q0_ns, q1_s, q1_ns no cambiará sus valores y, por lo tanto, no hay salida.

¿Alguien puede decirme qué hay de malo con mi código?

El registro de 2 bits

LIBRARY ieee;
USE ieee.std_logic_1164.all;

ENTITY reg2 IS
    PORT (
        clk : IN  std_logic;
        d0  : IN  std_logic;
        d1  : IN  std_logic;
        load: IN  std_logic;
        res : IN  std_logic;
        q0  : OUT std_logic;
        q1  : OUT std_logic
    );
END reg2;

ARCHITECTURE beh OF reg2 IS
    SIGNAL q0_s, q0_ns, q1_s, q1_ns : std_logic;
BEGIN
    reg : PROCESS (clk, res)
    BEGIN
        IF res = '1' THEN
            q0_s <= '0';
            q1_s <= '0';
        ELSIF clk'event AND clk = '1' THEN
            q0_s <= q0_ns;
            q1_s <= q1_ns;
        END IF;
    END PROCESS reg;

    q0 <= q0_s AFTER 2 ns;
    q1 <= q1_s AFTER 2 ns;

    mux : PROCESS (load, q0_s, q1_s, d0, d1)
        BEGIN
            IF load = '1' THEN
                q0_s <= d0 AFTER 3 ns;
                q1_s <= d1 AFTER 3 ns;
            ELSE
                q0_ns <= q0_s AFTER 4 ns;
                q1_ns <= q1_s AFTER 4 ns;
            END IF;
    END PROCESS mux;


END beh;

Testbench

LIBRARY ieee;
USE ieee.std_logic_1164.all;

ENTITY test_bench IS
END test_bench;

ARCHITECTURE reg2_test OF test_bench IS

    COMPONENT reg2
        PORT (
            clk : IN  std_logic;
            d0  : IN  std_logic;
            d1  : IN  std_logic;
            load: IN  std_logic;
            res : IN  std_logic;
            q0  : OUT std_logic;
            q1  : OUT std_logic
        );
    END COMPONENT;

    -- stimulus signale
    SIGNAL s_clk  : std_logic := '0';
    SIGNAL s_d0   : std_logic := '0';
    SIGNAL s_d1   : std_logic := '0';
    SIGNAL s_load : std_logic := '0';
    SIGNAL s_res  : std_logic := '0';

    -- response signale
    SIGNAL q0_r : std_logic;
    SIGNAL q1_r : std_logic;

    -- Verschaltung des DUV mit den Stimulus/Response signalen
    BEGIN

    u1 : reg2
        PORT MAP ( clk => s_clk, d0 => s_d0, d1 => s_d1, load => s_load,
                res => s_res, q0 => q0_r , q1 => q1_r);
    -- Taktgenerator ( 100MHz )
    s_clk <= NOT s_clk AFTER 5 ns;

    -- Stimuli
    stim : PROCESS
        BEGIN
            s_res <= '1', '0' AFTER 20 ns;
            s_d0 <= '1' AFTER 20 ns;
            s_load <= '1' AFTER 40 ns;
            WAIT;
    END PROCESS stim;

    -- Abbruch der Simulation
    stop_sim: PROCESS
    BEGIN
        WAIT FOR 100 ns;
        ASSERT false  REPORT "simulation stopped" SEVERITY failure;
    END PROCESS stop_sim;
 END reg2_test;
    
pregunta lamchob

1 respuesta

3

Tienes varios controladores para q0_s y q1_s:

architecture beh of reg2 is
    signal q0_s, q0_ns, q1_s, q1_ns : std_logic;
begin
    reg : process (clk, res)
    begin
        if res = '1' then
            q0_s <= '0';
            q1_s <= '0';
        elsif clk'event and clk = '1' then
            q0_s <= q0_ns;
            q1_s <= q1_ns;
        end if;
    end process reg;

    q0 <= q0_s after 2 ns;
    q1 <= q1_s after 2 ns;

    mux : process (load, q0_s, q1_s, d0, d1)
        begin
            if load = '1' then
                q0_s <= d0 after 3 ns;
                q1_s <= d1 after 3 ns;
            else
                q0_ns <= q0_s after 4 ns;
                q1_ns <= q1_s after 4 ns;
            end if;
    end process mux;


end beh;

Cada proceso tiene sus propios controladores para cualquier señal asignada dentro de ese proceso.

El valor de las señales es el valor resuelto de los dos controladores, std_logic es un tipo resuelto. Utiliza la función de resolución y resolution_table que se encuentran en el cuerpo del paquete std_logic_1164 para realizar esa resolución.

Estas dos asignaciones a q0_s y q1_s deberían ser a q0_ns y q1_ns como se encuentra en else:

mux : process (load, q0_s, q1_s, d0, d1)
    begin
        if load = '1' then
            q0_ns <= d0 after 3 ns;  -- was to q0_s
            q1_ns <= d1 after 3 ns;  -- was to q1_s

Esto da un mejor resultado:

    
respondido por el user8352

Lea otras preguntas en las etiquetas