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

11

Tengo que diseñar una máquina de estados utilizando solo puertas NAND para la parte combinatoria y flip flops D para la lógica secuencial. Todo debería funcionar a un reloj de 1ghz / 53.

Ahora, antes de atacarme con "no haremos tu tarea por ti", déjame decirte que deseché todo después de invertir días de trabajo y comencé a hacer todo de nuevo con más rigor. Quiero hacer esto por mi cuenta, pero constantemente recibo señales indefinidas aleatorias en las partes más simples del proyecto y es frustrante.

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

Losiguientesonloskmaps:

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

Pero mi primer problema surge en el banco de pruebas para Q3 +. Permítame ponerlo aquí para simplificar la información y un diagrama rápido que puse juntos para Q3 +:

MásadelanteenlapublicaciónverásqueenVHDLnombrélasentradasen1Q3plusain11Q3plus(11entradas),yaqueestenoeselbloquefinal(elbloquelógicocombinatoriofinalconsisteenloscuatroQ3+,Q2+,Q1+,Q0+bloquesconectadosaseñales).

AsíquetuvequehacertodousandocompuertasNAND,estosignificaquetuvequetomarunenfoqueestructural.CadacompuertasebasabásicamenteencompuertasNAND,yluegoseacumulaencomplejidad(perosololascompuertasAND,ORyNOTestánescritasestructuralmentedesdelascompuertasNAND).LuegotengounapuertaORcon3entradas,unapuertaANDcon3entradasyunapuertaORcon5entradas(comoenelejemplodeldiagramalógico),cadaunabasadaenlas2entradasAND&ORgatesanteriores.

CadabancodepruebashastaelQ3plus(eldiagramadearriba)funcionó.Miprocedimientodepruebaeshacerseñalesparacadaentrada,demodoquepuedoverlasseñalesenlaventanadeSimulación.Porejemplo,tengolassiguientesseñalesparaunapuertaANDde3entradas:

processbegina1<='0';waitfor4ns;a1<='1';waitfor4ns;endprocess;processbeginb1<='0';waitfor8ns;b1<='1';waitfor8ns;endprocess;processbeginc1<='0';waitfor2ns;c1<='1';waitfor2ns;endprocess;

Ylasconexionesseveríanasí:

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

Entonces,elproblemasurgecuandoquierosimularelbancodepruebasQ3plus.Parecequetengounerrordondemenosseespera,enunaseñaldepruebaquesimplementecambiade0a1conunperíodode2ns:|Publicaréaquíelcódigodelbancodepruebas,unavezmás,indicandoquetodoslosdemásbancosdepruebadelapuertafuncionaronalaperfección:

libraryieee;useieee.std_logic_1164.all;entityQ3plusTESTisendQ3plusTEST;architecturebehaviorofQ3plusTESTiscomponentQ3plusisport(outQ3plus:outstd_Logic;in1Q3plus:instd_Logic;in2Q3plus:instd_Logic;in3Q3plus:instd_Logic;in4Q3plus:instd_Logic;in5Q3plus:instd_Logic;in6Q3plus:instd_Logic;in7Q3plus:instd_Logic;in8Q3plus:instd_Logic;in9Q3plus:instd_Logic;in10Q3plus:instd_Logic;in11Q3plus:instd_Logic);endcomponent;signala1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,outsignal:std_logic;beginprocessbegina1<='0';waitfor4ns;a1<='1';waitfor4ns;endprocess;processbegina2<='0';waitfor6ns;a2<='1';waitfor6ns;endprocess;processbegina3<='0';waitfor8ns;a3<='1';waitfor8ns;endprocess;processbegina4<='0';waitfor10ns;a4<='1';waitfor10ns;endprocess;processbegina5<='0';waitfor12ns;a5<='1';waitfor12ns;endprocess;processbegina6<='0';waitfor14ns;a6<='1';waitfor14ns;endprocess;processbegina7<='0';waitfor16ns;a7<='1';waitfor16ns;endprocess;processbegina8<='0';waitfor18ns;a8<='1';waitfor18ns;endprocess;processbegina9<='0';waitfor20ns;a9<='1';waitfor20ns;endprocess;processbegina10<='0';waitfor22ns;a10<='1';waitfor22ns;endprocess;processbegina1<='0';waitfor24ns;a1<='1';waitfor24ns;endprocess;U1:Q3plusportmap(in1Q3plus=>a1,in2Q3plus=>a2,in3Q3plus=>a3,in4Q3plus=>a4,in5Q3plus=>a5,in6Q3plus=>a6,in7Q3plus=>a7,in8Q3plus=>a8,in9Q3plus=>a9,in10Q3plus=>a10,in11Q3plus=>a11,outQ3plus=>outsignal);endbehavior;

