martes, 21 de octubre de 2014

CLASES Y OBJETOS EN C++

Introduccion.

Un programa se dice modulable cuando utiliza la noción de tipo abstracto de dato (TAD) siempre que sea posible. Si el lenguaje de programación soporta los tipos que desea el usuario y el conjunto de operaciones sobre cada tipo, se obtiene un nuevo tipo de dato denominado TAD.

Objetos.
Los objetos en el mundo real son entidades únicas que tienen propiedades especificas, tales como una posición, un color, un tamaño, una textura, etc., que definen su estado. Por lo tanto en la programación orientada a objetos (POO) definimos a un objeto como una entidad que tiene un estado, un comportamiento y una identidad.
  • Su estado esta referido a la propiedades del objeto y como ellas se comportan en ciertos momentos bajo ciertos estímulos. Por ejemplo al agua es un objeto cuyas propiedades pueden pasar del estado solido a liquido o gaseoso bajo ciertas circunstancias que modifiquen sus propiedades.
  • Su comportamiento son las acciones que definen como se puede pasar de un estado a otro ya sea de forma gradual o de forma repentina.
  • Su identidad se basa en el hecho de que aunque existen miles de copias de un objeto cada una es única y se le puede identificar de manera especifica mediante un nombre o numero.
Funcionalmente un objeto es un ente real o abstracto en el que almacenan datos y métodos (operaciones) que manipulen aquellos datos.
  • Datos: son aquellas propiedades que definen al objeto como su color, su temperatura, su textura, etc., en este contexto las variables.
  • Métodos: También conocidos interfaz, es un conjunto de operaciones definidas por la clase del objeto que sean todas visibles al programa. La interfaz se puede entonces considerar como una vista simplificada de un objeto.

Clases.

Una clase es una TAD. Las clases son bloques de construcción fundamentales de los programas orientados a objetos.
Una clase contiene la especificación de los datos que describen un objeto junto con la descripción de las acciones que un objeto conoce como ha de ejecutar. Estas acciones se conocen como métodos. Una clase incluye también todos los datos necesarios para describir los objetos creados a partir de la clase. Estos datos se conocen como atributos, variables, o variables de instancia. El termino atributo se utiliza en análisis y diseño orientado a objetos y el termino variable de instancia se suele utilizar en programas orientados a objetos.

Crear una clase y objetos.

En este apartado comenzaremos a crea una programa simple empleando objetos, en nuevos post desarrollaremos mas conceptos acerca de la POO utilizando C++.
Crearemos una clase llamada Persona que define los metodos setPersona(string, int, float) y printPersona( ) y sus variables de instancia llamados nombre, edad estatura. Esta clase define la "plantilla" de lo que queremos que tenga un objeto (variables de instancia) y como debe manipular esta variables (métodos).
Los objetos se crean en el método main( ) empleando el nombre de la clase seguido de un identificador del objeto (o el nombre del objeto) por ejemplo Persona obj1;
Una vez creando el objeto se pueden crear llamadas a los métodos del objeto empleando el operador  punto (".")  para asi llamar a los metodos que trabajan con los datos del objeto tal como: obj1.printPersona();

#include <iostream>

using namespace std;

class Persona{
public:
   void setPersona(string name, int age, float height){
      nombre   = name;
      edad     = age;
      estatura = height;
   }
   void printPersona(){
      cout << "Nombre  : " << nombre << endl
           << "Edad    : " << edad << endl
   << "Estatura: " << estatura << endl << endl;
   }
private:
   string nombre;
   int    edad;
   float  estatura;
};

int main(){
   Persona obj1;
   Persona obj2;
   obj1.setPersona("Juan Perez", 23, 1.69);
   obj2.setPersona("Menganito Sanchez", 13, 1.40);
   obj1.printPersona();
   obj2.printPersona();
   return 0;
}

Por tanto se observa que de una clase podemos obtener la plantilla para crear varios objetos que encapsulan propiedades similares pero que pueden comportarse de manera independiente y contener sus propios datos sin la necesidad de conocer los datos de los otros objetos a su alrededor.

La Figura 1 muestra el resultado del programa anterior.

Fig. 1 Resultado del programa



lunes, 20 de octubre de 2014

Contador con HDL

REGISTROS

Buen día gente, hoy describiremos hardware empleando el HDL de SystemVerilog, y crearemos registros síncronos y asíncronos.

Que es un registro.

Un registro es un CIRCUITO SECUENCIAL que permite almacenar grupos de bits; es un tipo de memoria de alta velocidad y poca capacidad, permite almacenar y acceder transitoriamente a valores muy usados o emplearlos para la configuración de banderas y configuraciones de un equipo.
Los registros están en la cumbre de la jerarquía de memorias y son la manera mas rápida de un sistema para almacenar datos. 
Según su propósito se clasifican en:
  • Registros de datos:                         Guardan números enteros.
  • Registros de memoria:                   Guardan de forma exclusiva direcciones de memoria.
  • Registros de propósito general:      Pueden guardar datos o direcciones.
  • Registros de coma flotante:            Guardan datos en coma flotante.
  • Registros constantes:                      Tienen valores creados por hardware de solo lectura.
  • Registros de propósito especifico: Guardan información sobre el estado del sistema.

Registro Síncrono.

