11 votos

¿Cómo debug señales rojas en ModelSIM?

Tengo que diseñar una máquina de estado utilizando sólo compuertas NAND para la combinatoria parte y D flip flops para la lógica secuencial. Todo lo que se debe ejecutar en un reloj de 1ghz/53.

Ahora, antes de que me asaltan con "no voy a hacer tu tarea por ti", déjame decirte que he desechado todo después de invertir días de trabajo, y empecé a hacer todo de nuevo con más rigor. Quiero hacer esto por mi cuenta, pero constantemente recibo al azar indefinido señales en la más simple de las partes del proyecto y es frustrante.

Ok, así que primero de todo tengo la máquina de estados y la tabla de verdad que lo hice para que en la siguiente imagen:

State machine diagram and Truth Table for it

La siguiente cosa son los kmaps:

The Kmaps

Desde el D flip flops D=Q+, el cableado de la lógica combinatoria(una vez que construir en un simplificado de bloques) no debería ser demasiado difícil.

Pero mi primer problema surge en el banco de pruebas para la Q3+. Permítanme poner aquí para la simplificación de la información que un diagrama rápido que arme para la Q3+:

Logic Diagram for Q3+

Más adelante en el post verás que en VHDL I en realidad el nombre de las entradas in1Q3plus a in11Q3plus ( 11 entradas), ya que este no es el bloque final ( el final de la lógica combinatoria bloque se compone de los cuatro Q3+, T2+, P1+, Q0+ bloques de cableado de las señales).

Así que tuve que hacer todo el uso de compuertas NAND, esto significa que tenía que tomar un enfoque estructural. Cada puerta está básicamente basado en compuertas NAND y, a continuación, se acumula en la complejidad( pero sólo de Y, O y NO puertas están escritos estructuralmente de compuertas NAND). Luego tengo una compuerta or con 3 entradas, una puerta and con 3 entradas y una compuerta or con 5 entradas ( como en el diagrama de la lógica ejemplo), cada uno basado en el anterior 2 de entrada Y&O puertas.

Cada banco de pruebas hasta el Q3plus uno ( el diagrama de arriba). Mi procedimiento para la prueba es la creación de señales para cada entrada, de tal manera que yo pueda ver las señales en la ventana de Simulación. Por ejemplo, tengo las siguientes señales para un 3 de entrada Y puerta:

process
    begin
a1 <= '0' ; wait for 4ns;
a1 <= '1' ; wait for 4ns;
end process;

process
    begin
b1 <= '0' ; wait for 8ns;
b1 <= '1' ; wait for 8ns;
end process;

process
    begin
c1 <= '0' ; wait for 2ns;
c1 <= '1' ; wait for 2ns;
end process;

Y las conexiones tendría este aspecto:

u1:ANDgate3 port map(A=>a1, B=>b1, C=>c1, fand3=>q1 );

Así, el problema surge cuando quiero simular el Q3plus banco de pruebas. Parece que tengo un error donde menos se lo espera, en una señal de prueba que sólo cambia de 0 a 1, con un período de 2 ns :|. Voy a publicar aquí el código del banco de pruebas, una vez más, afirmando que cada puerta de otro banco de pruebas funcionó a la perfección:

library ieee;
use ieee.std_logic_1164.all;

entity Q3plusTEST is
end Q3plusTEST;

architecture behavior of Q3plusTEST is
    component Q3plus is
    port(outQ3plus: out std_Logic;
    in1Q3plus: in std_Logic;
    in2Q3plus: in std_Logic;
    in3Q3plus: in std_Logic;
    in4Q3plus: in std_Logic;
    in5Q3plus: in std_Logic;
    in6Q3plus: in std_Logic;
    in7Q3plus: in std_Logic;
    in8Q3plus: in std_Logic;
    in9Q3plus: in std_Logic;
    in10Q3plus: in std_Logic;
    in11Q3plus: in std_Logic);
    end component;

signal a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11, outsignal: std_logic;

