Capítulo
8: PLD's Secuenciales
Ejemplos de ProgramaciÓn de PLDs Secuenciales
En el capitulo 4 se vieron las bases sobre la programación de PLD's con CUPL. En esta lección se indicarán algunos ejemplos para aplicaciones particulares desarrolladas en CUPL. Recordando lo visto en el capítulo 4, en este lenguaje el código fuente se dividide en tres partes: Encabezado, asignación de pines de entrada y salida y ecuaciones lógicas.
Los ejemplos ilustrados en esta lección fueron tomados de algunos fabricantes que han desarrollado estos códigos para aplicaciones particulares en sus dispositivos. Se plantea al estudiante analizar el código de estos ejemplos para comprender la forma en que se pueden programar en CUPL.
Ejemplo 8.2.1 - Uso de los flip-flop D en un PLD
| Name Flops; /****************************************************************/ Pin 1 = clock; /* Pin 19 = qa0; Pin 18 = qa1; /* /* two-bit counter example no. 1 */ qa0.d = !reset & !qa0; /* two-bit counter example no. 2 */ qb0.d = !reset & (!qb0 & !qb1 # !qb0
& qb1); /* two-bit counter example no. 3 */ field state = [qc1,qc0]; qc0.d = !reset & (state:0 # state:2); /* two-bit counter example no. 4 */ field q = [qd0,qd1]; q.d = !reset & ([!qd0,qd1] & [!qd1,!qd0] # [!qd0,!qd1] & [qd1,qd0]); |
Ejemplo 8.2.2 - Contador Sincrónico de 8 bits con Cargue en Paralelo
| Name Count8; /****************************************************************/ /** Inputs **/ PIN 1 = clock ; /* Register Clock */ /** Outputs **/ PIN 14 = !carry_out ; /* Carry-Out Output
*/ /** Declarations and Intermediate Variable Definitions **/ field instruction = [instr1..0]; /* Instruction
Field */ /** Logic Equations **/ carry_out = carry_in & [Q0..7]:& ; |
Ejemplo 8.2.3 - Contador Up/Down con Límites
| Name CYP_CNT; /* PIN 1 = CLK; /* Clock used for counting */ PIN [4..7] = [LL0..3]; /* Lower limit hold
registers */ /* PIN 28 = CNT0; /* Also used for Upper limit
loading */ PINNODE 29 = UEQUAL; /* Upper limit has been
reached */ PIN 16 = !RESET; /* Reset signal clears all
registers */ PINNODE 45 = UL0; /* Shared input MUX definition
*/ UL0.IMUX = CNT0.IOD; /* These definitions
are used to */ UL0 = CNT0.IOD; UPL.CKMUX = ULC; [CNT0..7].SR = RESET.DQ; /* Count register will be reset with pin 16 */ [CNT0..7].OEMUX = CNTOE; /* Output enable will be controlled by pin 14 */ /* !CNT0.D = !CNT0 !CNT1.D = !CNT1 !CNT2.D = !CNT2 !CNT3.D = !CNT3 !CNT4.D = !CNT4 !CNT5.D = !CNT5 !CNT6.D = !CNT6 !CNT7.D = !CNT7 /* Direction of count */ UP.D = UP /* Has the lower limit been reached */ LEQUAL.D = LL6.DQ & !CNT6 /* Has preloading finished */ PLDONE.D = !LPL.DQ & !UPL.DQ ; /* Has the upper limit been reached */ UEQUAL.D = !CNT6 & UL6.DQ |
Ejemplo 8.2.4 - Contador Up/Down de 16 bits
| Name Tcounter; /****************************************************************/ /** Inputs **/ Pin 1 = clock1; /* Counter Clock 1 */ /** Outputs **/ Pin [3..10,15..22] = [q0..15]; /* Counter/Shifter Outputs */ /** Declarations and Intermediate Variable Definitions **/ count_up = !shift & cntup & !shlft; Field counter = [q15..0]; /* Declared Counter Field */ /** Logic Equations **/ counter.t = 'h'0001 & (count_up &
'b'1 /* BIT 0 (LSB) */ counter.ar = reset_count; /* Resets the Counter */ |