martes, 23 de diciembre de 2014

FeLiCiDaDeS !

Estimados/as... Por este medio quería dejarles mi mas afectuoso saludos de un HERMOSA NAVIDAD y un MUY PROSPERO AÑO NUEVO. Esperando y deseando que el 2015 sea un GraN AÑO para todos Uds. en todo sentido.

El 2014 los he tenido un poco abandonados, pero fue un año bastante complicado, por suerte recien estoy volviendo de un Curso en Costa Rica (saludos a los valientes participantes) que me ha llenado de sugerencias para el blog, así es q esperen novedades pronto....

Muchas Felicidades y los Mejores Augurios !!

 Cristian

miércoles, 22 de octubre de 2014

Diseño Jerárquico - Components / Port Map / Generic Map

Introducción

VHDL es extremadamente potente cuando un gran sistema se divide en sub-sistemas individuales, pequeños, y luego se va creando el sistema mediante la conexión de los componentes individuales. algunos les llaman sub-sistema, sub-componentes, otros sub-modulos, etc. también se le llama diseño top-down a este modo de dividir en partes pequeñas un sistema complejo. 

Para poder construir un componente complejo a partir de diversos sub-componentes, VHDL tiene un par de instrucciones que facilitan este proceso: declaración de componente, e instanciacion de componente. 

Declaración de Componentes 

Para usar un componente ya definido (entity/architecture), que va pasar a ser un sub-componente, en un nuevo componente es necesario primer declarar el componente a usar, y luego instanciarlo. Una declaración de componente simplemente específica la interface de E/S del componente mediante el uso de los puertos de E/S (I/O ports),  y los generics.   

-- declaracion de component
component register
  generic(bus);
  port (
    clk: in  std_logic;
    rst: in  std_logic;
    d_b: in  std_logic_vector(bus-1 downto 0);
    reg: out std_logic_vector(bus-1 downto 0)
       );
end component;


Nota: cuando la cantidad de declaración de componentes sea un número considerable, es aconsejable declarar los componentes en un paquete. De este modo el código en sí queda mas ordenado, limpio, y fácil de seguir. De todos modos a partir de VHDL-2008 no hace falta la declaración de componentes si la sintaxis de la instanciación de componentes es similar a la que se detalla en el ejemplo debajo. 


Instanciación de Componentes

Específica como las E/S del componente declarado (usando la declaración de componente explicada previamente), son conectadas en el diseño en que se utiliza el componente.


-- a)instanciacion de componente con asociacion posicional

U1: register port map (sys_clk, sys_rst, data_bus, reg_data);


-- b) instanciacion de componente con asociacion por nombre

U1: register port map (

                 clk => sys_clk,
                 rst => sys_rst,
                 d_b => data_bus,
                 reg => reg_data

                   );

-- c) instanciación en VHDL-2008 (sin declaración de componente)
U1: entity work.register port map (
                 clk => sys_clk,
                 rst => sys_rst, 
                 d_b => data_bus,
                 reg => reg_data
                   );


En la instanciación por posición, la lista de conexiones se hace en el mismo orden en que los puertos fueron declarados en la entidad del componente instanciado. 
Se aconseja el uso de asociación por nombre, ya que es menos propensa a errores. En esta caso también se aconseja separar las asociaciones por funcionalidad mas que por si son entradas o salidas. 


Ejemplo Sencillo 




library ieee;
use iee.std_logic_1164.all;

entity GATING is
  port (A, CK, MR, DIN: in  std_logic;

        RDY, CTRLA    : out std_logic);

end GATING;

architecture STRUCT of GATING is

component AND2
  port(  X, Y: in  std_logic;
         Z   : out std_logic);
end component;
component DFF
  port (D, CLOCK: in  std_logic;
        Q, QBAR : out std_logic);
end component;
component NOR2
    port ( DA, DB: in  std_logic;
           DZ    : out std_logic);
end component;
signal S1, S2: std_logic;

begin
D1: DFF  port map (A, CK, S1, S2);
A1: AND2 port map (x => S2, y=>DIN, Z => CTRLA);
N1: NOR2 port map (S1, MR, RDY);
end STRUCT;


Salidas no Usadas

En caso en que una salida del componente instanciado no se use cuando se instancia el componente, se debe explícitamente usar la palabra clave open para especificar que esa salida se deja abierta, no se utiliza, por lo que si es posible el sintetizado puede optimizar la lógica correspondiente. 

Entradas no Usadas

En caso en que una entrada del componente instanciado no se use cuando se instancia el componente, se debe explícitamente fijar un valor lógica a dicha entrada. Para ello se puede asociar la entrada no utilizada con '1' o '0'. 


Generic Map


El generic es un valor constante usado para describir en forma parametrizada una entidad. Ahora bien, diferentes instanciaciones de una misma entidad pueden tener diferentes valores de generic, para ello se usa el generic map.
Del mismo modo que antes, en caso de haber mas de un generic se puede usar asociación por posición o asociación por nombre. 
Ejemplo: 

entity registro_dff
  generic(reg_width: positive);
  port(
    rst,clk: in  std_logic;
    d, q   : out std_logic_vector(reg_width-1 downto 0);
     );
