COMPUTADORES I
PRÁCTICA FINAL: CONTADOR ARBITRARIO
GRUPO PA4
Alejandro García Arroyo
Javier Herrero García
OBJETIVOS Y ASPECTOS RELEVANTES
El trabajo propuesto es un contador arbitrario de 4 bits en el que se debe seguir la siguiente secuencia:
9-11-9-8-1-6-7-4-7
Y vuelta a empezar
En esta secuencia se puede ver que aparecen repetidos los números 9 y 7, por lo que los
sustituiremos por otros valores que no aparezcan en la secuencia. En nuestro caso, hemos sustituido
el 9 por el 3, y el 7 por el 5, quedando la secuencia así:
9-11-3-8-1-6-7-4-5
El circuito pues, deberá de estar formado por una señal de reloj, 4 biestables JK y puertas lógicas
AND, OR y XOR.
DESARROLLO
El diagrama de transición de estados quedará de la siguiente forma:
1011 0011 1000
0001
1001
0110
0101 0100 0111
Una vez creado el diagrama de transiciones, y con la ayuda de la tabla de transiciones del biestable JK
procedemos a crear la tabla de transiciones:
Tabla de transiciones del biestable JK:
Actual Siguiente J K
0 0 0 X
0 1 1 X
1 0 X 1
1 1 X 0
Tabla de transiciones:
Actual - Siguiente J3 K3 J2 K2 J1 K1 J0 K0
0000 - XXXX X X X X X X X X
0001 - 0110 0 X 1 X 1 X X 1
0010 - XXXX X X X X X X X X
0011 - 1000 1 X 0 X X 1 X 1
0100 - 0101 0 X X 0 0 X 1 X
0101 - 1001 1 X X 1 0 X X 0
0110 - 0111 0 X X 0 X 0 1 X
0111 - 0100 0 X X 0 X 1 X 1
1000 - 0001 X 1 0 X 0 X 1 X
1001 - 1011 X 0 0 X 1 X X 0
1010 - XXXX X X X X X X X X
1011 - 0011 X 1 0 X X 0 X 0
1100 - XXXX X X X X X X X X
1101 - XXXX X X X X X X X X
1110 – XXXX X X X X X X X X
1111 - XXXX X X X X X X X X
Tablas de Karnaugh:
Q1 Q0 Q3 Q2
J3 00 01 11 10 K3 00 01 11 10
00 X 0 X X 00 X X X 1
01 0 1 X X 01 X X X 0
11 1 0 X X 11 X X X 1
10 X 0 X X 10 X X X X
J2 00 01 11 10 K2 00 01 11 10
00 X X X 0 00 X 0 X X
01 1 X X 0 01 X 1 X X
11 0 X X 0 11 X 0 X X
10 X X X X 10 X 0 X X
J1 00 01 11 10 K1 00 01 11 10
00 X 0 X 0 00 X X X X
01 1 0 X 1 01 X X X X
11 X X X X 11 1 1 X 0
10 X X X X 10 X 0 X X
J0 00 01 11 10 K0 00 01 11 10
00 X 1 X 1 00 X X X X
01 X X X X 01 1 0 X 0
11 X X X X 11 1 1 X 0
10 X 1 X X 10 X X X X
Ecuaciones:
J3 Q1*nQ2 + nQ1*Q0*Q2 J2 nQ1*nQ3
K3 Q1 + nQ0 nQ1*Q0
K2
J1 Q0*03 + nQ3*nQ2 J0 1
K1 Q0*Q2 + nQ3*nQ2 Q1*nQ3 + nQ3*nQ2
K0
Obtenidas ya las ecuaciones, podemos hacer el diagrama de transición final:
Actual J3 K3 J2 K2 J1 K1 J0 K0 Siguiente
0 0000 0 1 1 0 1 1 1 1 0111 7
1 0001 0 0 1 1 1 1 1 1 0110 6
2 0010 1 1 0 0 1 1 1 1 1001 9
3 0011 1 1 0 0 1 1 1 1 1000 8
4 0100 0 1 1 0 0 0 1 0 0101 5
5 0101 1 0 1 1 0 1 1 0 1001 9
6 0110 0 1 0 0 0 0 1 1 0111 7
7 0111 0 1 0 0 0 1 1 1 0100 4
8 1000 0 1 0 0 0 0 1 0 0001 1
9 1001 0 0 0 1 1 0 1 0 1011 11
10 1010 1 1 0 0 0 0 1 0 0011 3
11 1011 1 1 0 0 1 0 1 0 0011 3
12 1100 0 1 0 0 0 0 1 0 0101 5
13 1101 1 0 0 1 1 1 1 0 1011 11
14 1110 0 1 0 0 0 0 1 0 0111 7
15 1111 0 1 0 0 1 1 1 0 0101 5
0110 0000
0111
0001 1110
0100
1000 1100
0101
1111
0011
1001
1011
1010 0010
1101
Tras deshacer el cambio de los valores repetidos en sucesión nos queda la siguiente tabla:
Inicial Q3 Q2 Q1 I3 I2 I1 I0 Final
Q0
0 0000 0 0 0 0 0 0 0 0 0000 0
1 0001 0 0 0 1 0 0 0 1 0001 1
2 0010 0 0 1 0 0 0 1 0 0010 2
3 0011 0 0 1 1 0 0 1 1 0011 3
4 0100 0 1 0 0 0 1 0 0 0100 4
5 0101 0 1 0 1 0 1 0 1 0101 5
6 0110 0 1 1 0 0 1 1 0 0110 6
7 0111 0 1 1 1 0 1 0 1 0101 5
8 1000 1 0 0 0 1 0 0 0 1000 8
9 1001 1 0 0 1 0 0 1 1 0011 3
10 1010 1 0 1 0 1 0 1 0 1010 10
11 1011 1 0 1 1 1 0 1 1 1011 11
12 1100 1 1 0 0 1 1 0 0 1100 12
13 1101 1 1 0 1 1 1 0 1 1101 13
14 1110 1 1 1 0 1 1 1 0 1110 14
15 1111 1 1 1 1 1 1 1 1 1111 15
Tablas de Karnaugh:
Q1 Q0 Q3 Q2
I3 00 01 11 10 I2 00 01 11 10
00 0 0 1 1 00 0 1 1 0
01 0 0 1 0 01 0 1 1 0
11 0 0 1 1 11 0 1 1 0
10 0 0 1 1 10 0 1 1 0
I1 00 01 11 10 I0 00 01 11 10
00 0 0 0 0 00 0 0 0 0
01 0 0 0 1 01 1 1 1 1
11 1 0 1 1 11 1 1 1 1
10 1 1 1 1 10 0 0 0 0
Ecuaciones:
I3 Q1*Q3 + Q3*Q2 + nQ0*Q3 I2 Q2
I1 Q1*nQ0 + Q1*Q3 + Q1*nQ2 + Q0*Q3*nQ2 I0 nQ1*Q0
CIRCUITO
Teniendo ya las ecuaciones del circuito arbitrario y las ecuaciones para deshacer el cambio,
queda el siguiente circuito:
PROGRAMA FINAL
// Modulo JK como los vistos en clase
module JK(output reg Q, output wire nQ, input wire J, input wire K, input
wire C);
initial Q = 0;
not(nQ, Q);
always @(negedge C)
case ({J, K})
2'b01: Q <= 0;
2'b10: Q <= 1;
2'b11: Q <= ~Q;
endcase
endmodule
module ContadorArbitrario (output wire [3:0] Q, output wire [3:0] I, input
wire C);
wire [3:0] nQ;
wire J0, K0, J1, K1, J2, K2, J3, K3;
// Generación de señales J y K
assign J0 = 1;
wire nQ2nQ3, Q1nQ3, Q0nQ1Q2, Q1nQ2;
and (nQ2nQ3, nQ[2], nQ[3]);
and (Q1nQ3, Q[1], nQ[3]);
or (K0, Q1nQ3, nQ2nQ3);
and (J1, Q[0], nQ[2]);
and (K1, Q[0], nQ[3]);
and (J2, nQ[1], nQ[3]);
and (K2, Q[0], nQ[1]);
and (Q0nQ1Q2, Q[0], nQ[1], Q[2]);
and (Q1nQ2, Q[1], nQ[2]);
or (J3, Q0nQ1Q2, Q1nQ2);
or (K3, nQ[0], Q[1]);
// Instanciar los módulos JK
JK JK0(Q[0], nQ[0], J0, K0, C);
JK JK1(Q[1], nQ[1], J1, K1, C);
JK JK2(Q[2], nQ[2], J2, K2, C);
JK JK3(Q[3], nQ[3], J3, K3, C);
// Asignaciones para el cambiador de secuencia
wire Q1nQ0, nQ1Q0, nQ3nQ2Q1, Q3nQ2, Q3nQ0, Q2Q1Q0, nQ2Q1;
// Asignaciones a I
assign I[0] = Q[2];
and (Q1nQ0, Q[1], nQ[0]);
and (nQ1Q0, nQ[1], Q[0]);
and (nQ3nQ2Q1, nQ[3], nQ[2], Q[1]);
or (I[2], Q1nQ0, nQ1Q0, nQ3nQ2Q1);
and (Q3nQ2, Q[3], nQ[2]);
and (Q3nQ0, Q[3], nQ[0]);
and (Q2Q1Q0, Q[2], Q[1], Q[0]);
or (I[1], Q3nQ2, Q3nQ0, Q2Q1Q0);
and (Q1nQ0, Q[1], nQ[0]);
and (nQ2Q1, nQ[2], Q[1]);
or (I[3], Q1nQ0, nQ2Q1);
endmodule
// Módulo de pruebas
module TestModulo;
reg C;
wire [3:0] Q;
wire [3:0] I;
ContadorArbitrario counter(Q, I, C);
always #5 C = ~C;
initial
begin
$dumpfile("[Link]");
$dumpvars;
// Inicializa la secuencia en el número 9 (Q = 1001)
force counter.JK0.Q = 1;
force counter.JK1.Q = 0;
force counter.JK2.Q = 0;
force counter.JK3.Q = 1;
C = 0;
$monitor($time, " Reloj (%b) Contador: Final |%d| |%b| Inicial
|%d||%b|", C, Q, Q, I, I);
#250;
$dumpoff;
$finish;
end
endmodule
RESULTADOS
Ejecutando el programa se pueden ver los siguientes resultados: