Duda novato contador de cuenta arbitraria 4 bits

Muy buenas, lo primero he de decir que soy muy novato en el tema de la electrónica y aunque le hecho ganas no he conseguido mucha información sobre ecuaciones.

El caso es que tengo que realizar un contador de cuenta arbitraria de 4 bits, 4 biestables JK, que cuente 1 7 15 3 11 10 14 2 y vuelva a empezar. Hice una tabla para ver por donde transitaban unos estados a otros y el valor de la J y K:

http://imageshack.us/photo/my-images/27/tablatx.jpg/

Lo que no sé es como obtener las ecuaciones apartir de esta tabla, se que he de emplear Karnaugh, pero solo se usarlo para simplificar cosas muy básicas. Existe algún apunte o programa, algo que explique como sacar las ecucaciones?. Muchas gracias de antemano
 
No está mal cómo empezaste a encarar el tema, pero no es el método más efectivo.

Tampoco es muy factible que puedas encender automáticamente cada uno de los 4 flip flop de forma digital..

NO termino de entender si lo vas a pulsar a mano o tienen que hacer todo solos los FF?

Una alternativa muy buena es usar un contador de décadas y a la salida hacer arreglos de diodos para obtener los 4 bits...de la forma que vos queres...

si queres te paso un esquemita...

Edito: lo acabo de hacer y funciona perfecto ;)

Y si tenés que usar los FF's obligatoriamente, podés usar el circuito que te propuse para activar y desactivar los 4 FF's

Saludos.
 

Adjuntos

  • Contador arbitrario.JPG
    Contador arbitrario.JPG
    31.5 KB · Visitas: 35
Última edición:
Los FF son obligatorios, luego estos van a ir únicamente programados con verilog donde les voy a dar salida. Creo que ya he dado con lo que son las ecuaciones, en cuanto lo transcriba a puertas lógicas lo posteo.Gracias DJ DRACO :)
 
Uf entonces si es un viaje...yo te decia de ultima usar el circuito que te subi, pero para activar y desactivar los FF...y luego de ahi al contador..

Todo un viaje...espero que te vaya bien :)
 
Bueno hemos conseguido mi compañero de este trabajo y yo que nos salga la secuencia, pero se nos salta 2 numeros que somos incapaces de detectar. Pongo lo dado por si alguien detecta el fallo y nos puede ayudar. Muchas gracias

Secuencia a seguir

DECIMAL: 1 7 15 3 11 10 14 2
BINARIO: 0001 0111 1111 0011 1011 1010 1110 0010

Ecuaciones resultantes por Karnaugh de la tabla anterior:

J3 = Q1*Q0
K3 = !Q1 + Q0 + Q2

J2 = !Q3*!Q1*Q0 + Q3*Q1*!Q0
K2 = !Q0+!Q1+Q3

J1 = !Q3*!Q2*Q0
K1 = !Q3*!Q0

J0 = !Q1+!Q3
K0 = Q3*!Q2*Q1

Según esto nos sale el siguiente circuito:

http://imageshack.us/photo/my-images/46/circuitoeo.jpg/

Codificamos el circuito en verilog

module JK(output reg Q,output wire NQ, input wire J,input wire K, input wire C,input wire nPRESET,input wire nCLEAR);

not (NQ,Q);

initial
begin
Q=0;
end

always @(negedge C)
if(nPRESET && nCLEAR)
case ({J,K})
2'b10: Q=1;
2'b01: Q=0;
2'b11: Q=~Q;
endcase
always @(nPRESET,nCLEAR)
case ({nPRESET, nCLEAR})
2'b01: Q=1;
2'b10: Q=0;
endcase
endmodule

module contadorarbitrario4bit(output wire [3:0] Q,input wire C);
wire [3:0] NQ;
wire [5:0] so;
wire [9:0] sa;

/*Me he fijado en el esquema de derecha a izquierda, es decir el primero es el de mas arriba a la derecha y el última el de mas abajo a la derecha*/

or o1(so[0],NQ[3],NQ[1]);

and a1(sa[0],Q[0],Q[1]);


and a2(sa[1],NQ[2],NQ[3]);
and a3(sa[2],sa[1],Q[0]);

and a4(sa[3],NQ[1],NQ[3]);
and a5(sa[4],Q[1],Q[3]);
and a6(sa[5],NQ[0],sa[4]);
and a7(sa[6],Q[0],sa[3]);
or o2(so[1],sa[5],sa[6]);

and a8(sa[7],NQ[2],Q[3]);
and a9(sa[8],sa[7],Q[1]);

and a10(sa[9],NQ[0],NQ[3]);

or o3(so[2],NQ[1],NQ[0]);
or o4(so[3],so[2],Q[3]);

or o5(so[4],Q[0],NQ[1]);
or o6(so[5],so[4],Q[2]);

/*(output reg Q,output wire NQ, input wire J,input wire K, input wire C,input wire nPRESENT,input wire nCLEAR);*/


JK jk0(Q[0],NQ[0],so[0],sa[8],C,1'b1,1'b1);
JK jk1(Q[1],NQ[1],sa[2],sa[9],C,1'b1,1'b1);
JK jk2(Q[2],NQ[2],so[1],so[3],C,1'b1,1'b1);
JK jk3(Q[3],NQ[3],sa[0],so[5],C,1'b1,1'b1);
endmodule

module test;
wire [3:0] O;
reg C;

contadorarbitrario4bit ca4(O,C);
always #100 C=~C;

initial
begin
$dumpfile("datos.dmp");
$dumpvars(1,ca4);
$display("Inicial 0001");

ca4.jk0.Q<=1;ca4.jk1.Q<=0;ca4.jk2.Q<=0;ca4.jk3.Q<=0;

C=0;

$monitor ($time, " C: %b Serie: %b (%d) ",C,O,O);
#1300;


$finish;

end
endmodule

La salida, incorrecta, como veis no se que ocurre que salta del 11 directamente al 2, y tendría que haber una salida con el 10 y el 14.

http://imageshack.us/photo/my-images/32/pantallazodel2012010923.png/

Si alguien nos pudiera ayudar a encontrar el fallo estaría tremendamente agradecido, Gracias.
 
Atrás
Arriba