sábado, 29 de junio de 2013

Contador de anillo con VHDL en Basys 2

EJERCICIO: Solo uno de los 8 leds disponibles en la tarjeta Basys 2 debe encender  cada segundo en una secuencia  contador de anillo.

Solución: 

1).Creamos nuevo proyecto: contador_de_anillo y guardamos en la carpeta apropiada efectuando la debida configuración de acuerdo a las propiedades del proyecto y características de la FPGA.

2) Como nueva fuente trabajamos el código en VHDL creando el archivo contadordeanillo.vhd

3) Se chequea sintasis y luego se efectúa la síntesis.Para este caso no efectuamos la simulación.

4) Asignamos pines en User Constraints ---> Floorplan Area / IO / Logic- Post-Synthesis

El reloj de 50 Mhz está localizado en el pin B8 de la tarjeta Basys 2.Para los LEDS vienen marcados en la tarjeta.

5) Implementamos el diseño, se genera el archivo de programación y se configura el dispositivo en la tarjeta.

6) Antes de alimentar la tarjeta  y programar la FPGA es conveniente en el Resúmen del Diseño de la FPGA  (FPGA Design Summary)  verificar que los pines del reloj y de los LEDs están todos correctos.


Para esto se da click en View Design Summary, luego en Pinout Report y por último en Signal Name.

5) Se alimenta la tarjeta a través del conector USB. Se llama el programa ADEPT y se busca y se programa la FPGA con el archivo contadordeanillo.bit. Se dice Si a las advertencias.

El led rojo titila indicando que se está efectuando la programación y en el mensaje de la ventana de Digilent Adept debe indicarse que la programación se ha efectuado exitosamente (Programming Successful).

Compuertas lógicas en Basys 2 con VHDL

EJERCICIO: Utilizando dos Switches se dan valores binarios a las entradas X,Y y se generan las diferentes compuertas lógicas para ser visualizadas en los leds de la tarjeta Basys 2.

Vamos a indicar los pasos básicos sin entrar en detalle. Si el lector requiere paso a paso las indicaciones se sugiere previamente  estudiar los laboratorios con la tarjeta Spartan 3E explicados en  entradas anteriores del blog para que adquiera habilidad en el manejo del software Xilinx ISE 10.1

1). Primero cerramos el proyecto existente en el navegador de Xilinx 10.1 y creamos un nuevo proyecto que vamos a guardar en una carpeta que previamente se ha creado para trabajar con Basys 2.
El proyecto lo llamamos compuertas  e indicamos  como HDL el tipo de nivel superior de fuente   en el que se van a trabajar las compuertas lógicas.

Indicamos las propiedades  del proyecto  y las características propias de la FPGA de la tarjeta basys 2:


2). Creamos como nueva fuente un módulo VHDL para indicar el programa respectivo:

 3). Se efectúa la síntesis del circuito para compilar el archivo VHDL después de haber chequeado su sintásis.

 4),  Se hace ahora la simulación respectiva:
5).. Se efectúa la asignación de pines y luego editamos el archivo compuertas.ucf para verificar que está correcto.



6).estando el circuito sintetizado y simulado, se procede a implementar el diseño, generar el archivo de programación y configurar la FPGA en la tarjeta Basys 2, tendiente a generar el archivo compuertas.bit, que es el objetivo final.  En las FPGA el archivo .bit es el equivalente al archivo .JED para programar  las GAL:

7) Se conecta el cable  USB que alimenta y permite la programación de la FPGA de la tarjeta Basys 2.
Abrimos el software ADEPT de la empresa Digilent, fabricante de la tarjeta.
Con Browse  buscamos el archivo compuertas.bit en la carpeta donde guardamos el proyecto.
Damos Si  en la advertencia que aparece.
Se da click en program, y si nuevamente a la ventana con adevertencia, y la tarjeta debe funcionar perfectamente despues de titilar brevemente el led rojo, indicativo de que la programación ha sido exitosa.
En Adept  debe aparecer en la parte de abajo un mensaje indicando que la programación de la FPGA se ha efectuado satisfactoriamente.
 Mediante Adept se puede chequear el correcto funcionamiento de la tarjeta con un test de prueba.

 Se muestra en tiempo real que switches o pulsadores se accionan.Los displays de 7 segmentos muestran un contador en hexadecimal desde 0000 hasta FFFF (4 dígitos unificados)

