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:
La siguiente cosa son los 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+:
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:
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.