Bien una vez dicho que es un registro solo definimos lo que es un registro síncrono como un registro que tiene solo una señal de sincronismo dominante generalmente llamada señal de reloj.
Esta señal de reloj permite que en sus flancos positivos o negativos (según se elija) ocurran eventos que definan el estado (el valor actual) del registro; esta clase de eventos podrían ser:
  • Resetear registro. (CLR)
  • Dato de carga al registro. (D)
  • Habilitar/deshabilitar la carga de datos al registro (Ena)
La Figura 1 muestra el símbolo de un registro tipo D y sus señales de control; un registro como este muestra señales síncronas y asíncronas (por lo tanto se dice que un registro es de naturaleza asíncrona). ¿que define a un registro como síncrono? Simplemente el hecho de que ninguna señal asíncrona (CLR, Ena) estará habilitada y solo se regirá el comportamiento del circuito por dos señales: la señal de reloj (el triangulo de la figura) y la entrada de datos (D).


Fig. 1 Registro de un bit y sus señales de control.
Asi que en cada flanco (positivo o negativo) de la señal de reloj, el registro aceptara el valor que sea leido de la señal de datos D y mostrara el valor almacenado en la salida Q.
Los comportamientos de Reset y Enable se tendrán que hacer todos en los tiempos de la señal de reloj y según un orden claro de como funcionaran cada uno de ellos (o mas bien dicho la prioridad de su aparición)

Descripción de Registro síncrono mediante SystemVerilog

Como se dijo anteriormente este circuito no tendrá mas conexiones que la señal de reloj y los datos a almacenar, pero conservara las señales de reset y enable todas ellas síncronas.
El código para realizar esto se muestra a continuación:

module registro
#(parameter BITS = 8)
(
   input  clk,
   input  reset,
   input  enable,
   input  [BITS-1:0]data,
   output [BITS-1:0]out
);

   logic  [BITS-1:0]registro;
 
   always_ff@(posedge clkbegin
       if(reset)       
          registro <= 0;
       else 
          if(enable) 
             registro <= data;
   end
 
   assign out = registro;
 

endmodule

a modo de breve explicación se detallan los siguientes puntos:

  • La variable registro como su nombre lo indica es el registro que almacenara los datos.
  • El proceso always_ff solo tiene en la lista sensible la señal de reloj, así que ella sera la que permita que existan eventos en el registro en los flancos positivos de reloj (posedge).
  • Las señales reset y enable fueron usados dentro del proceso always_ff pero no en la lista sensible, esto convierte a esta señales en señales dependientes de la señal de reloj y por lo tanto son señales síncronas. 
  • Las prioridades de señales o el orden en como se ejecutan dan la máxima prioridad a la señal de reset, esto por si se tuvieran activas tanto la señal de reset como de enable en el flanco positivo de reloj, tenga mayor precedencia la señal de reset y por lo tanto se desprecie la señal de enable.
  • La sentencia assign indica que la salida Q del registro tendrá siempre el valor almacenado en el registro, recuérdese que los modelos HDL son descripciones concurrentes asi que existen procesos paralelos(es decir, se pueden ejecutar diversos always o assign en paralelo).
Toda esta descripción es traducida gráficamente como el circuito de la Figura 2, donde se puede observar como las señales de reset y enable se han colocado como señales de control de multiplexores que a su vez controlan el dato que se deberá presentar en la señal de datos D.
Fig. 2 Registro sincrono: código, modelo RTL y reporte de recursos empleados. 

Registro asíncrono

Si se ha entendido lo que es un registro sincrono, el registro asíncrono no deberá presentar mas dificultadas que el saber que existirán señales que no serán gobernadas por la señal de reloj y que podrán modificar el estado del registro en el momento que lo deseen, despreciando la señal de reloj.
Un ejemplo claro de esto es la señal de reset que puede resetear el registro (colocar su valor a 0) en el momento que lo desee.

Descripción de registro asincrono mediante SystemVerilog

Si por obvias razones el registro sincrono solo contenía en la lista sensible del proceso always_ff la señal de reloj, el registro asíncrono contendrá no solo la señal de reloj como señal predominante sino que también puede contener una señal extra que no dependa directamente de la señal de reloj; así es como describimos el código siguiente: 
 
module registro
(
    input  clk,
    input  reset,
    input  enable,
    input  [7:0]data,
    output [7:0]out
);
   logic  [7:0]registro;
 
   always_ff@(posedge clk, posedge reset)
       if(reset)       registro <= 0;
       else if(enable) registro <= data;
 
   assign out = registro;
 
endmodule

La Figura 3 muestra la traducción gráfica del circuito que se ha descrito, observe que no existen mas los multiplexores y que las señales que no habían sido conectadas del registro ahora son empleadas, puesto que reset es una señal asíncrona y ahora se encuentra en la lista sensible del proceso always_ff, el flanco positivo de la señal de reset puede hacernos entrar al cuerpo del proceso always y revisar las condiciones y prioridades de las señales; enable (aunque no fue descrita en la lista sensible) ya no necesita mas un multiplexor puesto que las señales sensibles de reset y clk son empleadas y enable tiene la menor prioridad simplemente se conecta a su respectiva linea en el registro.

Fig. 3 Registro asíncrono: código HDL, modelo RTL y reporte de recursos empleados