Frecuencímetro Digital con Autoescalamiento Realizado con VHDL

Anuncio
Frecuencímetro Digital con Autoescalamiento
Realizado con VHDL y Lógica Programable
Jaime Escalante Olarte
Universidad Nacional de San Agustín de Arequipa
Escuela Profesional de Ingeniería Electrónica
Arturo Miguel-de-Priego <[email protected]>
Pontificia Universidad Católica del Perú
Av. Universitaria Cdra. 18 Lima 32 – PERU
Se presenta el diseño de un frecuencímetro digital descrito con VHDL y símbolos gráficos a medida. El diseño
fue probado en dos tecnologías de CPLDs: MAX y FLEX, ambas de Altera Corp. El software empleado fue el
MAX+plusII 9.23, versión estudiantil. El frecuencímetro implementado en un dispositivo EPM7128SLC84-15
tiene las siguientes características: rango de la frecuencia de entrada: 1Hz – 10MHz; resolución hasta con tres
dígitos significativos; ajuste automático de la escala de rangos; indicadores de sufijos en Hz, KHz, MHz;
resolución de Hz en el rango de Hz; punto decimal flotante en los rangos de KHz y MHz; indicadores de
frecuencia alta (> 10MHz) y baja (< 1Hz). El frecuencímetro implementado en un chip EPF10K10LC84-4
contiene, además, un generador de 16 frecuencias predefinidas que se seleccionan con un teclado. Durante el
desarrollo del diseño se empleó un par de tarjetas experimentales para prototipos que facilitó y contribuyó a
reducir el tiempo de trabajo, principalmente el tiempo de simulación.
Motivación
Este trabajo se realizó como producto de una pasantía de investigación del Bachiller Jaime Olarte, de la Escuela
Profesional de Ingeniería Electrónica de la Universidad Nacional de San Agustín de Arequipa (UNSAA), que
tuvo lugar en las instalaciones del Laboratorio de Microelectrónica de la Pontificia Universidad Católica del Perú
(PUCP). El objetivo de esta pasantía fue revisar un diseño inicial basado en lógica TTL, para transferirlo a lógica
programable, usando descripciones VHDL y símbolos a medida parametrizables (con MegaWizard de
MAX+plus II), y acabar la implementación en un chip EPM7128SLC84-15 (basado en EEPROM, 100
reprogramaciones garantizadas), por su bajo costo comparado con otros chips al alcance en esos momentos. Se
eligió utilizar un chip EPF10K10LC84-4 (basado en SRAM, configuraciones ilimitadas pero volátiles) para el
desarrollo del prototipo.
Descripción General
La figura 1 muestra un esquema de la
apariencia del frecuencímetro como
producto final. Su característica principal
de auto rango, permite colocar la señal y
observar el valor de su frecuencia, sin
ninguna otra intervención por parte del
usuario.
Las
características
del
frecuencímetro son:
1.
2.
3.
4.
5.
6.
7.
Rango de frecuencias en Hz, KHz y
MHz: el valor aparece en enteros en el
rango de Hz (desde 1Hz hasta 999Hz).
El rango de KHz abarca desde 1.00
KHz hasta 999KHz. El rango de MHz
está comprendido entre 1.00 MHz y
Figura 1. Bosquejo del Frecuencímetro como producto final.
10.0MHz.
La frecuencia se establece automáticamente en un rango auto ajustable: el circuito determina la
frecuencia de la señal en el rango actual. Si la frecuencia es más alta que el máximo valor del rango actual,
el rango se incrementa (de baja frecuencia a Hz, de Hz a KHz, de KHz a MHz, de MHz a alta frecuencia),
en cambio si en el rango actual se obtiene una lectura de 0, el rango se reduce (de alta frecuencia a MHz, de
MHz a KHz, de KHz a Hz, de Hz a baja frecuencia).
Visualización con tres dígitos significativos: el valor de la frecuencia puede observarse con tres dígitos
significativos en los rangos de KHz y MHz (enteros más decimales), pero en el rango de Hz se observan
solo enteros.
Punto decimal flotante para los rangos en KHz y MHz: el punto decimal se ajusta automáticamente en
los visualizadores de siete segmentos.
Precisión de Hz en el rango de Hz: El circuito ha sido diseñado para generar ventanas de tiempo, y la
ventana de tiempo más grande es de 1s. Si la señal de entrada tiene una frecuencia inferior a 1Hz, el panel
mostrará el dato 0 y el indicador de Baja Frecuencia se activará.
Indicadores de rango y fuera de rango: Unos leds indican el rango actual o fuera de rango de la señal.
Generador de prueba: Un teclado permite ingresar señales predefinidas para verificar el estado del
frecuencímetro. Esta opción está disponible solo en la versión con FLEX.
Para usar el dispositivo, la señal de entrada debe estar en el rango de 0V a 5V. Primero se debe encender el
dispositivo, antes de conectar la señal de entrada. La frecuencia de la señal se apreciará en el panel de
visualización y los indicadores informarán los rangos. Esto es válido tanto para el EMP7128SLC84 como para
el EPF10K10LC84. En este último se puede usar además un teclado para generar 16 frecuencias de prueba
diferentes Esto fue muy útil para la etapa de desarrollo y refinamiento del diseño. Para usar este modo, la
compilación debe hacerse solo para el modo test, conectando la salida del generador como la señal externa. Ello
permite un mayor desempeño que si se agregara un bloque multiplexor.
Diagrama de Bloques
La figura 2 muestra el diagrama de bloques para el diseño del frecuencímetro. El circuito debe:
1.
2.
3.
4.
5.
6.
7.
Contar la cantidad de ciclos de la señal de entrada: Este es el procedimiento elegido para determinar la
frecuencia de la señal de entrada. Otro procedimiento consiste en contar el tiempo entre pulsos consecutivos
de la señal de entrada y con un algoritmo de división calcular la frecuencia de ese período.
Indicar cuenta cero y desborde: Se realiza a partir del contador anterior, con lógica combinacional.
Determinar los rangos, habilitar un período de cuenta, cambiar los rangos si hay cuenta cero o
desborde: estas tareas se realizan con una máquina de estados (en el bloque Controlador).
Almacenar el valor actual. Se realiza en un registro de 3x4 bits (Registro).
Mostrar el valor actual. Se emplea un panel de 3 visualizadores de 7 segmentos. La visualización es por
multiplexación en el tiempo, a una frecuencia de refresco de 1KHz.
Generar frecuencias de test y frecuencias auxiliares. Se necesita crear:
Frecuencias auxiliares: 1KHz para el sondeo del teclado y el refresco de la visualización, y 5Hz para la
frecuencia de actualización de la lectura de la frecuencia de la señal de entrada.
Frecuencias de test: Solo para el caso del EPF10K10LC84. Genera 16 frecuencias diferentes de
acuerdo a la tecla presionada.
Leer un teclado para test: Se implementa en la Lectora de Teclado. Entrega al generador de frecuencias
de test un código de selección de frecuencia de prueba.
Figura 2. Diagrama de Bloques del Frecuencímetro
Contador de Décadas
A este bloque llega la señal cuya
frecuencia se mide, frec_entr.
Las señales habCnt y rst_asinc
provienen
del
módulo
Controlador. Las salidas de este
bloque son las unidades, decenas
y centenas de un contador en
cascada (000-999). Las señales
RangoDn y RangoUp indican al
Controlador analizar un cambio
de rango. RanguUp es el acarreo
del contador de centenas; un flip
flop se emplea para mantener el
valor
hasta
que
sea
reinicializado. Si RangoUp se
activa significa que el contador
alcanzó la cuenta 1000 antes de
cumplirse
el
tiempo
de
Figura 3. Diagrama Esquemático del Contador de Décadas Asíncrono
habilitación para la cuenta. RangoDn se activa si el valor del contador es cero. La señal MSDesCero sirve para
ajustar el punto decimal en el rango de KHz y MHz.
Registro
Sirve para mantener el valor que será
visualizado. El registro se actualiza cinco veces
por segundo, independientemente del rango de
la señal cuya frecuencia se mide. La señal de
entrada ldCuenta proviene del Controlador. Las
señales U, D y C provienen del contador de
décadas, mientras que las salidas Uni, Dec y
Cen van al visualizador.
Figura
4.
Diagrama
Esquemático del Registro
de Visualización
Visualizador
La figura 5 muestra el
diagrama esquemático del
visualizador.
Las entradas
son reloj_base (de 8MHz),
hab1KHz, los tres dígitos del
registro anterior y las señales
del punto decimal.
Las
salidas son los datos para el
visualizador de 7 segmentos
(dato7seg) y los habilitadores
(hab7seg).
El
bloque
DEC7SEGL está descrito en
VHDL, para implementar un
decodificador de 7 segmentos,
con salidas activas en baja.
Las señales hV1 y hV2 sirven
para ocultar la visualización
de los ceros en el rango de 1Hz a 99Hz.
Figura 5. Diagrama
Esquemático del
Visualizador
Generador de Frecuencias
Este bloque genera las frecuencias
auxiliares
(caso
MAX,
con
el
EPM7128SLC84-15) y las frecuencias de
prueba
(caso
FLEX,
con
el
EPF10K10LC84-4). La figura 6 muestra el
generador en el caso MAX, donde solo se
producen las frecuencias de refresco para el
visualizador (1KHz) y de actualización del
registro de visualización (5Hz).
Figura 6. Diagrama Esquemático del Generador
de Frecuencias Auxiliares
La figura 7 ilustra la
formación del generador
de frecuencias.
Las
señales se generan con el
acarreo de salida de los
contadores de módulo
predefinido. Por ejemplo
una frecuencia de 999Hz
se obtiene con una
cuenta de 8008.
Figura 7. Esquemático Parcial del Generador de Frecuencias de Test
Lectora de Teclado
Este controlador solo se usa en
el caso FLEX, para seleccionar
la frecuencia de prueba. Posee
una salida registrada. El bloque
genpulso prevé los antirrebotes
y arroja un pulso de salida
síncrono de un período de reloj
de duración para cargar el valor
de la tecla presionada (0 - 16),
indicada por el contador, en el
registro de 4 bits. La salida del
registro se conecta al selector de
frecuencia
del
generador
descrito en el párrafo anterior.
Figura 8. Diagrama Esquemático del Controlador de Teclado
El Controlador
El controlador del sistema se creó con una
descripción VHDL.
El diagrama de
estados se muestra en la figura 9. El código
VHDL documentado con comentarios se
muestra a continuación.
Figura 9. Diagrama de
Estados del Controlador
------------------------------------------------------------------- AutoRngM.vhd : autoajuste del rango y generador de ventanas de tiempo
------------------------------------------------------------------- Arturo Miguel de Priego
[email protected]
Diciembre 11, 2000 Pontificia Universidad Católica del Perú
-------------------------------------------------------------------------------------------ENTITY AutoRngM IS
PORT(
Frec5Hz : IN
BIT;
-- Frecuencia para temporizar la visualización
reloj
: IN
BIT;
-- Frecuencia base para temporizar las medidas ( 8MHz )
rangoUp : IN
BIT;
-- Indica cuenta completa de 1000 pulsos de la señal de entrada. Ocurre cuando los
-- contadores de décadas alcanzan la cuenta de 1000.
rangoDn : IN
BIT;
-- Indica ninguna cuenta de pulsos de la señal de entrada.
-- Ocurre cuando todos los contadores tienen valor cero.
CeroMSD : IN
BIT;
-- indica estado de la centena (MSD, dígito más significativo)
ldCnta,
-- Carga la cuenta en los registros
habCnta,
-- Activa la cuenta del medidor
rstCnta
: OUT
BIT;
-- Reinicia la cuenta del medidor
ptoDec
: OUT
BIT_VECTOR(1 DOWNTO 0); -- punto decimal flotante
altaFrec,
-- frecuencia muy alta
RangoMHz,
-- rango en MHz
RangoKHz,
-- rango en KHz
RangoHz,
-- rango en Hz
bajaFrec: OUT
BIT);
-- frecuencia muy baja
END AutoRngM;
ARCHITECTURE a OF AutoRngM IS
CONSTANT RANGO_MINIMO
: INTEGER
:= 0;
CONSTANT RANGO_MAXIMO
: INTEGER
:= 7;
-- este valor puede ser 5 o 6, según el dispositivo
CONSTANT CUENTA_RANGO1 : INTEGER
:= 7999999;
CONSTANT CUENTA_RANGO2a : INTEGER
:= 799999;
CONSTANT CUENTA_RANGO2b : INTEGER
:= 79999;
CONSTANT CUENTA_RANGO2c : INTEGER
:= 7999;
CONSTANT CUENTA_RANGO3a : INTEGER
:= 799;
CONSTANT CUENTA_RANGO3b : INTEGER
:= 79;
CONSTANT CUENTA_RANGO3c : INTEGER
:= 7;
SIGNAL rango
: INTEGER RANGE 0 TO 7; -- 0: Baja frecuencia
-- 1: 1 Hz - 999Hz
-- 2: 1.00 KHz - 9.99KHz
-- 3: 10.0 KHz - 99.9KHz
-- 4: 100 KHz - 999KHz
-- 5: 1.00 MHz - 9.99MHz
-- 6: 10.0 MHz - 99.9MHz
-- 7: Alta frecuencia
-- como la frecuencia base es de 8MHz (T = 125ns), una ventana de 1us se obtiene con una cuenta de 8 . Para una precisión mayor se
-- necesita un oscilador externo de mayor frecuencia.
-------------------------------------------------------------------------------------------TYPE ESTADOS_AUTORANGO IS (
INICIO, REINICIO, HABILITACION, RECARGA,
ALTA_FRECUENCIA, BAJA_FRECUENCIA, RANGO_UP, RANGO_DN);
SIGNAL estado
: ESTADOS_AUTORANGO;
SIGNAL cnt
: INTEGER RANGE 0 TO 7999999;
SIGNAL cuentaMaxima
: INTEGER RANGE 0 TO CUENTA_RANGO1;
SIGNAL tmp, tldCnta
: BIT;
-------------------------------------------------------------------------------------------BEGIN
-------------------------------------------------------------------------------------------PROCESS (reloj)
-- proceso para controlar la actualización del registro 5 veces por segundo
BEGIN
IF reloj'EVENT AND reloj = '1' THEN
IF Frec5Hz = '1' THEN
tmp <= '1';
ELSIF tldCnta = '1' THEN
tmp <= '0';
END IF;
END IF;
END PROCESS;
ldCnta <= tmp AND tldCnta;
-------------------------------------------------------------------------------------------PROCESS (reloj)
-- maquina de estados
BEGIN
IF reloj'EVENT AND reloj = '1' THEN
CASE estado IS
WHEN INICIO => -- sirve para iniciar el estado y el rango
rango <= RANGO_MINIMO + 1;
estado <= REINICIO;
WHEN REINICIO =>
-- reinicializa el contador de
cnt <= 0;
-- tiempo de habilitación
estado <= HABILITACION;
WHEN HABILITACION =>
IF rangoUp = '1' THEN
-- si ocurre un desborde del contador de pulsos
estado <= RANGO_UP; -- de entrada, se reduce el tiempo de
-- habilitación, lo cual equivale a incrementar
-- el rango de frecuencia
ELSIF cnt = cuentaMaxima THEN -- si se alcanzo el límite de tiempo
IF rango = RANGO_MAXIMO AND rangoDn = '1' THEN
estado <= RANGO_DN;
-- verifica la cuenta para reducir
-- el rango si se había alcanzado
-- ALTA_FRECUENCIA
ELSE
estado <= RECARGA;
-- se recarga el contador
END IF;
ELSE
cnt <= cnt + 1;
END IF;
WHEN RECARGA =>
IF rangoDn = '1' OR ( CeroMSD = '1' AND rango /= 1 AND rango /= 0 )
THEN
estado <= RANGO_DN;
-- verifica la cuenta, si es cero decrementa el rango
-- si el dígito más significativo es cero y el rango > 1 entonces
-- baja el rango (tres dígitos significativos en KHz y MHz).
ELSIF rango = 0 AND rangoDn = '0' THEN -- para subir el rango cuando se
-- habia alcanzado BAJA_FRECUENCIA
estado <= RANGO_UP;
ELSE
estado <= REINICIO;
END IF;
WHEN RANGO_UP =>
IF rango = RANGO_MAXIMO THEN
estado <= ALTA_FRECUENCIA;
ELSE
rango <= rango + 1;
estado <= REINICIO;
END IF;
WHEN ALTA_FRECUENCIA =>
estado <= REINICIO;
WHEN RANGO_DN =>
IF rango = RANGO_MINIMO THEN
estado <= BAJA_FRECUENCIA;
ELSE
rango <= rango - 1;
estado <= REINICIO;
END IF;
WHEN BAJA_FRECUENCIA =>
estado <= REINICIO;
WHEN OTHERS =>
estado <= INICIO;
END CASE;
END IF;
END PROCESS;
--------------------------------------------------------------------------------------------- asignaciones de las salidas
RangoHz <=
'1'
WHEN rango = 1 ELSE
'0';
RangoKHz <=
'1' WHEN rango = 2 OR rango = 3 OR rango = 4 ELSE
RangoMHz <=
'1' WHEN rango = 5 OR rango = 6 ELSE '0';
ptoDec(1) <=
'1' WHEN rango = 2 OR rango = 5 ELSE '0';
ptoDec(0) <=
'1' WHEN rango = 3 OR rango = 6 ELSE '0';
-- selector de cuenta, para el tiempo de habilitación
cuentaMaxima <=
CUENTA_RANGO1 WHEN rango = 1 ELSE
CUENTA_RANGO2a WHEN rango = 2 ELSE
CUENTA_RANGO2b WHEN rango = 3 ELSE
CUENTA_RANGO2c WHEN rango = 4 ELSE
CUENTA_RANGO3a WHEN rango = 5 ELSE
CUENTA_RANGO3b WHEN rango = 6 ELSE
CUENTA_RANGO1;
WITH estado SELECT
rstCnta <= '1' WHEN REINICIO,
'0'
WHEN OTHERS;
WITH estado SELECT
tldCnta <='1' WHEN RECARGA,
'0'
WHEN OTHERS;
WITH estado SELECT
habCnta <=
'0' WHEN RECARGA,
'1'
WHEN OTHERS;
altaFrec <=
'1' WHEN rango = RANGO_MAXIMO ELSE
bajaFrec <=
'1' WHEN rango = RANGO_MINIMO ELSE
END;
'0';
-- 2 decimales
-- 1 decimal
-- 1 Hz - 999 Hz
-- 1.00 KHz - 9.99 KHz
-- 10.0 KHz - 99.9 KHz
-- 100 KHz - 999 KHz
-- 1.00 MHz - 9.99 MHz
-- 10.0 MHz - 99.9 MHz
'0';
'0';
Síntesis
Para la versión EPM se configuraron los pines del chip para el uso en una tarjeta de pruebas, tal como se muestra
a continuación:
@54
@55
@65
@67
@68
@69
@70
@73
AltaFrecuencia
BajaFrecuencia
dato7seg0
dato7seg1
dato7seg2
dato7seg3
dato7seg4
dato7seg5
@74
@64
@63
@61
@60
@58
@57
@56
dato7seg6
dato7seg7
hab7seg0
hab7seg1
hab7seg2
Hz
KHz
MHz
**
AUTO
SIGNALS **
GLOBAL
INFO: Signal 'reloj' chosen for
auto global Clock (pin 83)
INFO: Signal 'test' chosen for
auto global Clock (pin 2)
La síntesis se realizó en el estilo NORMAL, modo MULTINIVEL, con la opción de Turbo Bit activada. La
máquina de estados del compilador resultó:
|AUTORNGM:100|estado: MACHINE
OF BITS (
|AUTORNGM:100|estado~3,
|AUTORNGM:100|estado~2,
|AUTORNGM:100|estado~1
)
WITH STATES (
INICIO =
B"000",
REINICIO =
HABILITACION =
RECARGA =
ALTA_FRECUENCIA =
BAJA_FRECUENCIA =
RANGO_UP =
RANGO_DN =
B"001",
B"010",
B"011",
B"100",
B"110",
B"101",
B"111" );
La síntesis arrojó un consumo de 113 macroceldas, que constituye el 88% de recursos lógicos del chip
La matriz de retardos y el desempeño registrado se indican a continuación:
Figura 10. Matriz de Retardos para el Frecuencímetro implementado en un EPM7128SLC84-15
Figura 11. Desempeño registrado para el frecuencímetro implementado en un EPM7128SLC84-15
El siguiente mensaje aparece durante el análisis temporal, relacionado con las señales reloj (de frecuencia base
8MHz) y test (cuya frecuencia se desea medir):
Las simulaciones que se indican en la ayuda no se han realizado todavía. El circuito fue probado en hardware
con un Generador de Frecuencias de 2MHz y respondió correctamente en todo el rango de 1Hz a 2MHz,
actualizando el valor medido automáticamente. Para frecuencias inferiores a 1Hz la señal de baja frecuencia se
encendía. La máxima frecuencia se ha estimado en 10MHz, pero el valor real se determinará en un trabajo
futuro.
Para la versión con FLEX, la compilación del mismo circuito que para la versión con MAX, es decir, sin incluir
el generador de frecuencias y el controlador de teclado, arrojó los siguientes datos (pines elegidos por el
compilador):
Síntesis
NORMAL
FAST
LCs
227 (39 %)
292 (50 %)
reloj
18.62 MHz, 53,7ns
24.5 MHz, 40,8 ns
test
50.76 MHz, 19.7ns
43.85 MHz, 22.8ns
En ambos casos la asignación automática de los estados fue la misma
|AUTORNGM:100|estado: MACHINE
OF BITS (
|AUTORNGF:100|estado~8,
|AUTORNGF:100|estado~7,
|AUTORNGF:100|estado~6,
|AUTORNGF:100|estado~5,
|AUTORNGF:100|estado~4,
|AUTORNGF:100|estado~3,
|AUTORNGF:100|estado~2,
|AUTORNGF:100|estado~1
)
WITH STATES (
INICIO =
REINICIO =
HABILITACION =
RECARGA =
ALTA_FRECUENCIA =
BAJA_FRECUENCIA =
RANGO_UP =
RANGO_DN =
B"00000000",
B"11000000",
B"10100000",
B"10010000",
B"10001000",
B"10000100",
B"10000010",
B"10000001" );
El circuito se probó luego
sobre el sistema DGMF10K10, constituido por una
tarjeta basada en el EPF10K10
y por una tarjeta que contiene
cuatro visualizadores y un
teclado, tal como se muestra
en la figura 12. En este
sistema se probó igualmente el
generador de frecuencias de
test, leyéndose correctamente
las frecuencias de 2.66MHz y
4MHz, las frecuencias más
altas disponibles para verificar
hasta ese momento en el
laboratorio.
Figura 12. Sistema DGM-F10K10 utilizado para probar el
frecuencímetro en la etapa del desarrollo del diseño.
Conclusiones
Se mostró el diseño de un frecuencímetro digital de alto desempeño, el cual fue realizado en un relativo
pequeño número de horas usando VHDL en combinación con símbolos parametrizados del
MegaWizard de MAX+plusII 9.23, versión estudiantil.
Se indicó paso a paso el diseño del frecuencímetro, desde la concepción de la idea, hasta la
implementación en chips de lógica programable.
La combinación de tarjetas a medida y de aplicación específica permite resolver rápidamente varios
problemas que toman a veces mucho tiempo encontrar en la simulación. Otras tarjetas de este tipo se
están desarrollando en la PUCP para ayudar a conseguir prototipos funcionales y con alto desempeño
empleando menos tiempo en actividades manuales.
Referencias
[1] Altera Corporation, http://www.altera.com
[2] ByteBlaster Parallel Port Download Cable Data Sheet – Febrero 1998, ver 2.01
[3] Altera Data Book, 1998, Altera Corporation
[4] Altera CD Data Library, 2000, Altera Corporation
Descargar