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?