Download Práctica 7. Diseño en VHDL de un modulador PPM

Document related concepts
no text concepts found
Transcript
PRÁCTICA 7:
DISEÑO EN VHDL DE UN
MODULADOR PPM
POP Tecn. Electrónicas y Comun.
SISTEMAS DE COMUNICACIONES
DIGITALES
Práctica 7. Diseño en VHDL de un modulador PPM
7.1. Objetivos
Diseñar un sistema de modulación por posición de pulso (PPM) mediante
VHDL e implementarlo en una FPGA. Aprender a utilizar las diferentes
herramientas de simulación e implementación de circuitos lógicos mediante
VHDL.
7.2. Conectores de expansión de la Spartan-3A/3AN Starter Kit
Board
La tarjeta de desarrollo Spartan-3A/3AN Starter Kit Board ofrece una serie de
conectores de expansión para la comunicación con otras tarjetas o simplemente
para la visualización o introducción de señales digitales. El conector más
versátil es el J17, que contiene 100 pines, donde un elevado porcentaje de los
mismos son accesibles como puertos de entrada o salida de la FPGA. Otros
conectores utilizables son los diferenciales de transmisión y recepción a
elevadas tasas de transferencia. En las siguientes figuras se muestran los
puertos accesibles y su denominación, tanto para el conector J17 como para los
conectores diferenciales J2 y J15.
Tabla 7.1. Pines del conector J17
1/10
PRÁCTICA 7:
DISEÑO EN VHDL DE UN
MODULADOR PPM
POP Tecn. Electrónicas y Comun.
SISTEMAS DE COMUNICACIONES
DIGITALES
Tabla 7.2. Pines del conector J17 (continuación)
Tabla 7.3. Pines del conector J2 (cabecera de recepción)
Tabla 7.4. Pines del conector J15 (cabecera de transmisión)
7.3. Realización práctica
En esta práctica se pretende diseñar un modulador PPM mediante VHDL
constituido por un generador de datos pseudoaleatorios y el modulador PPM
en sí mismo, tal como se esquematiza en la figura 7.1. Como podemos apreciar
en la figura, el generador de datos posee dos entradas (reloj y reset) y dos salidas
(datos y sinc), mientras que el modulador PPM posee tres entradas (reloj, reset y
2/10
PRÁCTICA 7:
DISEÑO EN VHDL DE UN
MODULADOR PPM
POP Tecn. Electrónicas y Comun.
SISTEMAS DE COMUNICACIONES
DIGITALES
datos) y cuatro salidas (clk_datos, clk_ppm, salida y datos_par_sal). Asimismo, la
salida clk_datos está realimentada a la entrada de reloj del generador de datos,
mientras que la salida de datos del generador se conecta a la entrada de datos
del modulador PPM.
Figura 7.1. Esquema de bloques del sistema modulador PPM
7.3.1. Generador de datos
En primer lugar vamos a diseñar el generador de datos pseudoaleatorio y
comprobar su correcto funcionamiento de manera aislada, previamente a
diseñar el modulador PPM y probar todo el sistema en conjunto.
1. Vamos a crear un paquete denominado constantes que contenga todas
las constantes que vamos a utilizar durante el desarrollo de esta práctica.
Realmente, para el generador de datos sólo requeriremos de la constante
N y de la función and_vector. El resto de constantes y funciones serán
utilizadas por el bloque modulador PPM. El código en VHDL sería el
siguiente:
library IEEE;
use IEEE.STD_LOGIC_1164.all;
package constantes is
constant N : positive := 4;
constant M : positive := 4;
constant L : positive := 2**M;
function and_vector (vector : in std_logic_vector(0 to N-1)) return
std_logic;
function find_K (M,L : positive) return positive;
constant K : positive := find_K(M,L);
end constantes;
package body constantes is
function and_vector (vector : in std_logic_vector(0 to N-1)) return
std_logic is
variable resultado : std_logic;
begin
resultado := vector(0);
for I in 1 to N-1 loop
resultado := vector(I) and resultado;
end loop;
return resultado;
end and_vector;
function find_K (M,L : positive) return positive is
variable K : positive;
begin
3/10
PRÁCTICA 7:
DISEÑO EN VHDL DE UN
MODULADOR PPM
POP Tecn. Electrónicas y Comun.
SISTEMAS DE COMUNICACIONES
DIGITALES
if ((M mod 2) = 1) then
K := M*L;
elsif ((M/2 mod 2) = 1) and (M /= 2) then
K := (M/2)*L;
else
K := 2*L;
end if;
return K;
end function find_K;
end constantes;
Obsérvese que, aparte de la constante N que se referirá a la longitud
(número de registros) del generador de datos y de la función and_vector
que determina la función y-lógica de un vector de datos, se definen
también la constante M, la constante L como 2M, una función find_K y
una constante K que se obtiene a partir de M y L haciendo uso de la
función find_K previamente definida. La función find_K lo que hace
básicamente es determinar un mínimo común múltiplo de M y L a fin de
obtener un factor K como referencia para la generación de las señales de
reloj para el generador de datos y el generador de pulsos PPM. Más
adelante incidiremos nuevamente sobre esto.
2. El bloque generador de datos requiere de registros para su
implementación, por lo que habrá que diseñar un componente que actúe
como un registro. Un posible código VHDL sería el siguiente:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity registro is
Port ( clk,preset,D : in STD_LOGIC;
Q : out STD_LOGIC);
end registro;
architecture Behavioral of registro is
begin
process(clk,preset)
begin
if preset='1' then
Q <= '1';
elsif clk'event and clk='1' then
Q <= D;
end if;
end process;
end Behavioral;
Obsérvese que el registro responde a los cambios de las señales de
entrada clk (señal de reloj) y preset (señal de set que pondrá el registro a
nivel lógico ‘1’ cuando se active a alta). Toda vez que se produzca un
flanco de subida de la señal de reloj clk, el dato a la entrada D del registro
pasará a la salida Q del mismo.
4/10
PRÁCTICA 7:
DISEÑO EN VHDL DE UN
MODULADOR PPM
POP Tecn. Electrónicas y Comun.
SISTEMAS DE COMUNICACIONES
DIGITALES
3. En la figura 7.2 se muestra la estructura de un generador de datos
pseudoaleatorio constituido por cuatro registros, lo que dará lugar a una
secuencia pseudoaleatoria de longitud 24 – 1 = 15.
Figura 7.2. Estructura interna de un generador de datos pseudoaleatorio
Obsérvese que la señal de reset del sistema se utiliza para provocar un set
(y no un reset) de los registros, estableciendo la salida de todos ellos a ‘1’.
Esto es debido a que si estableciéramos todos los registros a cero, el
generador se quedaría en ese estado indefinidamente y la salida siempre
sería cero, por lo que se recurre al establecimiento de un set de los
registros, lo que provocará la iniciación de una nueva secuencia
pseudoaleatoria. Podemos comprobar que la entrada del primer registro
se retroalimenta con la operación o-exclusiva de su propia salida y la del
último registro. Con esta simple operación es posible obtener una señal
pseudoaleatoria a la salida del último registro que se repite cada 15 bits.
Por otro lado, se ha utilizado un puerta and como controladora de la
repetición de la secuencia que se pondrá a ‘1’ siempre que todos los
registros tengan sus salidas a nivel ‘1’, lo que ocurre sólo una vez cada
periodo de la secuencia pseudoaleatoria. Por tanto, dicha señal sirve
como señal de sincronismo indicadora de la repetición de la secuencia,
de ahí su nombre.
Un posible código en VHDL que nos permite implementar el generador
de datos pseudoaleatorio de la figura 7.2 es el siguiente:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use work.constantes.ALL;
entity gen_datos is
generic (Nreg : positive := N);
port (clk,reset : in STD_LOGIC;
datos,sinc : out STD_LOGIC);
end gen_datos;
architecture Behavioral of gen_datos is
component registro is
port (clk,preset,D : in std_logic;
Q : out std_logic);
end component registro;
5/10
PRÁCTICA 7:
DISEÑO EN VHDL DE UN
MODULADOR PPM
POP Tecn. Electrónicas y Comun.
SISTEMAS DE COMUNICACIONES
DIGITALES
signal sig_xor : std_logic;
signal Q_int : std_logic_vector(0 to Nreg-1);
begin
Generador_datos: for I in 0 to Nreg-1 generate
Reg00: if (I=0) generate
Reg0: Registro port map (clk,reset,sig_xor,Q_int(0));
end generate;
Regs: if I>0 generate
Reg: Registro port map (clk,reset,Q_int(I-1),Q_int(I));
end generate;
end generate;
datos <= Q_int(Nreg-1);
sig_xor <= Q_int(0) xor Q_int(Nreg-1);
sinc <= and_vector(Q_int);
end Behavioral;
Podemos observar que se ha definido un genérico Nreg para poder
diseñar cualquier generador de datos de la longitud que se desee, pero
que se ha establecido al valor N, inicializado a cuatro en el paquete
constantes. Se puede comprobar que se ha hecho uso de la sentencia
generate para instanciar los diferentes registros que constituyen el
generador, mientras una sentencia if determina las conexiones del mismo
en función de su localización en la estructura. De igual forma, la salida
del último registro es enviada a la salida datos del generador, mientras
que la operación xor es llevada a cabo sobre las salidas del primer y
último registro, a la vez que se obtiene la salida de sincronismo (sinc)
mediante la función y-lógica de las salidas de todos los registros.
Hay que indicar que sólo determinadas interconexiones mediante la
función xor son válidas para obtener secuencias pseudoaleatorias de
longitud 2N – 1, donde N es el número de registros del generador de
datos. Por ese motivo, aunque aquí se ha utilizado un genérico para
definir cualquier generador de longitud Nreg, el conectar las salidas del
primer y último registro a la puerta xor de realimentación sólo
funcionará en principio para generadores de datos de 4 bits, como es el
caso de este ejemplo.
4. Hacer uso del ISE Simulator, para comprobar el correcto funcionamiento
del generador de datos. ¿Qué longitud tiene la secuencia
pseudoaleatoria? ¿En qué momento del periodo de la señal de datos se
activa a alta la señal sinc?
7.3.2. Modulador PPM
A continuación vamos a proceder al diseño del modulador PPM propiamente
dicho. Pero, previamente a esto, vamos a considerar los requerimientos de
sincronismo del sistema para un buen funcionamiento del mismo. En primer
lugar, tenemos un generador de datos que sirve de entrada al modulador PPM.
Por otro lado, tenemos un modulador que debe generar L chips durante el
mismo periodo que el generador de datos le suministra M bits, siendo L = 2M.
Asimismo, disponemos de una señal de reloj base de 50 MHz (E12)
suministrada por la tarjeta de desarrollo. Supongamos en primer lugar un caso
6/10
PRÁCTICA 7:
DISEÑO EN VHDL DE UN
MODULADOR PPM
POP Tecn. Electrónicas y Comun.
SISTEMAS DE COMUNICACIONES
DIGITALES
simple como sería un modulador 16-PPM, que genera L = 16 chips (uno de ellos
activa a alta), en el tiempo en que el generador de datos le suministra M = 4 bits.
En este caso, requeriríamos que el reloj del generador de datos fuera 4 veces
más lento que el del modulador PPM. Para ello se podría hacer uso de la propia
señal de reloj de 50 MHz para el modulador PPM y de un contador que fuera
generando un pulso cada cuatro flancos de la señal base para usar dicha señal
como reloj del generador de datos. Otra posibilidad es utilizar dos contadores,
uno para el modulador y otro para el generador, el primero que cuente desde 0
hasta 1, mientras que el segundo cuente desde 0 hasta 7, activándose ambos a
nivel lógico ‘1’ siempre que alcancen nuevamente el valor 0. En la siguiente
figura se esquematiza este caso.
Obsérvese que, de esta manera, cada cuatro flancos del reloj del modulador
PPM se produce un único flanco del reloj de datos. Este caso sencillo no
presenta problemas, pero supongamos que M = 3 bits, luego L = 23 = 8 chips. En
este caso no es tan sencillo generar los relojes a partir del de mayor frecuencia,
ya que ocho no es divisible por tres. En este caso, se requeriría buscar algún
mínimo común múltiplo. Dado que 2, 3, 5, 7, 9, 11 y 13 son números primos y
difícilmente diseñaremos un modulador PPM de más de 8 bits de datos,
podemos aplicar como regla sencilla para determinar el mínimo común
múltiplo K = M·L. Para M = 6 y M = 10, el mínimo común múltiplo se obtendría
mediante la expresión K = (M/2)·L, mientras que para el resto de los casos L es
divisible por M, por lo que podemos tomar como criterio K = 2L. La función
find_K integrada en el paquete constantes, no hace más que aplicar los criterios
anteriores para determinar el factor K.
1. A continuación se muestra un posible código para el modulador PPM,
donde la parte inicial se centra en la generación de las señales de reloj:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use work.constantes.ALL;
entity ppm is
generic (nchips : positive := L;
nbits : positive := M;
factor : positive := K);
Port ( clk,reset,datos : in STD_LOGIC;
clk_datos,clk_ppm,salida : out STD_LOGIC;
datos_par_sal : out std_logic_vector(nbits-1 downto 0));
7/10
PRÁCTICA 7:
DISEÑO EN VHDL DE UN
MODULADOR PPM
POP Tecn. Electrónicas y Comun.
SISTEMAS DE COMUNICACIONES
DIGITALES
end ppm;
architecture Behavioral of ppm is
signal datos_par,datos_serie : std_logic_vector(nbits-1 downto 0);
signal clk_ppm_int,clk_datos_int,clk_par : std_logic;
component Registro is
Port ( clk,preset,D : in STD_LOGIC;
Q : out STD_LOGIC);
end component registro;
signal cuenta_ppm : natural range 0 to nchips := 0;
begin
Gen_relojes: process(clk,reset)
variable cuenta : natural range 0 to factor := 0;
begin
if reset = '1' then
cuenta := 0;
clk_datos_int <= '1';
clk_ppm_int <= '1';
clk_par <= '1';
elsif clk'event and clk='1' then
cuenta := cuenta + 1;
if cuenta = factor then
cuenta := 0;
clk_ppm_int <= '1';
clk_datos_int <= '1';
clk_par <= '1';
else
clk_par <= '0';
if (cuenta mod (factor/nchips)) = 0 then
clk_ppm_int <= '1';
else
clk_ppm_int <= '0';
end if;
if (cuenta mod (factor/nbits)) = 0 then
clk_datos_int <= '1';
else
clk_datos_int <= '0';
end if;
end if;
end if;
end process Gen_relojes;
clk_datos <= clk_datos_int;
clk_ppm <= clk_ppm_int;
Registro_paralelo: for I in 0 to nbits-1 generate
Reg0: if I=0 generate
Reg_0: Registro port map
(clk_datos_int,reset,datos,datos_serie(0));
end generate;
RegM: if I>0 generate
Reg_in: Registro port map
(clk_datos_int,reset,datos_serie(I-1),datos_serie(I));
end generate;
Reg_par: Registro port map
(clk_par,reset,datos_serie(I),datos_par(I));
end generate;
Gen_ppm: process(clk_ppm_int,reset)
begin
if reset='1' then
cuenta_ppm <= 0;
elsif clk_ppm_int'event and clk_ppm_int='1' then
if cuenta_ppm = nchips-1 then
cuenta_ppm <= 0;
else
cuenta_ppm <= cuenta_ppm + 1;
8/10
PRÁCTICA 7:
DISEÑO EN VHDL DE UN
MODULADOR PPM
POP Tecn. Electrónicas y Comun.
SISTEMAS DE COMUNICACIONES
DIGITALES
end if;
end if;
end process Gen_ppm;
salida <= '1' when
(std_logic_vector(conv_unsigned(cuenta_ppm,nbits)) = datos_par)
else '0';
datos_par_sal <= datos_par;
end Behavioral;
La librería de IEEE STD_LOGIC_UNSIGNED ha sido incluida para poder
operar con la función conv_unsigned que convierte un número entero o
natural en un unsigned con el número de bits indicado. El proceso que se
encarga de la generación de las señales de reloj hace uso de un contador
y una serie de sentencias if que van controlando si la variable de tipo
natural cuenta pasa por unos valores determinados para activar las
señales del reloj de datos (clk_datos_int) y del reloj del modulador PPM
(clk_ppm_int), en base a las consideraciones dadas anteriormente.
Asimismo, cada ciclo de la variable cuenta (que va desde 0 hasta K – 1) se
activa también una señal de reloj para el registro paralelo que se encarga
de trasvasar a los registros de salida los datos que ha ido cargando en
serie en los registros de entrada. En la figura siguiente se muestra la
estructura de un registro serie a paralelo de 4 bits.
2. Haciendo uso del ISE Simulator, comprobar el correcto funcionamiento
del generador de relojes para M = 2 y M = 3 bits.
3. A continuación se muestra un posible código en VHDL que integre
todos los bloques diseñados anteriormente:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use work.constantes.ALL;
entity sistema is
Port ( reloj,reset : in
STD_LOGIC;
9/10
PRÁCTICA 7:
DISEÑO EN VHDL DE UN
MODULADOR PPM
POP Tecn. Electrónicas y Comun.
SISTEMAS DE COMUNICACIONES
DIGITALES
datos,sinc,salida_ppm : out STD_LOGIC;
datos_par : out std_logic_vector(M-1 downto 0));
end sistema;
architecture Behavioral of sistema is
component gen_datos is
generic (Nreg : positive);
port(clk,reset : in STD_LOGIC;
datos,sinc : out STD_LOGIC);
end component gen_datos;
component ppm is
generic (nchips : positive;
nbits : positive;
factor : positive);
Port ( clk,reset,datos : in STD_LOGIC;
clk_datos,clk_ppm,salida : out STD_LOGIC;
datos_par_sal : out std_logic_vector(M-1 downto 0));
end component ppm;
signal datos_int,clk_datos,clk_ppm : std_logic;
begin
Gen_datos0: gen_datos generic map (N) port map
(clk_datos,reset,datos_int,sinc);
Gen_ppm: ppm generic map (L,M,K) port map
(reloj,reset,datos_int,clk_datos,clk_ppm,salida_ppm,datos_par);
datos <= datos_int;
end Behavioral;
Obsérvese (véase código de la entidad ppm) que la generación de la señal
PPM se realiza mediante la comprobación de una señal de cuenta
(cuenta_ppm) y los datos paralelos (datos_par). En el momento que
coinciden ambas cantidades, la señal de salida PPM se activa a alta, por
lo que se envía en la posición correspondiente al valor almacenado en
datos_par. Comprobar el correcto funcionamiento del sistema total
mediante el ISE Simulator.
4. Intentar implementar en la FPGA un diseño en el que M = 3 bits. ¿Qué
ocurre en dicho caso? ¿Cómo se podría solucionar?
5. Implementar en la FPGA un diseño en el que M = 4 bits. Observar las
señales de salida haciendo uso de un analizador lógico. A continuación
se muestra una posible configuración para los pines de entrada/salida a
la FPGA:
NET
NET
NET
NET
NET
NET
NET
NET
NET
"reset" LOC = T15;
"reloj" LOC = E12;
"datos" LOC = A13;
"sinc" LOC = B13;
"salida_ppm" LOC =
"datos_par<0>" LOC
"datos_par<1>" LOC
"datos_par<2>" LOC
"datos_par<3>" LOC
A14;
= B15;
= A15;
= A16;
= A17;
10/10