begin
    process
    begin
        a1<= '0'; wait for 4ns;
        a1<= '1'; wait for 4ns;
    end process;

    process
    begin
        a2<= '0'; wait for 6ns;
        a2<= '1'; wait for 6ns;
    end process;

    process
    begin
        a3<= '0'; wait for 8ns;
        a3<= '1'; wait for 8ns;
    end process;

    process
    begin
        a4<= '0'; wait for 10ns;
        a4<= '1'; wait for 10ns;
    end process;

    process
    begin
        a5<= '0'; wait for 12ns;
        a5<= '1'; wait for 12ns;
    end process;

    process
    begin
        a6<= '0'; wait for 14ns;
        a6<= '1'; wait for 14ns;
    end process;

    process
    begin
        a7<= '0'; wait for 16ns;
        a7<= '1'; wait for 16ns;
    end process;

    process
    begin
        a8<= '0'; wait for 18ns;
        a8<= '1'; wait for 18ns;
    end process;

    process
    begin
        a9<= '0'; wait for 20ns;
        a9<= '1'; wait for 20ns;
    end process;

    process
    begin
        a10<= '0'; wait for 22ns;
        a10<= '1'; wait for 22ns;
    end process;

    process
    begin
        a1<= '0'; wait for 24ns;
        a1<= '1'; wait for 24ns;
    end process;

    U1: Q3plus port map(in1Q3plus=> a1, in2Q3plus=>a2, in3Q3plus=>a3, in4Q3plus=>a4, in5Q3plus=>a5, in6Q3plus=>a6, in7Q3plus=>a7, in8Q3plus=>a8, in9Q3plus=>a9, in10Q3plus=>a10, in11Q3plus=>a11, outQ3plus=> outsignal); end behavior;

Y el código para el real Q3plus bloque es:

 library ieee;
use ieee.std_logic_1164.all;

entity Q3plus is
    port(outQ3plus: out std_Logic;
    in1Q3plus: in std_Logic;
    in2Q3plus: in std_Logic;
    in3Q3plus: in std_Logic;
    in4Q3plus: in std_Logic;
    in5Q3plus: in std_Logic;
    in6Q3plus: in std_Logic;
    in7Q3plus: in std_Logic;
    in8Q3plus: in std_Logic;
    in9Q3plus: in std_Logic;
    in10Q3plus: in std_Logic;
    in11Q3plus: in std_Logic);
    end Q3plus;

architecture behavior of Q3plus is
    component ORgate5 is
    port(AOR5: in std_logic;
    BOR5: in std_logic;
    COR5: in std_logic;
    DOR5: in std_logic;
    EOR5: in std_logic;
    f5or: out std_logic);
    end component;

    component ANDgate3 is
    port(A: in std_logic;
    B: in std_logic;
    C: in std_logic;
    fand3: out std_logic);
    end component;

    component ANDgate is
    port(xand: in std_logic;
    yand: in std_logic;
    fand: out std_logic);
    end component;

signal z1,z2,z3,z4,z5: std_logic;

begin
    U1: ANDgate port map(xand=> in1Q3plus, yand=> in2Q3plus, fand=> z1);
    U2: ANDgate port map(xand=> in3Q3plus, yand=> in4Q3plus, fand=> z2);
    U3: ANDgate port map(xand=> in5Q3plus, yand=> in6Q3plus, fand=> z3);
    U4: ANDgate port map(xand=> in7Q3plus, yand=> in8Q3plus, fand=> z4);
    U5: ANDgate3 port map(A=> in9Q3plus, B=> in10Q3plus, C=> in11Q3plus, fand3=> z5);
-- urmeaza toate portile de mai sus conectate la OR5
    U6: ORgate5 port map(AOR5=>z1, BOR5=> z2, COR5=> z3, DOR5=> z4, EOR5=> z5, f5or=> outQ3plus);

end behavior;

El banco de pruebas, se produce el siguiente resultado:

test bench simulation

Como se puede ver, la primera señal de algún comportamiento extraño, el siguiente trabajo señales aceptar, y el último es totalmente indefinido. Por supuesto, el final de la señal, la salida, es errónea.

Mi pregunta sería: ¿cómo puedo hacer un seguimiento de donde la señal empieza a conseguir dañado? Me siento como un total noob en este lío de un programa, y realmente quiero terminar esto. Gracias de antemano por cualquier respuesta.

9voto

Brian Drummond Puntos 27798

Es agradable ver una adecuada testbench y el código que realmente coincide con la pregunta para un cambio...

Hay dos maneras fáciles para que una señal sea dañado:

  • unidad de varias fuentes de señal
  • no conducir desde cualquier

Ahora A11 sigue siendo la 'U' en todo, lo que sugiere que no tiene controlador. Mientras que A1 alterna entre válido y 'X' valores no válidos, lo que sugiere que tiene más de un conductor.

Con eso en mente, la revisión de su código en el que conducir A1 y A11.

Se va a reír...

Para ampliar sobre el "cómo depurar" parte de la pregunta : después de haber despertado la sospecha de que las señales no fueron expulsados de las fuentes, podría utilizar Modelsim "drivers" de comando a la lista de los controladores en una señal. Si hubiera escrito un poco más detallado en VHDL, y etiquetados cada proceso, que se obtiene la misma respuesta sin tener que revisar el código...

por ejemplo,

Drive_A1 : process
begin
   a1 <= '0' ; wait for 4ns;
   ... etc

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