YelcódigoparaelbloqueQ3plusreales:

libraryieee;useieee.std_logic_1164.all;entityQ3plusisport(outQ3plus:outstd_Logic;in1Q3plus:instd_Logic;in2Q3plus:instd_Logic;in3Q3plus:instd_Logic;in4Q3plus:instd_Logic;in5Q3plus:instd_Logic;in6Q3plus:instd_Logic;in7Q3plus:instd_Logic;in8Q3plus:instd_Logic;in9Q3plus:instd_Logic;in10Q3plus:instd_Logic;in11Q3plus:instd_Logic);endQ3plus;architecturebehaviorofQ3plusiscomponentORgate5isport(AOR5:instd_logic;BOR5:instd_logic;COR5:instd_logic;DOR5:instd_logic;EOR5:instd_logic;f5or:outstd_logic);endcomponent;componentANDgate3isport(A:instd_logic;B:instd_logic;C:instd_logic;fand3:outstd_logic);endcomponent;componentANDgateisport(xand:instd_logic;yand:instd_logic;fand:outstd_logic);endcomponent;signalz1,z2,z3,z4,z5:std_logic;beginU1:ANDgateportmap(xand=>in1Q3plus,yand=>in2Q3plus,fand=>z1);U2:ANDgateportmap(xand=>in3Q3plus,yand=>in4Q3plus,fand=>z2);U3:ANDgateportmap(xand=>in5Q3plus,yand=>in6Q3plus,fand=>z3);U4:ANDgateportmap(xand=>in7Q3plus,yand=>in8Q3plus,fand=>z4);U5:ANDgate3portmap(A=>in9Q3plus,B=>in10Q3plus,C=>in11Q3plus,fand3=>z5);--urmeazatoateportiledemaisusconectatelaOR5U6:ORgate5portmap(AOR5=>z1,BOR5=>z2,COR5=>z3,DOR5=>z4,EOR5=>z5,f5or=>outQ3plus);endbehavior;

Elbancodepruebasproduceelsiguienteresultado:

Como puede ver, la primera señal tiene un comportamiento extraño, las siguientes señales funcionan bien y la última es completamente indefinida. Por supuesto, la señal final, la salida, es defectuosa.

Mi pregunta simple sería: ¿cómo hago un seguimiento de dónde comienza a corromperse la señal? Me siento como un noob total en este lío de un programa, y realmente quiero terminar esto. Gracias de antemano por cualquier respuesta.

    
pregunta Azurium

1 respuesta

9

Es agradable ver un banco de pruebas y un código adecuados que realmente coinciden con la pregunta para un cambio ...

Hay dos formas fáciles de corromper una señal:

  • conducirlo desde varias fuentes de señal
  • no lo conduzcas desde ninguna

Ahora A11 permanece en "U" en todo momento, lo que sugiere que no tiene controlador. Mientras que A1 alterna entre valores válidos y valores "X" no válidos, sugiere que tiene más de un controlador.

Teniendo eso en cuenta, revisa tu código donde conduces A1 y A11.

Te reirás ...

Para expandir la parte de la pregunta sobre "cómo depurar": al despertar la sospecha de que las señales no fueron controladas desde las fuentes esperadas, puede usar el comando "drivers" de Modelsim para enumerar los drivers de una señal. Si hubiera escrito VHDL un poco más detallado y etiquetado cada proceso, obtendría la misma respuesta sin tener que revisar su código ...

por ejemplo

Drive_A1 : process
begin
   a1 <= '0' ; wait for 4ns;
   ... etc
    
respondido por el Brian Drummond

Lea otras preguntas en las etiquetas