Después de realizado el test de prueba se requiere volver a grabar la FPGA para que vuelva a funcionar.
Si se desenergiza se pierde la programación.Ello es debido a que las LUTS (tablas de búsqueda) de la FPGA se efectúan sobre memorias RAM volátiles. Si se desea que el programa perdure aun cuando se quite  la alimentación hay que grabarlo en la memoria PROM Flash que dispone la tarjeta junto con la FPGA.

miércoles, 26 de junio de 2013

Manual de referencia de la tarjeta Digilent Basys 2

La tarjeta BASYS 2 es una tarjeta de desarrollo,fabricada por la compañía DIGILENT, que contiene una FPGA  Xilinx  Spartan 3E-100,XC3S100E-CP132, un arreglo lógico programable de campo con 100.000 compuertas. 
  Está diseñada para el aprendizaje de sistemas  digitales de complejidad media utilizando un entorno de desarrollo profesional. Es  la ideal para el estudio de Digitales 2 a nivel de Ingeniería Electrónica y Biomédica en la UAN.

Además de la FPGA, esta tarjeta contiene una serie de recursos que pueden ser utilizados en los diseños de los circuitos. Concretamente contiene:
• 4 pulsadores.
• 8  interruptores deslizables.
• 8 LEDS, cátodo común.
• 4 displays de 7 segmentos en visualización dinámica.
• Un conector de teclado de PC (PS2)
• Una salida VGA para monitor de computador.

Todos estos recursos se encuentran conectados a las patillas de la FPGA de la forma que se indica en la siguiente figura:
Observe que cada elemento se identifica con una Letra y un Número de uno o dos dígitos,  con el cual se identifica el Pin, por ejemplo el LD0 se localiza como M5, el Switche SW0 está asociado con el pin P11, etc.
 Además la FPGA posee una entrada conectada a un reloj de 50 MHz que  corresponde a  la localización de pin B8.
 Se entiende que para el conector de teclado o el monitor VGA del computador tambien hay pines asociados que por el momento no se requieren, debido al uso inicial que se pretende dar a la tarjeta en las primeras prácticas, solo utilizando Switches y pulsadores como Entradas  y los Leds y Displays de 7 segmentos en las salidas de los circuitos a implementar.  Mas adelante se puede utilizar el Teclado para introducir datos, y el Monitor del PC para visualizar la salida.

Adicionalmente existen 4 conectores para trabajar externamente entradas y salidas, por ejemplo con el protoboard. Los cuatro conectores de expansión estándar permiten a la tarjeta Basys2 crecer utilizando circuitos diseñados por el usuario o PMods. (Los PMods son módulos de E/S analógicos y digitales de bajo costo que ofrecen conversión A/D y D/A, drivers para motor, entradas de sensor y muchas otras características). 
Supongamos que por ejemplo se desea trabajar con 4 leds de alto brillo o leds de chorro. Digilent ofrece por 10 dólares  un módulo de expansión  de 6 pines con los leds y sus transistores para que los manejen.

 Veamos el diagrama lógico de los leds y transistores:

Si necesitamos un display de cristal líquido LCD, por 35 dólares Digilent ofrece la respectiva tarjeta expansora que utiliza  dos puertos, o sea 6 pines:

Veamos su diagrama eléctrico:

 Se ofrece adicionalmente documentos de soporte para cada módulo expansor.

El lector puede conocer todos los módulos de expansión disponibles con sus respectivos precios en https://www.digilentinc.com/Products/Catalog.cfm?NavPath=2,401&Cat=9


Uno de los 6 pines del conector es tierra (GND) y otro es Vcc de 3,3 voltios en cada puerto de expansión.
  .
 Se pueden observar en el gráfico anterior las resistencias de protección contra corto circuitos a las salidas, lo mismo que Diodos de protección ESD a tierra contra descargas electrostáticas.
Las descargas electrostáticas, como su nombre lo indica, consisten en un flujo repentino de corriente a través de un material, que generalmente es un aislante, pero que la diferencia de potencial entre sus extremos genera un campo eléctrico de cierta magnitud, convirtiendo los átomos del material en iones que conducen corriente.
Estas descargas se convierten en una seria amenaza para algunos dispositivos electrónicos sensibles, ya que gran parte de ellos incorporan una capa delgada de aislante, como por ejemplo dióxido de silicio, la cual se rompe cuando es sometida a altos voltajes, dañando irreparablemente el dispositivo.

