Primera solución
Vamos a solucionar el problema basándonos en el módulo
D construido en el ejercicio anterior. Usando cuatro de esos
módulos, dándoles nombre a ellos y a los cables sin
nombre, el problema nos queda según el siguiente esquema:
El resultado puede ser:
module D(output reg Q, input wire D, input wire C, input wire nCLR);
always@(negedge C)
begin
if (nCLR == 1)
begin
Q = D;
end
end
always @(nCLR)
begin
if (nCLR == 0)
begin
Q = 0;
end
end
initial
begin
Q = 0;
end
endmodule
module SISO (output wire O, input wire I, input wire C, input wire nCLR);
wire C1;
wire C2;
wire C3;
D B1 (C1, I, C, nCLR);
D B2 (C2, C1, C, nCLR);
D B3 (C3, C2, C, nCLR);
D B4 (O, C3, C, nCLR);
endmodule
La comprobación del módulo SISO la logramos
con sendos registros y un cable dentro de un módulo
de prueba sin entradas ni salidas, según el siguiente
esquema:
O, escrito en Verilog:
module probador;
reg lorena;
reg angelica;
reg pato;
wire javi;
SISO hector(javi, lorena, angelica, pato);
initial
begin
$dumpfile("datosSISO.dmp");
$dumpvars(1,hector);
$monitor($time, " I=%b, C=%b, O=%b, nCLR=%b",
lorena, angelica, javi, pato);
lorena=1; angelica=1; pato=0;
#5 pato=1;
#7 lorena=0;
#7 lorena=1;
#7 lorena=0;
#7 lorena=1;
#7 lorena=1;
#7 lorena=1;
#7 lorena=0;
#7 lorena=0;
#15 $finish;
end
always
begin
#7 angelica=~angelica;
end
endmodule
Como se puede observar, hemos añadido un bloque
always para que genere la señal de reloj
de periodo 14 unidades de tiempo en el registro angelica.
También se incluye el código necesario par hacer
un volcado de las variables internas del módulo principal
SISO hector. El volcado se hace en el fichero
datosSISO.dmp, con el objeto de poder ver las
señales con GTKwave. Compilamos con iverilog,
por ejemplo:
gyermo@neptuno:~/ASIGNATURAS/COMPUTADORES_I/WEB/TMP$ iverilog siso.v -o siso
gyermo@neptuno:~/ASIGNATURAS/COMPUTADORES_I/WEB/TMP$ ./siso
VCD info: dumpfile datosSISO.dmp opened for output.
0 I=1, C=1, O=0, nCLR=0
5 I=1, C=1, O=0, nCLR=1
7 I=1, C=0, O=0, nCLR=1
12 I=0, C=0, O=0, nCLR=1
14 I=0, C=1, O=0, nCLR=1
19 I=1, C=1, O=0, nCLR=1
21 I=1, C=0, O=1, nCLR=1
26 I=0, C=0, O=1, nCLR=1
28 I=0, C=1, O=1, nCLR=1
33 I=1, C=1, O=1, nCLR=1
35 I=1, C=0, O=1, nCLR=1
42 I=1, C=1, O=1, nCLR=1
49 I=1, C=0, O=1, nCLR=1
54 I=0, C=0, O=1, nCLR=1
56 I=0, C=1, O=1, nCLR=1
63 I=0, C=0, O=1, nCLR=1
70 I=0, C=1, O=1, nCLR=1
gyermo@neptuno:~/ASIGNATURAS/COMPUTADORES_I/WEB/TMP$ ls -l datosSISO.dmp
-rw-r--r-- 1 gyermo gyermo 507 2010-12-02 01:09 datosSISO.dmp
gyermo@neptuno:~/ASIGNATURAS/COMPUTADORES_I/WEB/TMP$ gtkwave datosSISO.dmp &
El cronograma obtenido resulta un tanto decepcionante. Era de
espear que con cada bajada del reloj, la señal se fuera
propagando desde I, por C1,
C2, C3 y hasta O.
Sin embargo, parece propagarse de golpe por C3 y
O:
Y lo más curioso de este asunto es que, si compilamos
el programa con cver, funciona bien.
¿Quién puede entender este despropósito?