end entity registro_dff;
. . .
architecture ejemplo of registro_dff is
....
....
end ejemplo; 

-- instanciacion de registro_dff en otra entity
....  architecture test of registro_bus is
constant width_8 : positive:= 8;
constant width_16: positive:= 16;
signal d8, q8  : std_logic_vector(7 downto 0);
signal d16, q16: std_logic_vector(15 downto 0);
. . .

begin
  ff8: registro_dff generic map(width_8)
           port map (rst, clk, d8, q8);
  ff16: registro_dff generic map(width_16)
            port map (rst, clk, d16, q16);
. . .

end test;


martes, 14 de octubre de 2014

Reduciendo el tiempo de compilación en Quartus II

Por defecto Quartus recompila todos los módulos .vhd/.v del proyecto que se está llevando a cabo, aún cuando lo único que se haya modificado haya sido un punto y coma en uno solo de los módulos .vhd o .v. 
Existe una opción que permite recompilar solo los módulos modificados, ahorrando así mucho tiempo de compilación. 
Los pasos a seguir para configurar Quartus para minimizar el tiempo de compilación son: 

Assignments menu -> Settings 

Compilation Process Settings -> Incremental Compilation , click para seleccionar Rapid Recompile opción ON.

Otra opción que permite reducir tiempo de compilación es configurar Quartus para que use todos los núcleos del procesador de la computadora que se esté usando. 

Compilation Process Settings -> Parallel Compilation -> Use All Available Processors

Una ultima opción, es decirle a Quartus que use Smart Compilation. Al usar Smart Compilation se saltean alguno de los pasos del Compiler, tales como Analysis y Synthesis (cuando estos no son necesarios para recompilar el diseño).  

Compilation Process Settings -> Smart Compilation, click para opción ON.


Nota: estas son soluciones muy simples para diseños simples . Para diseños complejos hay otras opciones y factores a tener en cuenta que los detallaré en otro blog. 


viernes, 3 de octubre de 2014

Descanso del Blog y ..... VHDL Guía de Referencia...

Fines del '13 y comienzos del '14 fueron bastantes ocupados para mi ... cursos varios (VHDL Básico/ VHDL Avanzado / NIOS), lugares diversos (Los Reyunos / Parana / Trieste / Buenos Aires) todo esto me mantuvo alejado de este Blog.... 
PERO, PERO, la frutilla del postre es un pequeño libro de referencia que terminé (finalmente) de escribir- "VHDL Sintax. Guía de Referencia Rápida". 
Es una guía bastante práctica que describe las instrucciones de VHDL más frecuentemente usadas para la descripción de un sistema digital que será implementado en un FPGA. Por cada instrucción se presenta en forma detallada la sintaxis, la síntesis resultante, consejos para el mejor uso de la instrucción y algún cuidado o precaución a tener en cuenta cuando se la use. 
Les dejo acá unas fotos para su deleite :) ... 




Por supuesto que está a la venta para quien quiera tenerlo en sus manos. 
Por favor contactarme por email para costo, envío, etc, etc... 


viernes, 11 de abril de 2014

Correcto uso de Reset en FPGAs y su Codificación en VHDL


Introducción


En esta nota técnica se describirán con bastante detalle los distintos tipos de reset que se pueden usar en un sistema digital, sus ventajas y desventajas, y cual de ellos es el más aconsejable a usar para tener un sistema más confiable.

A pesar de que el reset de un sistema es un tema crítico, pocas veces se le da la importancia que tiene y es usualmente uno de los aspectos ignorados en un diseño con FPGA. Un circuito de reset que no se comporte correctamente resulta directamente en un mal funcionamiento aleatorio del sistema. Y como ya sabemos, los problemas aleatorios, no repetitivos, de un sistema son los más difíciles de depurar.

Un diseño puede tener reset sincrónico o asincrónico. Normalmente la señal de reset es generada externamente al FPGA, por lo que es una señal asincrónica. Básicamente la señal de reset es una entrada al sistema que posibilita la correcta inicialización del mismo. Como así también, pueda forzar al sistema a ese estado inicial cuando haga falta (por ejemplo, cuando el sistema se ‘cuelga’, o se va de su normal funcionamiento). Esta señal asincrónica puede sincronizarse a través de un circuito sincronizador, para de este modo crear una señal de reset sin glitches y por lo menos de un ciclo de reloj de ancho. Sin embargo, como se detallará en los próximos puntos el reset totalmente sincrónico puede ocasionar alguna fallas aleatorias, por lo que se propone otro circuito a fin de hacer el sistema más confiable.


.........................................................................................................................................................

Comencé a escribir este blog, investigué bastante, y me encontré conque no hay algún lugar donde se pueda encontrar lo que yo considero importante de este tema. Por eso armé algo basado en mi experiencia, más una que otra información, y me quedó un blog kilométrico, que no creo conveniente publicar algo tan largo como un blog; por lo que sí te interesa este tema podes bajar el pdf desde este -link-

Espero te sea útil. 

Hasta pronto, y gracias por visitar mi blog. . . 

Cristian