Síntesis de circuitos mediante la tarjeta BASYS 2:

La síntesis de circuitos se puede realizar por medio del editor esquemático o mediante el lenguaje de descripción hardware VHDL. Se compilará utilizando el entorno ISE de XILINX como el XILINX ISE 10.1 que está disponible en el laboratorio de Simulación de Electrónica-Biomédica en la UAN,sede Sur,Bogotá.   Este entorno es capaz de crear un archivo para la configuración de la FPGA a partir del código VHDL que se escribe(archivo de “bit stream” con extensión .bit). Dicho archivo debe ser cargado en la tarjeta BASYS 2. Esto hace que el hardware interno de la FPGA se configure para seguir las especificaciones de  lo que se requiere implementar.
Para volcar el contenido del archivo en la FPGA y configurarla es necesario utilizar el programa ADEPT de DIGILENT, el cual también debe estar  disponible en el PC adicional  al XILINX ISE.

Para implementar un circuito digital en la FPGA de la tarjeta Digilent Basys 2 deben seguirse los siguientes pasos:
1). Dibujar el circuito lógico en el Editor Esquemático o escribir un código en VHDL que describa el hardware que queremos sintetizar.
2). Compilar el esquemático o el código VHDL  y generar el archivo de “bit stream”. Evidentemente el archivo no se generará si el programa tiene errores.
3) Efectuar la simulación del circuito a implementar. 
4). Una vez generado el fichero de “bit stream”, deberá utilizarse el programa ADEPT para volcarlo en la FPGA.
5). En este momento, la FPGA se convierte en un circuito que deberá realizar la tarea que haya sido descrita mediante el esquemático o el código  VHDL.

Utilización del entorno ISE:
Para realizar una síntesis mediante el entorno ISE debe crearse un proyecto.
Vaya al menú FILE -> NEW PROJECT. Aparecerá una ventana donde tendrá que escribir el nombre del nuevo proyecto.  Asegúrese también que en la casilla de selección “Top level Source Type” aparece “HDL”.
En la siguiente pantalla deberá ajustar los siguientes valores:
Family: Spartan 3E
Device: XC3S100E
Package: CP132
Speed: -5
Synthesis tool: XST (VHDL/Verilog)
Simulator: ISim (VHDL/Verilog)
Preferred Language: VHDL

Por último sáltese las siguientes pantallas pulsando en “Next”. En la última aparecerá el botón “Finish”.

Para compilar el código y generar el “bit stream” , seleccione el fichero o archivo  principal del proyecto y haga doble click en “Generate Programming File” en la parte inferior izquierda, después de haber efectuado la asignación de pines con el editor respectivo “Edit Constraints" y generar el respectivo archivo con extensión UCF.

Programación de la FPGA de la tarjeta Digilent  Basys 2:

Contiene un cable USB que le proporciona energía y es utilizado como interfaz de programación, por lo que ninguna otra fuente de poder o cable de programación es requerido.

 Para el uso de las tarjetas de Digilent que cuentan con conector Mini-USB como  la Basys2  se requiere un software extra para poder realizar la comunicación: Adept de Digilent; El software puede descargarse de manera gratuita en el sitio web http://www.digilentinc.com/Products/Detail.cfm?NavPath=2,66,828&Prod=ADEPT2, en la sección “Software”: Digilent Adept, el paquete a descargar para Windows es Adept 2.6.1 System, 32/64-bit. Su instalación es muy sencilla, basta con hacer doble clic en el icono del software descargado y seguir las instrucciones.


Conecte la tarjeta Basys2 a un puerto USB disponible de una computador, Windows reconocerá que se ha conectado un nuevo dispositivo y procederá a asociarlo con el controlador adecuado.  Arranque el  programa: ADEPT.   y si la tarjeta se encuentra conectada  adecuadamente, se debe tener algo como lo que se muestra en la figura siguiente:

 Mediante el botón “Browse…” situado en la línea superior puede seleccionar el archivo que desea cargar. El archivo debe tener extensión .bit  A continuación haga click en el botón “Program”.a la derecha de “Browse…   Acepte la ventana que aparece y el fichero será transferido a la FPGA configurándola de tal manera que obedezca  el circuito descrito en su diseño.
 Durante la programación, un led de color rojo, que se encuentra a un lado de los pines de alimentación externa de la tarjeta se enciende, una vez terminado el proceso se indica si ha sido exitoso en la ventana de mensajes de Adept.

