Primera solución
Vamos a solucionar el problema basándonos en el módulo
RS construido en el ejercicio anterior. Usando uno de esos módulos,
el problema nos queda según el siguiente esquema:
Procedemos a dar nombre a las puertas y a los cables que no lo tengan:
Construimos el módulo:
/* MOdulo RS copiado del ejercicio anterior */
module RS (output wire Q, output wire nQ, input wire R, input wire S);
nor n1(Q, R, nQ);
nor n2(nQ, S, Q);
endmodule
/* MOdulo RSC basado en el mOdulo RS anterior */
module RSC (output wire Q, output wire nQ, input wire R, input wire C, input wire S);
wire arriba;
wire abajo;
and a1 (abajo, R, C);
and a2 (abajo, C, S);
RS mario (Q, nQ, arriba, abajo);
endmodule
Por un procedimiento similar, construimos un módulo de prueba
con un módulo RSC, varios registros y cables para probarlo, y
una orden $monitor
para que haga el seguimiento de las
señales. Puede quedar algo como esto:
module test;
reg david;
reg victor;
reg silvia;
wire alvaro;
RSC adrian(alvaro, ,david,silvia,victor);
initial
begin
$monitor($time," C=%b, R=%b, S=%b, Q=%b", silvia, david, victor, alvaro);
david=0; victor=0; silvia=1;
#5 david=0; victor=1;
#5 david=0; victor=0;
#5 david=1; victor=0;
#5 david=1; victor=1;
#5 david=0; victor=0;
#5 david=1; victor=1;
#5 victor=0; david=0;
#5 david=0; victor=1; silvia=0;
#5 david=0; victor=0;
#5 david=1; victor=0;
#5 david=1; victor=1;
#5 david=0; victor=0;
#5 david=1; victor=1;
#5 victor=0; david=0;
#5 victor=0; david=0;
end
endmodule
El registro silvia
da cuenta de la señal de reloj.
Cuando este registro valga 0, el biestable es inmune a las señales
R y S. Comprobémoslo ejecutándolo:
0 C=1, R=0, S=0, Q=x
5 C=1, R=0, S=1, Q=x
10 C=1, R=0, S=0, Q=x
15 C=1, R=1, S=0, Q=x
20 C=1, R=1, S=1, Q=x
25 C=1, R=0, S=0, Q=x
30 C=1, R=1, S=1, Q=x
35 C=1, R=0, S=0, Q=x
40 C=0, R=0, S=1, Q=x
45 C=0, R=0, S=0, Q=x
50 C=0, R=1, S=0, Q=x
55 C=0, R=1, S=1, Q=x
60 C=0, R=0, S=0, Q=x
65 C=0, R=1, S=1, Q=x
70 C=0, R=0, S=0, Q=x
¡Ups! Parece que ha habido un error...
Depuración
El error parece que se produce en la salida Q. Las señales que
no controlamos y que pueden ser fuente del error son los cables internos
arriba
y abajo
del módulo
RSC
, que hemos llamado adrian
. Pues le decimos
a $monitor
que haga un seguimiento de esas señales
también:
$monitor($time," C=%b, R=%b, S=%b, arriba=%b, abajo=%b, Q=%b", silvia,
david, victor, adrian.arriba, adrian.abajo, alvaro);
Observad cómo usamos el operador punto (.
) para
acceder al interior de adrian
. Si ejecutamos, aparece:
0 C=1, R=0, S=0, arriba=z, abajo=0, Q=x
5 C=1, R=0, S=1, arriba=z, abajo=x, Q=x
10 C=1, R=0, S=0, arriba=z, abajo=0, Q=x
15 C=1, R=1, S=0, arriba=z, abajo=x, Q=x
20 C=1, R=1, S=1, arriba=z, abajo=1, Q=x
25 C=1, R=0, S=0, arriba=z, abajo=0, Q=x
30 C=1, R=1, S=1, arriba=z, abajo=1, Q=x
35 C=1, R=0, S=0, arriba=z, abajo=0, Q=x
40 C=0, R=0, S=1, arriba=z, abajo=0, Q=x
45 C=0, R=0, S=0, arriba=z, abajo=0, Q=x
50 C=0, R=1, S=0, arriba=z, abajo=0, Q=x
55 C=0, R=1, S=1, arriba=z, abajo=0, Q=x
60 C=0, R=0, S=0, arriba=z, abajo=0, Q=x
65 C=0, R=1, S=1, arriba=z, abajo=0, Q=x
70 C=0, R=0, S=0, arriba=z, abajo=0, Q=x
Se observa que el cable arriba
parece estar dando
problemas. Si revisamos el módulo RSC
, veremos
que es que nos habíamos equivocado justo ahí, en la
conexión de la puerta a1
, que debe decir:
and a1 (arriba, R, C);
Si ejecutamos ahora el módulo, el resultado ya es el correcto:
cuando el reloj es cero, R y S no afectan al biestable.
0 C=1, R=0, S=0, arriba=0, abajo=0, Q=x
5 C=1, R=0, S=1, arriba=0, abajo=1, Q=1
10 C=1, R=0, S=0, arriba=0, abajo=0, Q=1
15 C=1, R=1, S=0, arriba=1, abajo=0, Q=0
20 C=1, R=1, S=1, arriba=1, abajo=1, Q=0
25 C=1, R=0, S=0, arriba=0, abajo=0, Q=1
30 C=1, R=1, S=1, arriba=1, abajo=1, Q=0
35 C=1, R=0, S=0, arriba=0, abajo=0, Q=0
40 C=0, R=0, S=1, arriba=0, abajo=0, Q=0
45 C=0, R=0, S=0, arriba=0, abajo=0, Q=0
50 C=0, R=1, S=0, arriba=0, abajo=0, Q=0
55 C=0, R=1, S=1, arriba=0, abajo=0, Q=0
60 C=0, R=0, S=0, arriba=0, abajo=0, Q=0
65 C=0, R=1, S=1, arriba=0, abajo=0, Q=0
70 C=0, R=0, S=0, arriba=0, abajo=0, Q=0