Professional Documents
Culture Documents
5.1.1
Entre las caractersticas mas destacadas de este sistema son las siguientes:
1 CPLD XC2C256-TQ144
111
1 CPLD XC9572XL-VQ44
1 puerto JTAG para programacin de los dos CPLDs.
1 oscilador en placa de 1.8432 MHz que puede ser cambiado.
Conectores externos disponibles para todos los pines de los 2 CPLDs.
1 pulsante nico conectado a 1 entrada de cada CPLD.
1 LED para cada uno de los CPLD
5.1.2
D isplay
7 seg
Leds
Fuente
fija
O .C .
D rivers
Fuente
variable
4 digitos
B l o que
7 4LV y 7 4 H C
Teclado
m atriz
R S232
Pulsantes y
sw itches
C onectores SIP
112
5.2
113
5.2.1
114
el
Top
115
116
117
utiliza para poder hacer un seguimiento paso a paso o continuo por las
definiciones en nuestro cdigo HDL, tambin se presentara un diagrama de
tiempos para su anlisis.
Despus de haber realizado las pruebas necesarias para nuestro modulo y
realizado las correcciones requeridas, el prximo paso seria implementar
nuestro diseo en el dispositivo que se eligi usar. Para esto debemos
definir las restricciones
primero, para esto utilizamos la opcin User
Constraints y corremos el proceso Assign package pins este abrir un
programa llamado PACE en donde podemos asignar los pines a nuestras
entradas y salidas de nuestro modulo, tambin podremos definir los niveles
de voltaje y tipos como LVTTL, CMOS3.3, CMOS2.5 etc. Si requerimos tener
colectores abiertos en las salidas entre otras opciones. Las restricciones
abarcan una gran cantidad de propiedades que se pueden definir, mediante
PACE nicamente seleccionamos las restricciones de emplazamiento en el
chip. Restricciones de tiempos u otras ms avanzadas se las puede definir
utilizando el editor de restricciones o describiendo en un archivo de texto
las restricciones. Xilinx provee todo un manual completo sobre el uso y
propiedades de las restricciones para usarlas tanto en FPGAs y CPLDs. Para
nuestro propsito utilizaremos nicamente restricciones asignadas por
PACE.
Una vez definido nuestras restricciones, buscamos el proceso Implement
Design, que abarca algunos procesos ya utilizados antes y algunos nuevos
que nicamente se pueden correr si tenemos definidas nuestras
restricciones, tales como Fit y Translate. El primero se encarga de encajar
nuestro diseo en el dispositivo seleccionado utilizando las restricciones
definidas y los archivos generados por Translate.
Tambin se corre el proceso que genera los archivos de programacin para
ser implementados en el CPLD o FPGA a travs del programa IMPACT. y el
programa Impact y el respectivo cable de programacin JTAG.
Esta breve explicacin constituye una pequea introduccin al uso del
programa ISE y la implementacin de un diseo a travs de este programa.
La documentacin existente para cada proceso y algunos no citados aqu es
muy extensa. Es recomendable revisar esta informacin para obtener
mayores detalles y caractersticas operativas de ISE.
5.3
Ejemplos Prcticos.
En este numeral se vern algunos ejemplos prcticos a manera didctica de
tal forma que se pueda comprender mejor el proceso de diseo digital
utilizando lenguaje HDL Verilog y el programa de desarrollo ISE.
Los primeros ejemplos demostraran mdulos muy generales y tiles que
sern posteriormente utilizados en otros ejemplos mas complejos.
118
5.3.1
Diseo:
Para lograr este diseo se ha dividido en partes al sistema, primeramente
se ha creado un modulo llamado BCD7SEG que se encarga de codificar la
entrada de BCD en cdigo 7 segmentos activo a nivel lgico 0. La tabla 5.1
muestra el contenido de la tabla creada para la decodificacin.
CODIGO BCD
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111
CODIGO 7 SEGMENTOS
0000001
1001111
0010010
0000110
1001100
0100100
0100000
0001111
0000000
0001100
0001000
1100000
1110010
1000010
0110000
0111000
CARCTER
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
El modulo de BCD7SEG utiliza una salida a tres estados que se logra con la
seal de entrada de habilitacin "enable", cuando esta lnea se encuentra a
nivel lgico 0 las salidas del decodificador se activan caso contrario
permanecen en alta impedancia. El propsito de esto es de poder unir mas
mdulos de este tipo de acuerdo al numero de
displays que tenga el
sistema y controlar mediante la activacin de "enable" cual de los mdulos
ser activo.
119
BCD[3:0]
7SEG
BCD7SEG
En
CLK
Divisor
Cont
/
mux
BCD[7:4]
BCD7SEG
En
BCD[11:8]
BCD7SEG
En
D1
7
BCD[15:12]
D2
D3
D4
BCD7SEG
Display4BCD
En
120
input [15:0]InBCD;
output [3:0]OutEnables;
output [6:0]Data7seg;
reg [3:0]OutEnables = 4'b1110;
reg [11:0]Divisor = 12'b0;
reg [3:0]Auxiliar=4'b0001;
// 0
121
Esquema RTL:
122
Simulaciones y pruebas:
Para las simulaciones del sistema se defini un archivo tipo Test Bench
utilizando el asistente que proporciona el programa ISE. En este archivo se
defini el valor del reloj, y las entradas de comprobacin que en este caso
es el patrn en BCD 16'h1234.
Dir
Con A
Con B
Con D
CoolRunner II pin
33
10
34
35
36
37
38
39
123
OUT0
19
21
OUT1
20
22
OUT2
21
23
OUT3
22
24
CLK
5.3.2
Diseo.
Para la implementacin del manejador de teclado matriz se ha dispuesto
un modulo principal al cual se lo denomin KeyScan.
Este modulo esta
conformado por varios sub-modulos los cuales iremos detallando a
continuacin.
124
En la figura
5.6 podemos observar el diagrama de bloques del modulo
decodificador de teclado matriz.
Esquema de Bloques:
MTXDecoder
F1
F2
F3
F4
Registro
F1
F2
Q0
D0
Q0
F3
Q1
D1
Q1
F4
Q2
D2
Q2
Q3
D3
Q3
En
C1
C1
C2
C3
Q0
Q1
Q2
Q3
C2
C3
CLK
Registro
Contador Decoder
O_1
D0
Q0
O_2
D1
Q1
O_3
D2
Q2
D3
Q3
O_4
Q4
Q5
Q6
Q7
CLK
En
Divisor
Registro
CLKO_2
CLK
CLK
CLKO_1
D0
Q0
D1
Q1
D2
Q2
D3
Q3
Q8
Q9
Q10
Q11
En
Monoestable
CLK
Pulso
Registro
Trigger
D0
Q0
D1
Q1
D2
Q2
D3
Q3
Q12
Q13
Q14
Q15
En
RDY
KEYSCAN
125
wire TRIGGER;
wire [3:0] EnFFD;
wire RDY;
wire Disable;
assign TRIGGER = |COLUMNAS;
assign Q[3:0] = Q1;
assign Q[7:4] = Q2;
assign Q[11:8] = Q3;
assign Q[15:12] = Q4;
PulseGen PULSE(CLK1, TRIGGER, PULSEOUT);
MTXDecoder MTX(CLK2, FILAS, COLUMNAS, OUTCODE);
Divisor DIV(CLK, CLK1, CLK2);
Habilitador SHIFT2(PULSEOUT, EnFFD);
FFD FF1(OUTCODE, EnFFD[0], Q1);
FFD FF2(OUTCODE, EnFFD[1], Q2);
FFD FF3(OUTCODE, EnFFD[2], Q3);
FFD FF4(OUTCODE, EnFFD[3], Q4);
endmodule
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Modulo decodificador de teclado, utiliza un contador de 4 estados y un
// decodificador de 2 a 4 para generar el pulso de salida para las filas. En
// las columnas recibe la informacin si una tecla ha sido pulsada y la decodifica
//colocando el valor del codigo en OUTCODE
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
module MTXDecoder(CLK ,FILAS, COLUMNAS, OUTCODE);
input CLK;
output [3:0]FILAS;
input [2:0]COLUMNAS;
output reg [3:0]OUTCODE = 4'b0;
reg [1:0]Contador = 2'b0;
Selector2a4 LS139(Contador, FILAS);
126
begin
case(COLUMNAS)
1: OUTCODE <= 4'd7;
2: OUTCODE <= 4'd8;
4: OUTCODE <= 4'd9;
endcase
end
3: begin
case(COLUMNAS)
1: OUTCODE <= 4'd10;
2: OUTCODE <= 4'd0;
4: OUTCODE <= 4'd12;
endcase
end
endcase
end
endmodule
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
module Selector2a4(S, Salida);
input [1:0] S;
output reg [3:0] Salida=4'b0001;
always@*
case (S)
0:
1:
127
2:
3:
endcase
endmodule
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Modulo que crea un pulso de duracion igual a N pulsos del reloj de entrada
// definido por CLK, los pulsos se definen en el parametro VALORPULSO, la
// salida es re-trigerable, es decir si se mantiene el valor de TRIGGER en
// 1 la salida repetira el pulso
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
module PulseGen(CLK, TRIGGER, PULSEOUT );
input CLK;
input TRIGGER;
output reg PULSEOUT=0;
reg [15:0]Cont = 16'b0;
parameter VALORPULSO = 20;
always @(negedge CLK )
begin
if(TRIGGER & !PULSEOUT)
PULSEOUT <= 1;
else if(PULSEOUT)
begin
if(Cont==VALORPULSO-1)
begin
PULSEOUT <=0;
Cont <= 0;
end
else
Cont <= Cont + 1'b1;
end
end
endmodule
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Modulo que sintetiza un divisor de frecuentcia, tiene como entrada la seal
// de CLK y como salida la seal de CLKOUT, la frecuencia se divide utiliazando
// el parametro VALORDIVISOR, el maximo valor de frecuencia posible a dividir
// es 2^18.
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
module Divisor(CLK, CLKOUT1, CLKOUT2);
128
input CLK;
output reg CLKOUT1=1;
output reg CLKOUT2=1;
reg [17:0]Cont = 18'b0;
parameter VALORDIVISOR2 = 15'h4000;//16384;//1KHz fecuencia de muestreo
parameter VALORDIVISOR1 = VALORDIVISOR2/2;//15'h2;
always @(posedge CLK)
begin
if(Cont == (VALORDIVISOR1-1))
begin
CLKOUT1 <= ~CLKOUT1;
end
if(Cont == (VALORDIVISOR2-1))
begin
CLKOUT2 <= ~CLKOUT2;
CLKOUT1 <= ~CLKOUT1;
Cont <= 0;
end
else
Cont <= Cont + 1'b1;
end
endmodule
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Modulo que sintetiza un registro de desplazamiento, tiene como entrada la
// seal de CLK y salida un registro de cuatro bits OUTREG, se desplaza un 1
// en OUTREG con cada flanco de subida de CLK
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
module Habilitador(CLK, OUTREG);
input CLK;
output [3:0] OUTREG ;
wire [3:0]OUTR;
reg [1:0] aux_cont = 2'b0;
Selector2a4 LS139(aux_cont, OUTR);
assign OUTREG[0] = OUTR[1] & CLK;
assign OUTREG[1] = OUTR[2] & CLK;
assign OUTREG[2] = OUTR[3] & CLK;
assign OUTREG[3] = OUTR[0] & CLK;
always @(posedge CLK)
aux_cont <= aux_cont+ 1'd1;
129
endmodule
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Modulo que sintetiza un FLIP-FLOP tipo D de cuatro canales.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
module FFD(D, Enable, Q);
input [3:0]D;
input Enable;
output reg [3:0]Q = 4'b0;
always @(Enable)
if(Enable)
Q <= D;
endmodule
Esquema RTL:
Simulaciones y pruebas:
Para poder
simulaciones
el
130
Implementacin Fsica:
Seal
Dir
Con A
Con B
Con D
CoolRunner pin
A (Salida7Seg_6)
33
10
34
35
36
37
38
G (Salida7Seg_0)
39
OUT0
19
21
OUT1
20
22
OUT2
21
23
OUT3
22
24
CLK
COLUMNAS0
142
COLUMNAS1
140
COLUMNAS2
139
FILAS0
10
136
FILAS1
11
135
FILAS2
12
134
FILAS3
13
133
PULSEOUT
14
132
131
5.3.3
de
Descripcin.
Se requiere disear un contador sncrono MOD1000 con entrada para un
pulsante de inicio/paro, entrada de reset y salida para visualizacin en un
display de 4 dgitos a 7 segmentos, tambin debe poseer una entrada de
selector de conteo arriba/abajo y capacidad de carga por teclado.
Requerimientos.
Selector de Inicio/Paro
Selector de conteo Rpido/Lento
Selector de conteo Arriba/Abajo
Entrada de Reset.
Numero MOD 10000
Posibilidad de carga por teclado
Visualizacin en display de LED 7 segmentos.
Diseo.
Para lograr el diseo se ha dividido al circuito en 4 partes, modulo GenCLK,
que se encarga de dividir la frecuencia de acuerdo a la entrada R/L
(Rapido/Lento), modulo Display4BCD, que es el encargado de realizar el
manejo del display de 7 segmentos, modulo KeyScan que maneja el teclado
matricial de 3x4 y modulo contador que es el encargado de realizar el
conteo, este modulo trabaja en BCD directamente, realiza conteo
arriba/debajo de acuerdo a la seal Ar/Ab.
La salida del modulo contador va directamente al modulo Display4BCD para
la visualizacin. Este modulo tambin recibe la informacin del modulo
KeyScan que modifica directamente el valor de los contadores para realizar
la carga por teclado.
132
Esquema de Bloques:
CLK
DISPLAY 7 segmentos
1
7
GenCLK
R/L
Display4BCD
4
1
RST
Hab
Ar/Ab
16
Contador BCD
MOD 1000
CLK
4
16
KeyScan
Contador
FIGURA 5.11: Esquema en bloques Modulo Contador.
Implementacin:
En el codigo descrito a continuacin no se ha incluido el cdigo de los
mdulos Display4BCD y KeyScan ya que estos ya fueron descritos
anteriormente, solamente se encuentra las instancias de estos.
Cdigo Verilog.
//////////////////////////////////////////////////////////////////////////////
//Modulo principal del sistema, incluye el contador,
//el modulo de visualizacion, control de teclado matriz
// y generador de frecuencias de conteo que es un divisor
// de la frecuencia del reloj en 2 frecuencias para alimentar
// al contador
//////////////////////////////////////////////////////////////////////////////
module TOP(CLK, UpDn, ResetG, Enable, SlowFast, OutEnab, Salida7seg,
FILAS, COLUMNAS, PULSEOUT, Carga);
input CLK;
input ResetG;
input UpDn;
input Enable;
input SlowFast;
133
//////////////////////////////////////////////////////////////////////////////////////////
//Contador sincrono con entrada Habilitacion, reset,
//cuenta mientras la habilitacion este en estado 1 y hasta un
//maximo definido en el parametro MAX_CONTEO.
//Cuenta en BCD en vector Contador de 16 bits
/////////////////////////////////////////////////////////////////////////////////////////
module Contador(InCONT, UpDn, Reset, Enable, Contador, Q, Carga);
parameter MAX_CONTEO = 16'b1001_1001_1001_1001;
input InCONT;
input Reset;
input UpDn;
input Enable;
output [15:0] Contador;
reg [15:0] Contador;
input [15:0]Q;
input Carga;
initial
Contador[15:0]=16'b0000_0010_0011_0101;
134
135
begin
if(Contador == 0)
Contador<=MAX_CONTEO;
else
begin
if(Contador[3:0]== 0)
begin
Contador[3:0] <= 9;
if(Contador[7:4]== 0)
begin
Contador[7:4]<=9;
if(Contador[11:8]== 0)
begin
Contador[11:8]<=9;
if(Contador[15:12]
==
0)
Contador[15:12]<=9;
else
Contador[15:12]<=Contador[15:12]-1;
end
else
Contador[11:8]<=Contador[11:8]-1;
end
else
Contador[7:4]<=Contador[7:4]1;
end
else
Contador[3:0]<=Contador[3:0]-1;
end
end
end
end
endmodule
//////////////////////////////////////////////////////////////////////////////////////////////////
//Modulo generador de clock
//Se encarga de dividir la frecuencia de entrada al contador en 2
//frecuencias para eso se implementa un contador con 2 parametros
//de conteo, SLOW y FAST que estan controlados por la seal de
//SlowFast.
/////////////////////////////////////////////////////////////////////////////////////////////////
module GenFrec(CLK, SlowFast, OUTCLK);
136
Esquema RTL:
137
Simulaciones y pruebas:
En las figuras 5.14 a y 5.14b se muestran los diagramas de tiempos para el
contador. Ntese que el valor de Q posee el valor para la carga del
contador. El valor inicial del contador se lo a fijado en 16'd565 y al valor de
la carga en 16'd4660, equivalente a 16'h1234.
138
Implementacin Fsica:
Dir
Con A
A (Salida7Seg_6)
Seal
33
Con B
Con D
CoolRunner pin
10
34
35
36
37
38
G (Salida7Seg_0)
39
OUT0
19
21
OUT1
20
22
OUT2
21
23
OUT3
22
24
CLK
Carga
41
ResetG
39
UpDn
40
Enable
11
35
SlowFast
10
34
OutCLK
40
COLUMNAS0
142
COLUMNAS1
140
COLUMNAS2
139
FILAS0
10
136
FILAS1
11
135
FILAS2
12
134
FILAS3
13
133
PULSEOUT
14
132
5.3.4
139
Descripcin.
En esta aplicacin se disear un controlador simple para un
pasos de 4 fases unipolar. Este controlador realizara funciones
como generacin de las seales para las bobinas, movimiento
atrs y habilitacin y des-habilitacin de las salidas al modulo de potencia.
Todas estas funciones se realizaran en modo "FULL-STEP" o
completo.
motor de
simples
adelante,
de paso
Requerimientos.
Diseo.
Los motores de pasos unipolares de 4 fases poseen 2
una
toma central que comnmente es alimentada con una tensin positiva.
B
bobinados
140
con
A
A
B
B
A/R
Hab.
141
DISPLAY 7 segmentos
1
CLK
7Seg
Divisor
Display4BCD
CLK
Enb
InBCD
SloFst
CLK2
16
1
Contador
1
Pulsos
SloFst
U/D
Contador
U/D
CLK
Comparadores
A/R
Hab.
A
A
B
B
Drive r
ModuloTOP
Implementacin:
//////////////////////////////////////////////////////////////////////////////////
// Modulo de Prueba para modulo control de motor de pasos
// genera 2 frecuencias a partir de la frecuencia del
// reloj del sistema, se escoge la frecuencia con la seal
// SloFast. Se utiliza modulos de display, contadores sincronos
// y el divisor de frecuencia, y el modulo de prueba MotorDriver
//////////////////////////////////////////////////////////////////////////////////
module ModuloTOP(CLK, OutEnab, Data7seg, OUTREG, Reset, CLK2);
input CLK, Reset;
output [3:0]OutEnab;
output [6:0]Data7seg;
output CLK2;
wire [15:0] Contador;
wire CLK;
wire CLK2;
reg SloFast=0;
reg Enable=1;
reg F_R=1 ;
output [3:0]OUTREG;
reg [15:0] ValorMAX =16'd16;
reg [15:0] ValorMED =16'd8;
reg Top=0;
142
143
always@(posedge CLK)
begin
if(SloFast)
begin
if(Divisor >= SLO_PARAM1-1)
begin
Divisor <= 4'b0000;
CLK2 <= ~CLK2;
end
else
Divisor <= Divisor + 1'b1;
end
else
begin
if(Divisor >= SLO_PARAM2-1)
begin
Divisor <= 4'b0000;
CLK2 <= ~CLK2;
end
else
Divisor <= Divisor + 1'b1;
end
end
endmodule
///////////////////////////////////////////////////////////////////
//Modulo MotorDriver
//
///////////////////////////////////////////////////////////////////
module MotorDriver(CLK, Enable, OUTREG, F_R);
input CLK, F_R, Enable;
output [3:0]OUTREG;
wire CLK, F_R, Enable;
GeneradorSecuencia GEN1(CLK, Enable, OUTREG, F_R);
endmodule
//////////////////////////////////////////////////////////////////////////////////////
// Modulo generador de secuencias para drivers de bobinas
// para motor de pasos unipolar
//////////////////////////////////////////////////////////////////////////////////////
module GeneradorSecuencia(CLK, Enable, OUTREG, F_R);
input CLK;
input F_R;
input Enable;
output [3:0] OUTREG ;
144
wire [3:0]OUTR;
reg [1:0] aux_cont = 2'b0;
Selector2a4 LS139(aux_cont, OUTR);
145
else
begin
if(Contador[3:0]== 9)
begin
Contador[3:0]<= 0;
if(Contador[7:4]== 9)
begin
Contador[7:4]<=0;
if(Contador[11:8]== 9)
begin
Contador[11:8]<=0;
if(Contador[15:12] == 1)
Contador[15:12]<=0;
else
Contador[15:12]<=Contador[15:12]+1;
end
else
Contador[11:8]<=Contador[11:8]+1;
end
else
Contador[7:4]<=Contador[7:4]+1;
end
else
Contador[3:0]<=Contador[3:0]+1;
end
end
else
begin
if(Contador == 0)
Contador<=MAX_CONTEO;
else
begin
if(Contador[3:0]== 0)
begin
Contador[3:0] <= 9;
if(Contador[7:4]== 0)
begin
Contador[7:4]<=9;
if(Contador[11:8]== 0)
146
begin
Contador[11:8]<=9;
if(Contador[15:12] == 0)
Contador[15:12]<=9;
else
Contador[15:12]<=Contador[15:12]-1;
end
else
Contador[11:8]<=Contador[11:8]-1;
end
else
Contador[7:4]<=Contador[7:4]-1;
end
else
Contador[3:0]<=Contador[3:0]1;
end
end
end
end
endmodule
Simulaciones y pruebas:
En las figuras 5.18 se muestra el diagramas de tiempos para el modulo
MotorDriver. En las pruebas de funcionamiento se definieron las seales de
entrada de enable, F_R (adelante/Reversa) de la forma indicada para poder
probar las distintas respuestas del modulo, obtenindose los resultados
esperados. Obviamente los valores de los tiempos del reloj son nicamente
para propsitos de prueba.
147
Implementacin Fsica:
Dir
Con A
A (Salida7Seg_6)
Seal
33
Con B
Con D
CoolRunner pin
10
34
35
36
37
38
G (Salida7Seg_0)
39
OUT0
19
21
OUT1
20
22
OUT2
21
23
OUT3
22
24
CLK
Reset
OUTREG0
36
105
OUTREG1
37
104
OUTREG2
38
103
OUTREG3
39
102
CLK2
40
101
39
5.4
5.4.1 Introduccin.
En los numerales anteriores se revisaron algunos ejemplos prcticos de
diseo digital de hardware. En este numeral se plantea el diseo de un
controlador para un panel de LEDs. bsicamente, esta fu la razn que
motiv el desarrollo del tema del diseo de hardware utilizando el lenguaje
descriptivo Verilog como tema de esta tesis.
Paneles de mensaje variable y paneles grficos basados en diodos emisores
de luz (LEDs), en la actualidad son muy populares. Uno de los mtodos mas
comunes para manejo de tableros de mensajes variables o paneles grficos
es el esquema de multiplexaje de matrices de leds dispuestos en paneles.
El multiplexaje puede tener algunas variantes,
entre los mas utilizados
estn multiplexaje a 2, 4, 8 y algunos ingenieros utilizan valores superiores.
El manejo de paneles multiplexados tiene algunas ventajas en contraste
con los sistemas de manejo directo, entre algunas de estas ventajas
podemos citar: reduccin del consumo de potencia, por lo tanto reduccin
148
5.4.2 Descripcin.
Antes de explicar el diseo del controlador es necesario dejar algunos
conceptos en claro. Un tablero de LEDs esta formado por varios mdulos, y
estos mdulos a su vez por varios paneles. Cada panel es un arreglo de n x
m LEDs de acuerdo al criterio de cada diseador. De acuerdo al esquema
de manejo del panel puede un tablero poseer uno o varios procesadores.
El controlador del panel de LEDs multiplexado se ha diseado para
controlar un panel formado por una matriz de 6 x 8 LEDs, el diseo puede
ser acoplado para matrices mas grandes de acuerdo a las necesidades y
capacidades del hardware utilizado.
El concepto para el desarrollo de este manejador es el de eliminar el
procesador de cada panel encargado de realizar las funciones de
comunicacin
y
manejo
de
la
matriz
de
leds,
y
reemplazar
por
un
controlador
que
se
interfase
directamente
al
procesador
principal
de
149
5.4.2
150
VLED
Mane ja do r Fil a s
F1
F2
F3
F4
F5
F6
C7
C6
C5
C4
C3
C2
C1
DR V
Col u mn as
DRV FILAS
C0
Manejador Columnas
Divisor /
selector
Buffer In (8 bits)
DatoOut 0
DatoIn 0
F2
DatoOut 1
DatoIn 1
F3
DatoOut 2
DatoIn 2
F4
DatoOut 3
DatoIn 3
F5
DatoOut 4
DatoIn 4
F6
DatoOut 5
DatoIn 5
Cristal
1.832Mhz
Interfase Com.
d0
d7
WR
Stb
Controlador de panel
F1-F6
Lneas de salida, activas a nivel bajo, estas lneas se conectan a los drivers
de fuente que alimentan a los nodos de los LEDs.
C1-C8
Lneas de salida, activas a nivel lgico bajo, estas lneas se conectan a los
drivers drenadores. Los ctodos de los LEDs deben conectarse a los
drenadores.
5.4.3
Funcionamiento.
El controlador de panel debe ser controlado por el procesador principal
mediante 10 lneas, 8 de datos y 2 de control la operacin del controlador
151
se realiza de acuerdo a la tabla 5.6. Los estados indicados con una flecha
ascendente indican que la seal es sensible al flanco.
ESTADO
Inactivo
Escribir Dato
Actualizar Datos
Reset Dispositivo
WR
L
H
L
H
Stb
L
L
H
H
Notas
Realiza operacin de actualizacin de pantalla
Debe recibir 6 pulsos/dato + 1 de actualizacin
Actualiza Buffer Out con datos de Buffer In
Reinicia al dispositivo
D0
Byte 0
Byte 1
Byte 2
Byte 3
Byte 4
Byte 5
FIGURA 5.20: Disposicin memoria de ingreso y salida con respecto a la matriz de LEDS
Estados
0
1
2
3
4
5
Posicin Memoria
(Columnas)
~Byte 0
~Byte 1
~Byte 2
~Byte 3
~Byte 4
~Byte 5
Reg. Desplazamiento
F1 (111110)
F2 (111101)
F3 (111011)
F5 (110111)
F5 (101111)
F6 (011111)
152
WR
X0
D7-D0
X1
X2
X3
X4
X5
X6
Str
C. Est.
B.Out
B
B
0
2
B
B
1
3
B
B
2
4
B
B
B
B
3
5
B
B
B
B
4
0
B
0
5
2
B
B
2
B
1
3
B
B
B
B
3
5
B
4
B
5
B
0
1
3
2
4
3
5
4
0
B
X
1
4
B
X
2
5
X
3
X
X
0
3
X
X
X
X
1
4
2
5
B
0
B
B
1
2
F1
F2
F3
F4
F5
F6
5.4.4
Codigo Verilog.
///////////////////////////////////////////////////////////////////////////////////////////////////
// Modulo Top controlador de panel de 6x8 para panel multiplexado
// de LEDs.
// ////////////////////////////////////////////////////////////////////////////////////////////////
module TopLedDrv(CLK, RESET, DataIn, WR, Stb, DataOut, OutSources);
input CLK, RESET;
input [7:0] DataIn;
//PC
input WR, Stb;
output [7:0] DataOut; //LED
output [5:0] OutSources;
wire [5:0] OutN;
//PC
//LED
153
= 3'd6;
//7:0
//7:0
154
//7:0
//7:0
initial
begin
RegOut[0]=1;
RegOut[1]=2;
RegOut[2]=3;
RegOut[3]=4;
RegOut[4]=5;
RegOut[5]=6;
RegistroIn[0]=0;
RegistroIn[1]=0;
RegistroIn[2]=0;
RegistroIn[3]=0;
RegistroIn[4]=0;
RegistroIn[5]=0;
OutSources=6'b1000;
AddrIn = 0;
end
/*********** Carga de Datos **************************/
always@(posedge WR)
if(Stb==0)
begin
if(AddrIn >= MEMLONG)
AddrIn <= 0;
else
begin
RegistroIn[AddrIn] <= DataIn;
AddrIn <= AddrIn + 1'b1;
end
end
always@(posedge Stb)
begin
RegOut[0] <= RegistroIn[0];
RegOut[1] <= RegistroIn[1];
RegOut[2] <= RegistroIn[2];
RegOut[3] <= RegistroIn[3];
RegOut[4] <= RegistroIn[4];
RegOut[5] <= RegistroIn[5];
end
/*********** Barrido del Puerto y Memoria ***********************/
always@(posedge CLK or posedge RESET)
if(RESET)
155
AddrOut <= 0;
else
if(!Stb)
if(AddrOut >= MEMLONG-1)
begin
AddrOut <= 0;
end
else
begin
AddrOut <= AddrOut + 1'b1;
end
always@(posedge CLK or posedge RESET)
begin
if(RESET)
OutSources <= 6'b1000;
else
case (AddrOut)
3'd5 : OutSources <= 6'b000001;
3'd0 : OutSources <= 6'b000010;
3'd1 : OutSources <= 6'b000100;
3'd2 : OutSources <= 6'b001000;
3'd3 : OutSources <= 6'b010000;
3'd4 : OutSources <= 6'b100000;
endcase
end
// 0
// 0
// 0
// 0
// 0
// 0
156
Asignacin de pines
La lista siguiente muestra el detalle de las lneas utilizadas en el diseo, se
puede observar el nombre de la lnea, el estndar utilizado, el numero de
pin asignado y el numero de conector del puerto "D" del Kit de desarrollo
que se utiliz para la implementacin.
NET "CLK" LOC = "P38" | IOSTANDARD = LVTTL | SCHMITT_TRIGGER ;
NET "DataIn<0>" LOC = "P53" | IOSTANDARD = LVTTL ;#D32
NET "DataIn<1>" LOC = "P52" | IOSTANDARD = LVTTL ;#D33
NET "DataIn<2>" LOC = "P51" | IOSTANDARD = LVTTL ;#D34
NET "DataIn<3>" LOC = "P50" | IOSTANDARD = LVTTL ;#D35
NET "DataIn<4>" LOC = "P49" | IOSTANDARD = LVTTL ;#D36
NET "DataIn<5>" LOC = "P48" | IOSTANDARD = LVTTL ;#D37
NET "DataIn<6>" LOC = "P46" | IOSTANDARD = LVTTL ;#D38
NET "DataIn<7>" LOC = "P45" | IOSTANDARD = LVTTL ;#D39
NET "DataOut<0>" LOC = "P68" | IOSTANDARD = LVTTL ;#D22
NET "DataOut<1>" LOC = "P66" | IOSTANDARD = LVTTL ;#D23
NET "DataOut<2>" LOC = "P64" | IOSTANDARD = LVTTL ;#D24
NET "DataOut<3>" LOC = "P61" | IOSTANDARD = LVTTL ;#D25
NET "DataOut<4>" LOC = "P60" | IOSTANDARD = LVTTL ;#D26
NET "DataOut<5>" LOC = "P59" | IOSTANDARD = LVTTL ;#D27
NET "DataOut<6>" LOC = "P58" | IOSTANDARD = LVTTL ;#D28
NET "DataOut<7>" LOC = "P57" | IOSTANDARD = LVTTL ;#D29
NET "OutSources<0>" LOC = "P76" | IOSTANDARD = LVTTL ;#D16
NET "OutSources<1>" LOC = "P75" | IOSTANDARD = LVTTL ;#D17
NET "OutSources<2>" LOC = "P74" | IOSTANDARD = LVTTL ;#D18
NET "OutSources<3>" LOC = "P71" | IOSTANDARD = LVTTL ;#D19
NET "OutSources<4>" LOC = "P70" | IOSTANDARD = LVTTL ;#D20
NET "OutSources<5>" LOC = "P69" | IOSTANDARD = LVTTL ;#D21
NET "Stb" LOC = "P56" | IOSTANDARD = LVTTL ;#D30
NET "WR" LOC = "P54" | IOSTANDARD = LVTTL ;#D31
NET "RESET" LOC = "P77" | IOSTANDARD = LVTTL ; #D15
Modulo de Interfase
Para realizar las pruebas fsicas del sistema se utiliz una baseta de pruebas
para implementar la parte de potencia del controlador. En la figura 5.22 se
muestra el esquema utilizado para el propsito. Se puede observar que
para el manejo de las filas del panel, donde se encuentran dispuestos los
nodos de los LEDs de la matriz, se utilizaron transistores PNP 2N3906, las
bases de estros transistores se manejan con las lneas F1..F6 a travs de un
driver 74HCT541. para el manejo de los ctodos de los LEDs del panel se
utiliz otro driver 74HCT541, el cual es activa los LEDs cuando va a un nivel
lgico bajo.
El panel utilizado para las pruebas es una matriz compuesto por 1 LED por
cada pxel, en el que se encuentra un conector tipo "header" de 6
posiciones para manejo de los nodos de la matriz y otro conector del
mismo tipo de 8 posiciones para el manejo de los ctodos de la matriz del
panel.
157
5.4.5
Pruebas de funcionamiento.
Como se mencion anteriormente, el controlador realiza las funciones de
barrido de la pantalla con los datos que se encuentran almacenados en la
memoria de actualizacin, esta operacin la realiza de forma automtica.
Para poder comprobar fsicamente el funcionamiento del controlador se
desarrollo un programa de prueba utilizando el lenguaje de programacin
Visual Basic y un puerto paralelo que se conecta a travs de la placa
de
interfase al controlador (CPLD).
Interfase Puerto paralelo.
Se utiliz el puerto paralelo con direccin 0x378 que posee 8 bits de salida
para los datos d0 .. d7 del controlador, en el puerto bi-direccional con
direccin de hardware 0x37A se utilizaron 2 lneas para el manejo de las
seales WR y Str. La conexin de las lneas se muestra en la figura 5.23.
158
13
25
GND
GND
GND
d7
GND
d6
d5
d4
d3
d2
d1
d0
WR
14
Str
Software de prueba.
El software para la prueba se escribi utilizando Microsoft Visual Basic 6.
El propsito de este programa es el de probar la comunicacin con el
modulo de control para el panel.
En el software se generaron tablas de cdigo correspondientes a los
caracteres numricos del 0 a 9.
Con este criterio se puede generar cualquier tipo de carcter que se desee
desplegar en la pantalla. Para la prueba de comunicacin con el modulo es
suficiente desplegar caracteres numricos.
La pantalla de interfase se muestra en la figura 5.24. el programa de
prueba decodifica la informacin de un temporizador y enva de acuerdo a
la tabla 5.8 la informacin del numero a desplegar en la pantalla. La
velocidad de transmisin de los datos puede ser cambiada moviendo el
control de ajuste.
b7
b2
b1
b0
VALOR
B0
B1
B2
B3
B4
B5
b2
b1
b0
VALOR
b7
b6
b6
b5
b5
b4
b4
b3
b3
B0
B1
B2
B3
159
B4
B5
b7
b6
b5
b4
b3
B0
b2
b1
b0
VALOR
B1
B2
B3
B4
B5
b2
b1
b0
VALOR
B1
B2
B3
B4
b7
b6
b5
b4
b3
B0
4
4
b2
b1
b0
VALOR
B3
B4
B5
B5
b7
b6
b5
b4
b3
B0
B1
B2
b7
b2
b1
b0
VALOR
B0
B1
B2
B3
B4
B5
b7
b6
b1
b0
VALOR
B1
B2
B3
B4
B5
b2
1
B0
B1
b4
b3
b5
b4
b3
b2
b6
b5
b4
B0
b7
b6
b5
b3
4
1
b1
b0
VALOR
160
B2
B3
B4
B5
b7
b2
b1
b0
VALOR
B0
B1
B2
B3
B4
B5
b2
b1
b0
VALOR
B0
B1
B2
B3
B4
b7
B5
b6
b6
b5
b5
b4
b4
b3
b3
161
'...................................................................................................................
Sub WRITE_PULSE()
Out Val("&H37A"), Val("&H02")
Out Val("&H37A"), Val("&H03")
End Sub
'...................................................................................................................
Sub STROBE_PULSE()
Out Val("&H37A"), Val("&H01")
Out Val("&H37A"), Val("&H03")
End Sub
'...................................................................................................................
Private Sub Com_RESET_Click()
Comando = Inp(Val("&H37A"))
Out Val("&H37A"), (Comando + RESET)
Out Val("&H37A"), (0)
sleep (100)
Out Val("&H37A"), (Comando And (Not (RESET)))
End Sub
'...................................................................................................................
Private Sub EnviaData()
Dim I As Integer
For I = 0 To 5
Out Val("&H378"), Buffer(I)
WRITE_PULSE
Next I
WRITE_PULSE
STROBE_PULSE
End Sub
'...................................................................................................................
Private Sub Cmd_Inicio_Click()
Timer1.Enabled = True
End Sub
'...................................................................................................................
Private Sub Command2_Click()
Dim Valor, I As Integer
Dim ByteL, ByteH As Byte
Dim LOW(5) As Byte, HIGH(5) As Byte
Valor = Val(Text_DATO)
162
ByteH = Valor \ 10
ByteL = Valor - (ByteH * 10)
For I = 0 To 5
LOW(I) = TABLA(ByteL, I)
HIGH(I) = TABLA(ByteH, I)
Buffer(I) = HIGH(I) * 16 Or LOW(I)
Next I
EnviaData
End Sub
'...................................................................................................................
Private Sub Command1_Click()
Timer1.Enabled = False
End Sub
'...................................................................................................................
Private Sub Form_Load()
Out Val("&H37A"), Val("&H03")
Comando = 0
TABLA(0, 0) = 7
TABLA(0, 1) = 5
TABLA(0, 2) = 5
TABLA(0, 3) = 5
TABLA(0, 4) = 5
TABLA(0, 5) = 7
TABLA(0, 0) = 7
TABLA(1, 0) = 1
TABLA(1, 1) = 3
TABLA(1, 2) = 1
TABLA(1, 3) = 1
TABLA(1, 4) = 1
TABLA(1, 5) = 1
TABLA(2, 0) = 7
TABLA(2, 1) = 1
TABLA(2, 2) = 7
TABLA(2, 3) = 4
TABLA(2, 4) = 4
TABLA(2, 5) = 7
TABLA(3, 0) = 7
TABLA(3, 1) = 1
TABLA(3, 2) = 7
TABLA(3, 3) = 1
TABLA(3, 4) = 1
TABLA(3, 5) = 7
TABLA(4, 0) = 5
TABLA(4, 1) = 5
TABLA(4, 2) = 7
TABLA(4, 3) = 1
TABLA(4, 4) = 1
TABLA(4, 5) = 1
TABLA(5, 0) = 7
163
TABLA(5, 1) = 4
TABLA(5, 2) = 7
TABLA(5, 3) = 1
TABLA(5, 4) = 1
TABLA(5, 5) = 7
TABLA(6, 0) = 7
TABLA(6, 1) = 4
TABLA(6, 2) = 7
TABLA(6, 3) = 5
TABLA(6, 4) = 5
TABLA(6, 5) = 7
TABLA(7, 0) = 7
TABLA(7, 1) = 1
TABLA(7, 2) = 1
TABLA(7, 3) = 2
TABLA(7, 4) = 2
TABLA(7, 5) = 2
TABLA(8, 0) = 7
TABLA(8, 1) = 5
TABLA(8, 2) = 7
TABLA(8, 3) = 5
TABLA(8, 4) = 5
TABLA(8, 5) = 7
TABLA(9, 0) = 7
TABLA(9, 1) = 5
TABLA(9, 2) = 7
TABLA(9, 3) = 1
TABLA(9, 4) = 1
TABLA(9, 5) = 7
Slider.Value = 10
Timer1.Interval = Val(Slider.Value) * 50
End Sub
'...................................................................................................................
Private Sub Slider_Change()
If Slider.Value = 0 Then
Timer1.Interval = 1
Else
Timer1.Interval = Val(Slider.Value) * 50
End If
End Sub
'...................................................................................................................
Private Sub Timer1_Timer()
If Tiempo >= 99 Then
Tiempo = 0
Else
Tiempo = Tiempo + 1
Text_DATO.Text = Tiempo
Command2_Click
End If
164
End Sub
'...................................................................................................................
Conclusiones y Recomendaciones.
Despus de el estudio realizado el cual a incluido una extensa explicacin
terica fundamental para el correcto entendimiento de los conceptos que
involucra un diseo digital utilizando lenguaje descriptivo, algunos ejemplos
prcticos en los que se ha tratado de detallar el proceso de diseo,
verificacin y pruebas, vemos que el uso de los lenguajes descriptivos
puede constituir una herramienta muy poderosa para los ingenieros en el
desarrollo de hardware.
Con la introduccin de dispositivos digitales como son CPLDs y
especialmente FPGAs el uso de un lenguaje descriptivo es una necesidad, la
densidad con respecto a elementos lgicos es tan alta que para poder
utilizar estos dispositivos los mtodos tradicionales esquemticos son casi
imposibles de utilizar. En este documento se han descrito ejemplos
relativamente sencillos, pero las aplicaciones actuales de estos elementos
estn enfocados a sistemas digitales de alta complejidad.
Una verdadera industria se ha creado en torno al uso de estos ASICs que
muchas empresas han dedicado sus esfuerzos al desarrollo de lo que en
este mundo digital se conoce con el nombre de "IP" o propiedades
intelectuales, que no son mas que porciones de cdigo debidamente
probados y verificados para diferentes aplicaciones, ejemplo de estos son
puertos seriales, i2c, SPI, controladores de ethernet, USB, PCI, filtros
digitales,
DSPs,
procesadores,
microcontroladores
etc.
Cientos
de
aplicaciones se encuentran disponibles tambin de forma gratuita, as que
antes de comenzar a desarrollar un modulo o circuito, es posible que ya se
encuentre listo nicamente para ser integrado a nuestro diseo. Estas
ventajas se logran al utilizar los lenguajes descriptivos de Hardware ya que
estos son independientes de la tecnologa o dispositivo que se utilice.
Es muy importante tener en cuenta que cuando se trabaja con un lenguaje
descriptivo de Hardware no estamos "programando" software en un
procesador, lo que hacemos es describir hardware el que luego ser
plasmado en un circuito ASIC sea cual fuere, as que los conceptos bsicos
digitales debemos manejarlos muy bien de tal forma de obtener mediante
el cdigo lo que realmente queremos.
En el desarrollo de esta tesis se utiliz un CPLD para las pruebas, estos
dispositivos no son mas que arreglos compuertas similares a los PLDs
comunes tales como 22V10.
En estos dispositivos el uso de memorias
requiere una cantidad significativa de registros los cuales consumen gran
cantidad de los recursos disponibles para solo lograr pequeas porciones de
165
166
APENDICE A.
Lenguaje
Los
anexos
a
continuacin
especificados
son
tomados
delEstndar
Internacional Documento IEEE1364, IEC61691-4 primera edicin del 2004,
parte 4, "Behavioral Lenguajes, Verilog Hardware Description Lenguajes".
Ap.1
[ list_of_port_declarations ] ; { non_port_module_item }
endmodule
module_keyword ::= module | macromodule
Ap.2
| { attribute_instance } module_or_generate_item
| { attribute_instance } parameter_declaration
| { attribute_instance } specify_block
| { attribute_instance } specparam_declaration
parameter_override ::= defparam list_of_param_assignments ;
A.2 Declarations
A.2.1 Declaration types
A.2.1.1 Module parameter declarations
local_parameter_declaration ::=
localparam [ signed ] [ range ] list_of_param_assignments ;
| localparam integer list_of_param_assignments ;
| localparam real list_of_param_assignments ;
| localparam realtime list_of_param_assignments ;
| localparam time list_of_param_assignments ;
parameter_declaration ::=
parameter [ signed ] [ range ] list_of_param_assignments ;
| parameter integer list_of_param_assignments ;
| parameter real list_of_param_assignments ;
| parameter realtime list_of_param_assignments ;
| parameter time list_of_param_assignments ;
specparam_declaration ::= specparam [ range ] list_of_specparam_assignments ;
A.2.1.2 Port declarations
inout_declaration ::= inout [ net_type ] [ signed ] [ range ]
list_of_port_identifiers
input_declaration ::= input [ net_type ] [ signed ] [ range ]
list_of_port_identifiers
output_declaration ::=
output [ net_type ] [ signed ] [ range ]
list_of_port_identifiers
| output [ reg ] [ signed ] [ range ]
list_of_port_identifiers
| output reg [ signed ] [ range ]
list_of_variable_port_identifiers
| output [ output_variable_type ]
list_of_port_identifiers
| output output_variable_type
list_of_variable_port_identifiers
A.2.1.3 Type declarations
event_declaration ::= event list_of_event_identifiers ;
genvar_declaration ::= genvar list_of_genvar_identifiers ;
integer_declaration ::= integer list_of_variable_identifiers ;
net_declaration ::=
net_type [ signed ]
[ delay3 ] list_of_net_identifiers ;
| net_type [ drive_strength ] [ signed ]
[ delay3 ] list_of_net_decl_assignments ;
| net_type [ vectored | scalared ] [ signed ]
range [ delay3 ] list_of_net_identifiers ;
| net_type [ drive_strength ] [ vectored | scalared ] [ signed ]
range [ delay3 ] list_of_net_decl_assignments ;
| trireg [ charge_strength ] [ signed ]
[ delay3 ] list_of_net_identifiers ;
Ap.3
Ap.4
Ap.5
| { attribute_instance } tf_inout_declaration ;
task_port_list ::= task_port_item { , task_port_item }
task_port_item ::=
{ attribute_instance } tf_input_declaration
| { attribute_instance } tf_output_declaration
| { attribute_instance } tf_inout_declaration
tf_input_declaration ::=
input [ reg ] [ signed ] [ range ] list_of_port_identifiers
| input [ task_port_type ] list_of_port_identifiers
tf_output_declaration ::=
output [ reg ] [ signed ] [ range ] list_of_port_identifiers
| output [ task_port_type ] list_of_port_identifiers
tf_inout_declaration ::=
inout [ reg ] [ signed ] [ range ] list_of_port_identifiers
| inout [ task_port_type ] list_of_port_identifiers
task_port_type ::=
time | real | realtime | integer
Ap.6
Ap.7
Ap.8
Ap.9
A.6.4 Statements
statement ::=
{ attribute_instance } blocking_assignment ;
| { attribute_instance } case_statement
| { attribute_instance } conditional_statement
| { attribute_instance } disable_statement
| { attribute_instance } event_trigger
| { attribute_instance } loop_statement
| { attribute_instance } nonblocking_assignment ;
| { attribute_instance } par_block
| { attribute_instance } procedural_continuous_assignments ;
| { attribute_instance } procedural_timing_control_statement
| { attribute_instance } seq_block
| { attribute_instance } system_task_enable
| { attribute_instance } task_enable
| { attribute_instance } wait_statement
statement_or_null ::=
statement
| { attribute_instance } ;
function_statement ::=
{ attribute_instance } function_blocking_assignment ;
| { attribute_instance } function_case_statement
| { attribute_instance } function_conditional_statement
| { attribute_instance } function_loop_statement
| { attribute_instance } function_seq_block
| { attribute_instance } disable_statement
| { attribute_instance } system_task_enable
Ap.10
| event_expression , event_expression
procedural_timing_control_statement ::=
delay_or_event_control statement_or_null
wait_statement ::=
wait ( expression ) statement_or_null
Ap.11
Ap.12
path_delay_value ::=
list_of_path_delay_expressions
| ( list_of_path_delay_expressions )
list_of_path_delay_expressions ::=
t_path_delay_expression
| trise_path_delay_expression , tfall_path_delay_expression
| trise_path_delay_expression , tfall_path_delay_expression , tz_path_delay_expression
| t01_path_delay_expression , t10_path_delay_expression , t0z_path_delay_expression ,
tz1_path_delay_expression , t1z_path_delay_expression , tz0_path_delay_expression
| t01_path_delay_expression , t10_path_delay_expression , t0z_path_delay_expression ,
tz1_path_delay_expression , t1z_path_delay_expression , tz0_path_delay_expression ,
t0x_path_delay_expression , tx1_path_delay_expression , t1x_path_delay_expression ,
tx0_path_delay_expression , txz_path_delay_expression , tzx_path_delay_expression
t_path_delay_expression ::= path_delay_expression
trise_path_delay_expression ::= path_delay_expression
tfall_path_delay_expression ::= path_delay_expression
tz_path_delay_expression ::= path_delay_expression
t01_path_delay_expression ::= path_delay_expression
t10_path_delay_expression ::= path_delay_expression
t0z_path_delay_expression ::= path_delay_expression
tz1_path_delay_expression ::= path_delay_expression
t1z_path_delay_expression ::= path_delay_expression
tz0_path_delay_expression ::= path_delay_expression
t0x_path_delay_expression ::= path_delay_expression
tx1_path_delay_expression ::= path_delay_expression
t1x_path_delay_expression ::= path_delay_expression
tx0_path_delay_expression ::= path_delay_expression
txz_path_delay_expression ::= path_delay_expression
tzx_path_delay_expression ::= path_delay_expression
path_delay_expression ::= constant_mintypmax_expression
edge_sensitive_path_declaration ::=
parallel_edge_sensitive_path_description = path_delay_value
| full_edge_sensitive_path_description = path_delay_value
parallel_edge_sensitive_path_description ::=
( [ edge_identifier ] specify_input_terminal_descriptor =>
specify_output_terminal_descriptor [ polarity_operator ] : data_source_expression )
full_edge_sensitive_path_description ::=
( [ edge_identifier ] list_of_path_inputs *>
list_of_path_outputs [ polarity_operator ] : data_source_expression )
data_source_expression ::= expression
edge_identifier ::= posedge | negedge
state_dependent_path_declaration ::=
if ( module_path_expression ) simple_path_declaration
| if ( module_path_expression ) edge_sensitive_path_declaration
| ifnone simple_path_declaration
polarity_operator ::= + | -
Ap.13
| $fullskew_timing_check
| $period_timing_check
| $width_timing_check
| $nochange_timing_check
$setup_timing_check ::=
$setup ( data_event , reference_event , timing_check_limit [ , [ notify_reg ] ] ) ;
$hold _timing_check ::=
$hold ( reference_event , data_event , timing_check_limit [ , [ notify_reg ] ] ) ;
$setuphold_timing_check ::=
$setuphold ( reference_event , data_event , timing_check_limit , timing_check_limit
[ , [ notify_reg ] [ , [ stamptime_condition ] [ , [ checktime_condition ]
[ , [ delayed_reference ] [ , [ delayed_data ] ] ] ] ] ] ) ;
$recovery_timing_check ::=
$recovery ( reference_event , data_event , timing_check_limit [ , [ notify_reg ] ] ) ;
$removal_timing_check ::=
$removal ( reference_event , data_event , timing_check_limit [ , [ notify_reg ] ] ) ;
$recrem_timing_check ::=
$recrem ( reference_event , data_event , timing_check_limit , timing_check_limit
[ , [ notify_reg ] [ , [ stamptime_condition ] [ , [ checktime_condition ]
[ , [ delayed_reference ] [ , [ delayed_data ] ] ] ] ] ] ) ;
$skew_timing_check ::=
$skew ( reference_event , data_event , timing_check_limit [ , [ notify_reg ] ] ) ;
$timeskew_timing_check ::=
$timeskew ( reference_event , data_event , timing_check_limit
[ , [ notify_reg ] [ , [ event_based_flag ] [ , [ remain_active_flag ] ] ] ] ) ;
$fullskew_timing_check ::=
$fullskew ( reference_event , data_event , timing_check_limit , timing_check_limit
[ , [ notify_reg ] [ , [ event_based_flag ] [ , [ remain_active_flag ] ] ] ] ) ;
$period_timing_check ::=
$period ( controlled_reference_event , timing_check_limit [ , [ notify_reg ] ] ) ;
$width_timing_check ::=
$width ( controlled_reference_event , timing_check_limit ,
threshold [ , [ notify_reg ] ] ) ;
$nochange_timing_check ::=
$nochange ( reference_event , data_event , start_edge_offset ,
end_edge_offset [ , [ notify_reg ] ] ) ;
A.7.5.2 System timing check command arguments
checktime_condition ::= mintypmax_expression
controlled_reference_event ::= controlled_timing_check_event
data_event ::= timing_check_event
delayed_data ::=
terminal_identifier
| terminal_identifier [ constant_mintypmax_expression ]
delayed_reference ::=
terminal_identifier
| terminal_identifier [ constant_mintypmax_expression ]
end_edge_offset ::= mintypmax_expression
event_based_flag ::= constant_expression
notify_reg ::= variable_identifier
reference_event ::= timing_check_event
remain_active_flag ::= constant_mintypmax_expression
stamptime_condition ::= mintypmax_expression
start_edge_offset ::= mintypmax_expression
threshold ::=constant_expression
timing_check_limit ::= expression
A.7.5.3 System timing check event definitions
Ap.14
timing_check_event ::=
[timing_check_event_control] specify_terminal_descriptor [ &&& timing_check_condition ]
controlled_timing_check_event ::=
timing_check_event_control specify_terminal_descriptor [ &&& timing_check_condition ]
timing_check_event_control ::=
posedge
| negedge
| edge_control_specifier
specify_terminal_descriptor ::=
specify_input_terminal_descriptor
| specify_output_terminal_descriptor
edge_control_specifier ::= edge [ edge_descriptor [ , edge_descriptor ] ]
edge_descriptor1 ::=
01
| 10
| z_or_x zero_or_one
| zero_or_one z_or_x
zero_or_one ::= 0 | 1
z_or_x ::= x | X | z | Z
timing_check_condition ::=
scalar_timing_check_condition
| ( scalar_timing_check_condition )
scalar_timing_check_condition ::=
expression
| ~ expression
| expression == scalar_constant
| expression === scalar_constant
| expression != scalar_constant
| expression !== scalar_constant
scalar_constant ::=
1'b0 | 1'b1 | 1'B0 | 1'B1 | 'b0 | 'b1 | 'B0 | 'B1 | 1 | 0
A.8 Expressions
A.8.1 Concatenations
concatenation ::= { expression { , expression } }
constant_concatenation ::= { constant_expression { , constant_expression } }
constant_multiple_concatenation ::= { constant_expression constant_concatenation }
module_path_concatenation ::= { module_path_expression { , module_path_expression } }
module_path_multiple_concatenation ::= { constant_expression module_path_concatenation }
multiple_concatenation ::= { constant_expression concatenation }
net_concatenation ::= { net_concatenation_value { , net_concatenation_value } }
net_concatenation_value ::=
hierarchical_net_identifier
| hierarchical_net_identifier [ expression ] { [ expression ] }
| hierarchical_net_identifier [ expression ] { [ expression ] } [ range_expression ]
| hierarchical_net_identifier [ range_expression ]
| net_concatenation
variable_concatenation ::= { variable_concatenation_value { , variable_concatenation_value } }
variable_concatenation_value ::=
hierarchical_variable_identifier
| hierarchical_variable_identifier [ expression ] { [ expression ] }
| hierarchical_variable_identifier [ expression ] { [ expression ] } [ range_expression ]
| hierarchical_variable_identifier [ range_expression ]
| variable_concatenation
Ap.15
A.8.3 Expressions
base_expression ::= expression
conditional_expression ::= expression1 ? { attribute_instance } expression2 : expression3
constant_base_expression ::= constant_expression
constant_expression ::=
constant_primary
| unary_operator { attribute_instance } constant_primary
| constant_expression binary_operator { attribute_instance } constant_expression
| constant_expression ? { attribute_instance } constant_expression : constant_expression
| string
constant_mintypmax_expression ::=
constant_expression
| constant_expression : constant_expression : constant_expression
constant_range_expression ::=
constant_expression
| msb_constant_expression : lsb_constant_expression
| constant_base_expression +: width_constant_expression
| constant_base_expression -: width_constant_expression
dimension_constant_expression ::= constant_expression
expression1 ::= expression
expression2 ::= expression
expression3 ::= expression
expression ::=
primary
| unary_operator { attribute_instance } primary
| expression binary_operator { attribute_instance } expression
| conditional_expression
| string
lsb_constant_expression ::= constant_expression
mintypmax_expression ::=
expression
| expression : expression : expression
module_path_conditional_expression ::= module_path_expression ? { attribute_instance }
module_path_expression : module_path_expression
module_path_expression ::=
module_path_primary
| unary_module_path_operator { attribute_instance } module_path_primary
| module_path_expression binary_module_path_operator { attribute_instance }
module_path_expression
| module_path_conditional_expression
module_path_mintypmax_expression ::=
module_path_expression
| module_path_expression : module_path_expression : module_path_expression
msb_constant_expression ::= constant_expression
range_expression ::=
expression
| msb_constant_expression : lsb_constant_expression
| base_expression +: width_constant_expression
| base_expression -: width_constant_expression
width_constant_expression ::= constant_expression
Ap.16
A.8.4 Primaries
constant_primary ::=
constant_concatenation
| constant_function_call
| ( constant_mintypmax_expression )
| constant_multiple_concatenation
| genvar_identifier
| number
| parameter_identifier
| specparam_identifier
module_path_primary ::=
number
| identifier
| module_path_concatenation
| module_path_multiple_concatenation
| function_call
| system_function_call
| constant_function_call
| ( module_path_mintypmax_expression )
primary ::=
number
| hierarchical_identifier
| hierarchical_identifier [ expression ] { [ expression ] }
| hierarchical_identifier [ expression ] { [ expression ] } [ range_expression ]
| hierarchical_identifier [ range_expression ]
| concatenation
| multiple_concatenation
| function_call
| system_function_call
| constant_function_call
| ( mintypmax_expression )
A.8.6 Operators
unary_operator ::=
+ | - | ! | ~ | & | ~& | | | ~| | ^ | ~^ | ^~
binary_operator ::=
+ | - | * | / | % | == | != | === | !== | && | || | **
| < | <= | > | >= | & | | | ^ | ^~ | ~^ | >> | << | >>> | <<<
unary_module_path_operator ::=
! | ~ | & | ~& | | | ~| | ^ | ~^ | ^~
binary_module_path_operator ::=
== | != | && | || | & | | | ^ | ^~ | ~^
Ap.17
A.8.7 Numbers
number ::=
decimal_number
| octal_number
| binary_number
| hex_number
| real_number
real_number1 ::=
unsigned_number . unsigned_number
| unsigned_number [ . unsigned_number ] exp [ sign ] unsigned_number
exp ::= e | E
decimal_number ::=
unsigned_number
| [ size ] decimal_base unsigned_number
| [ size ] decimal_base x_digit { _ }
| [ size ] decimal_base z_digit { _ }
binary_number ::= [ size ] binary_base binary_value
octal_number ::= [ size ] octal_base octal_value
hex_number ::= [ size ] hex_base hex_value
sign ::= + | size ::= non_zero_unsigned_number
non_zero_unsigned_number1 ::= non_zero_decimal_digit { _ | decimal_digit}
unsigned_number1 ::= decimal_digit { _ | decimal_digit }
binary_value1 ::= binary_digit { _ | binary_digit }
octal_value1 ::= octal_digit { _ | octal_digit }
hex_value1 ::= hex_digit { _ | hex_digit }
decimal_base1 ::= '[s|S]d | '[s|S]D
binary_base1 ::= '[s|S]b | '[s|S]B
octal_base1 ::= '[s|S]o | '[s|S]O
hex_base1 ::= '[s|S]h | '[s|S]H
non_zero_decimal_digit ::= 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
decimal_digit ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
binary_digit ::= x_digit | z_digit | 0 | 1
octal_digit ::= x_digit | z_digit | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7
hex_digit ::=
x_digit | z_digit | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
|a|b|c|d|e|f|A|B|C|D|E|F
x_digit ::= x | X
z_digit ::= z | Z | ?
A.8.8 Strings
string ::= " { Any_ASCII_Characters_except_new_line } "
A.9 General
A.9.1 Attributes
attribute_instance ::= (* attr_spec { , attr_spec } *)
attr_spec ::=
attr_name = constant_expression
| attr_name
attr_name ::= identifier
A.9.2 Comments
comment ::=
one_line_comment
Ap.18
| block_comment
one_line_comment ::= // comment_text \n
block_comment ::= /* comment_text */
comment_text ::= { Any_ASCII_character }
A.9.3 Identifiers
arrayed_identifier ::=
simple_arrayed_identifier
| escaped_arrayed_identifier
block_identifier ::= identifier
cell_identifier ::= identifier
config_identifier ::= identifier
escaped_arrayed_identifier ::= escaped_identifier [ range ]
escaped_hierarchical_identifier4 ::=
escaped_hierarchical_branch
{ .simple_hierarchical_branch | .escaped_hierarchical_branch }
escaped_identifier ::= \ {Any_ASCII_character_except_white_space} white_space
event_identifier ::= identifier
function_identifier ::= identifier
gate_instance_identifier ::= arrayed_identifier
generate_block_identifier ::= identifier
genvar_function_identifier ::= identifier /* Hierarchy disallowed */
genvar_identifier ::= identifier
hierarchical_block_identifier ::= hierarchical_identifier
hierarchical_event_identifier ::= hierarchical_identifier
hierarchical_function_identifier ::= hierarchical_identifier
hierarchical_identifier ::=
simple_hierarchical_identifier
| escaped_hierarchical_identifier
hierarchical_net_identifier ::= hierarchical_identifier
hierarchical_variable_identifier ::= hierarchical_identifier
hierarchical_task_identifier ::= hierarchical_identifier
identifier ::=
simple_identifier
| escaped_identifier
inout_port_identifier ::= identifier
input_port_identifier ::= identifier
instance_identifier ::= identifier
library_identifier ::= identifier
memory_identifier ::= identifier
module_identifier ::= identifier
module_instance_identifier ::= arrayed_identifier
net_identifier ::= identifier
output_port_identifier ::= identifier
parameter_identifier ::= identifier
port_identifier ::= identifier
real_identifier ::= identifier
simple_arrayed_identifier ::= simple_identifier [ range ]
simple_hierarchical_identifier3 ::=
simple_hierarchical_branch [ .escaped_identifier ]
simple_identifier2 ::= [ a-zA-Z_ ] { [ a-zA-Z0-9_$ ] }
specparam_identifier ::= identifier
system_function_identifier5 ::= $[ a-zA-Z0-9_$ ]{ [ a-zA-Z0-9_$ ] }
system_task_identifier5 ::= $[ a-zA-Z0-9_$ ]{ [ a-zA-Z0-9_$ ] }
task_identifier ::= identifier
terminal_identifier ::= identifier
text_macro_identifier ::= simple_identifier
topmodule_identifier ::= identifier
udp_identifier ::= identifier
Ap.19
IEC 61691-4:2004(E)
IEEE 1364-2001(E)
Ap.20
APENDICE B.
(Keywords)
always
and
assign
automatic
begin
buf
bufif0
bufif1
case
casex
casez
cell
cmos
config
deassign
default
defparam
design
disable
edge
else
end
endcase
endconfig
endfunction
endgenerate
endmodule
endprimitive
endspecify
endtable
endtask
event
for
force
forever
fork
function
generate
genvar
highz0
highz1
Lista de Instrucciones
if
ifnone
incdir
include
initial
inout
input
instance
integer
join
large
liblist
library
localparam
macromodule
medium
module
nand
negedge
nmos
nor
noshowcancelled
not
notif0
notif1
or
output
parameter
pmos
posedge
primitive
pull0
pull1
pulldown
pullup
pulsestyle_onevent
pulsestyle_ondetect
rcmos
real
realtime
reg
release
repeat
rnmos
rpmos
rtran
rtranif0
rtranif1
scalared
showcancelled
signed
small
specify
specparam
strong0
strong1
supply0
supply1
table
task
time
tran
tranif0
tranif1
tri
tri0
tri1
triand
trior
trireg
unsigned
use
vectored
wait
wand
weak0
weak1
while
wire
wor
xnor
xor
IEC 61691-4:2004(E)
IEEE 1364-2001(E)
Ap.21
APENDICE C.
C.1
Descripcin.
Ap.22
Ap.23
Ap.24
Ap.25
Ap.26
Ap.27
C.2
Esquemas.
Ap.28
Ap.29
Ap.30
Ap.31
Ap.32
Ap.33
APENDICE D.
D.1
Placa de interfase.
Diseo Esquemtico.
Ap.34
D.2
Circuito Impreso.
TOP LAYER
BOTTOM LAYER
Ap.35
SILK SCREEN
Ap.36