Recomiendo consultar un excelente trabajo de investigación realizado por el ingeniero Mario Merino Marquez del Instituto  Tecnológico  de  Tehuacán, México, titulado "Viabilidad de la tarjeta Basys 2 para su implementación en el control de un proceso".http://es.scribd.com/doc/97695972/Vibilidad-de-La-Tarjeta-Basys2-Para-Su-Implementacion-en-El-Control-de-Un-Proceso

sábado, 25 de mayo de 2013

Autoevaluación máquina ASM con respuestas (Simulada en Altera)



Una máquina de estado algorítmica dispone en su procesador de datos de un Contador 74190  ( C ) y de un flip-flop J-K (M)  para manejar un  motor DC, y responde al siguiente diagrama ASM:
  


 RESPUESTAS:
1)  Simulación en Altera del funcionamiento de la máquina:


2) Implementación de la Unidad de Control:

Simulación del control:

3) Procesador de datos:


viernes, 5 de abril de 2013

Contador descendente prefijado con Gal22V10 en ABEL

Ejercicio:  Diseñar un contador que inicie en 9 decimal, y al recibir una órden cuente en forma descendente hasta llegar a cero, en donde se bloquea, y se genera un pulso negativo para disparar un 555 como Monoestable no redisparable. Al finalizar el tiempo del monoestable (10 segundos) el contador debe estar nuevamente tal como al principio para poder repetir la operación. Durante los 10 segundos que se active el monoestable debe funcionar un motor DC de 5 voltios que debe estar optoacoplado para evitar ruidos que incidan en una falla en el circuito.

Solución: Trabajamos con ISPlever clasicc 1.6 para generar el contador por tabla de estado en lenguaje ABEL:
Verificamos su comportamiento simulando sus formas de onda:

Observamos que debido al Reset Power On disponible en la GAL22V10 los flip-flops inician en nivel bajo, y en el primer flanco de subida de reloj al estar la entrada Inicio = 0, el contador permanece en 9 decimal, y luego al pasar Inicio a 1, se da el conteo en forma descendente.

Se genera símbolo esquemático para seguir trabajando el ejercicio esquemáticamente y obtener la salida para disparar el monoestable y resetear el astable:


Debido a que el contador por defecto inicia resetaeado hay que usar Or de 3 entradas tal como se muestra para generar el Trigger para evitar que el monoestable se dispare desde el principio.

Se puede simular para verificar el buen comportamiento de lo requerido:

 Como el Monoestable es no Redisparable no importa el "Glitch" que se observa en la onda del trigger.

Podemos proceder entonces al diseño LINK y FIT que nos garantice que la GAL22V10 puede cumplir con lo exigido. 
El Chip Report nos indica como debemos efectuar la implementación de la GAL en el protoboard:
A las salidas del contador se coloca el decodificador 7447 ó 7448 para manejar el display de 7 segmentos de Anodo o Cátodo común que se disponga.


En muchas ocasiones se hace indispensable, para evitar ruidos que pueden incidir en un mal funcionamiento de un circuito secuencial, el uso de un optoacoplador que aisle la carga del circuito secuencial. Para este situación es muy util implementar una salida optoacoplada con el PC817, tal como se muestra en el siguiente esquema:
Si la Entrada es 0 el relé está desenergizado y se activa el LED de potencia, y si la entrada es 1 se energiza el relé y se activa el MOTOR DC.  Como el motor funciona al crearse un campo electromagnético en el,  si no existiera el aislamiento eléctrico causará ruido y molestaría en el circuito lógico que lo está activando.

 El  Optoacoplamiento, quiere decir que el acoplamiento del motor y del LED de potencia con el circuito lógico que lo activa, se hace en forma óptica, a través del diodo infrarojo y el fototransistor que existen en el interior del chip de 4 pines PC817. Con el 0 lógico el led infrarojo no emite luz, y el fototransistor está abierto, en cambio, si se tiene un 1 lógico a la entrada, el led emite luz. y el fototransistor conduce.

Observe además que se están utilizando  tanto los contactos normalmente abiertos como los normalmente cerrados, o sea los 5 pines de que dispone el relé de 5 voltios.El diodo rectificador 1N4001 dispuesto inversamente y en paralelo con la bobina del relevo actúa como supresor de picos de corriente cotrarrestando la Ley de Lenz (  VL = - L di / dt), y evitando que el voltaje autoinducido negativo que se genera en la bobina del relevo queme el transistor 2N2222A que se está utilizando como interface entre la salida del optoacoplador y la bobina o entrada del relevo.

Mas información sobre este interesante tema del optoacoplamiento se puede obtener en http://es.wikipedia.org/wiki/Optoacoplador

sábado, 2 de febrero de 2013

Contador binario ascendente descendente de 5 bits con VHDL en FPGA de Spartan 3E

Ejercicio: Diseñar con VHDL e implementar en la tarjeta Digilent con FPGA Spartan 3E un contador binario de 5 bits tanto ascendente como en forma descendente, que trabaje a 1 Hz de frecuencia. El contador dispone además de entrada de habilitación con la cual se puede bloquear.


Solución:  Creamos el proyecto contador0al31 tal como se ha indicado en entradas anteriores de este blog, definiendo como VHDL el modo jerárquico de trabajo.


Como no vamos a trabajar nada en Esquemático lo aconsejable es elaborar un gráfico que resuma el diseño, para elaborar los diferentes módulos VHDL requeridos.


Observamos que hay un bloque principal CONTADOR5BITS de entradas: CLK50Mhz, Habilitador y Dirección y salidas: Q4,Q3,Q2,Q1,Q0.  Hay dos bloques sen su interior: el Divisor_Frecuencia de entradas: CLKentrada y Reset, y salida: CLK1Hz.  El otro bloque es el contador0al31 cuyas entradas son: Reloj y ModoConteo y salidas: Salida4,...,Salida0.

Vamos a elaborar un programa VHDL  para cada bloque en el siguiente órden:

  • contador0al31
  • Divisor_Frecuencia
  • CONTADOR5bits (que enlace los dos anteriores de acuerdo al gráfico)


Al crear Módulo VHDL  como nueva fuente para contador0al31 defina las entradas y salidas tal como se indica a continuación:


Observe que la Salida se configura como vector (Bus de 5 bits) .

El ISE 10.1  nos lleva a la ventana para escribir el programa en VHDL del contador el cual lo editamos así:


Para escribir lo concerniente a la arquitectura ...después de begin nos ayudamos de las plantillas de VHDL.

Para ello vaya a Edit --> Language Templates ... --> VHDL --> Synthesis Constructs --> Coding Examples --> Counters --> Binary --> Up/Down Counters --> Simple Counter

La plantilla nos muestra:

 process (<clock>) 
begin
   if <clock>='1' and <clock>'event then
      if <ModoConteo = '1' then   
         <count> <= <count> + 1;
      else
         <count> <= <count> - 1;
      end if;
   end if;
end process;

Editamos de acuerdo al nombre dado nuestras entradas, así:


process (Reloj) 
begin
   if   Reloj = '1' and Reloj'event then
      if ModoConteo = '1' then   
        cuenta <= cuenta + 1;
      else
         cuenta <=  cuenta - 1;
      end if;
   end if;
end process;


Copiamos y pegamos al comienzo (begin) de la arquitectura ... en el archivo en VHDL, y cerramos la plantilla. Salvamos el archivo VHDL, y chequeamos la sintaxis para saber si está bien en este aspecto.

Vemos que se presenta error de sintaxis...



Se indica en el reporte que  se presenta un error porque no se ha definido la variable "cuenta"

Procedemos entonces a declarar esa variable "cuenta" como una señal auxiliar interna SIGNAL antes de comenzar el proceso del reloj  y así mismo después de finalizar el mismo proceso hay que señalar que lo que está en "cuenta" hay que enviarlo a la "Salida" del contador.

Después de haber efectuado las correcciones el programa queda así:


Al chequear sintaxis vemos que ahora no se presenta error.Luego continuamos con la simulación del circuito.

Creamos el archivo de chequeo de formas de onda, que llamamos contador0al31_tb.



Configure la ventana de tiempos de inicialización como se indica:


Cuando la entrada ModoConteo = 1, el contador lo hace ascendentemente, y si vale 0 cuenta en forma descendente. Dibujamos dicha entrada arbitrariamente, para observar en la simulación el comportamiento del contador:


Salvamos el archivo del banco de pruebas y cerramos la ventana de las formas de onda, y procedemos a efectuar su simulación:


Podemos verificar con las formas de onda que el contador responde a lo solicitado.


Procedemos ahora con el divisor de frecuencia el cual no simulamos.


De este blog en la entrada (Intermitencia en encendido y apagado de un Led) copiamos el respectivo programa VHDL , lo copiamos, editamos para que se acople a las entradas y salidas que le asignamos en nuestro gráfico donde presentamos los bloques,  salvamos y chequeamos sintaxis:


Vamos ahora a enlazar los dos bloques o programas, de acuerdo al gráfico inicial, al cual le adicionamos una señal interna  X   necesaria  para el diseño:



Creamos el programa final VHDL  CONTADOR5bits para enlazar los dos anteriores:


Fijamos entradas y salidas, como se indica en color amarillo en el gráfico.

El programa final es el siguiente:

--Programa final que enlaza Contador0al31 con Divisor_Frecuencia

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity CONTADOR5bits is
    Port ( CLK50Mhz :    in  STD_LOGIC;
           Habilitador : in  STD_LOGIC;
           Direccion :   in  STD_LOGIC;
           Q :          out  STD_LOGIC_VECTOR (4 downto 0));
end CONTADOR5bits;

architecture Comportamiento of CONTADOR5bits is

    component Divisor_Frecuencia is
        Port (
        CLKentrada: in  STD_LOGIC;
        Reset     : in  STD_LOGIC;
        CLK1Hz    : out STD_LOGIC
           );
        end component;

component contador0al31 is
                Port ( Reloj : in  STD_LOGIC;
                ModoConteo : in  STD_LOGIC;
           Salida : out  STD_LOGIC_VECTOR (4 downto 0));
      end component;

signal X : STD_LOGIC;

begin

 C1:  Divisor_Frecuencia port map
( CLKentrada => CLK50Mhz, Reset => Habilitador, CLk1Hz => X); 

C2: contador0al31 port map
 ( Reloj => X, ModoConteo => Direccion , Salida => Q); 

end Comportamiento;


Chequeamos sintaxis para estar seguros que no se presenta error alguno, y puede ser compilado.


Sigue ahora la asignación de pines a la FPGA para el archivo CONTADOR5bits.vhd final:



Damos doble click en Floor Area /IO/ Logic-Post-Synthesis para entrar al editor PACE donde se asignan los pines a las entradas y salidas:


 Observe que se ha fijado el iterruptor  L13 para la dirección y  el pulsador K17 para habilitar el contador.

Salvamos el archivo de asiganación de pines y cerramos el editor PACE.

Damos doble click en Implement Design ( que presenta un interrogante color naranja a su derecha):



Corroboramos observando en el  resumen del diseño (View Design Summary), el reporte de pines (Pinout Report), dando click en la columna (Signal Name) que los pines están localizados correctamente:


Alimentamos la tarjeta Digilent Spartan 3E y conectamos el cable USB para efectuar la programación de la FPGA dando doble click en Configure Target Device. 

Al programar la FPGA vimos que el comportamiento del contador presentaba problemas al manejar el pulsador K17.  Se decidió cambiarlo por el interruptor N17; para ello editamos el archivo de asignación de pines CONTADOR5bits.ucf   y efectuamos el cambio en la entrada Habilitador de K17 por N17 (interruptor al extremo izquierdo de la tarjeta)


Como variamos la asignación de pines, después de salvar el archivo .ucf,  se requiere volver a implementar el diseño.  Damos doble click en Implement Design (que aparece nuevamente con interrogante color naranja).

Verificamos en el Pinout Report del resúmen del diseño, dando click en la columna de nombre de señal, que se haya verificado el cambio respectivo:


Configuramos el dispositivo en la tarjeta para que se genere el archivo de programación nuevamente, ya con el cambio efectuado.Luego volver a efectuar la programación de la FPGA, alimentando la tarjeta y conectando el cable USB.

En el video podemos observar su correcto funcionamiento: