////////////////////////////////////////////////////////////////////////////////
//          curso_verilog.v - Curso práctico de iniciación a Verilog          //
//                                                                            //
// Copyright 2009,2010 Jorge Juan <jjchico@gmail.com>                         //
//                                                                            //
// Este archivo es parte de curso_verilog.v. curso_verilog.v es software      //
// libre: puede redistribuirlo y/o modificarlo bajo los términos de la        //
// Licencia General Pública de GNU publicada por la Fundación de Software     //
// Libre, tanto su versión 3 como, opcionalmente, cualquier otra versión      //
// posterior.                                                                 //
//                                                                            //
// Debe haber recibido una copia de la Licencia General Pública de GNU junto  //
// con curso_verilog.v. Si no es así, véase <http://www.gnu.org/licenses/>.   //
//                                                                            //
//                          **** **** **** ****                               //
//                                                                            //
// This file is part of curso_verilog.v. curso_verilog.v is free software:    //
// you can redistribute it and/or modify it under the terms of the GNU        //
// General Public License as published by the Free Software Foundation,       //
// either version 3 of the License, or (at your option) any later version.    //
//                                                                            //
// You should have received a copy of the GNU General Public License          //
// along with curso_verilog.v.  If not, see <http://www.gnu.org/licenses/>.   //
////////////////////////////////////////////////////////////////////////////////
	
INTRODUCCIÓN
	
   ¡Hola!
	
   Este es un curso básico de Verilog escrito en Verilog. Mientras otros
   cursos contienen ejemplos, éste curso es más bien una colección de ejemplos
   que contienen un curso.

   Cada archivo ".v" constituye un ejemplo de codificación en Verilog junto
   con los comentarios y descripciones breves de los conceptos que incorpora.

   Para seguir el curso basta con acceder a la carpeta de cada unidad o lección
   y abrir los archivos con código Verilog que contiene (extensión .v).
   
   Para sacar el máximo partido de este curso, el alumno debe compilar y
   simular los diseños que se proponen. En este curso se emplea Icarus
   Verilog [1] para la simulación y Gtkwave [2] como visor de ondas. Ambos
   programas están disponibles en los repositorios de las principales
   distribuciones de Linux, por lo que es una plataforma idónea para seguir 
   este curso, aunque existen versiones para otros sistemas operativos [3]. 
   Para editar el código verilog puede usarse cualquier editor de texto plano
   compatible con texto UNIX y codificación UTF8. Los usuarios de Windows
   probablemente necesiten emplear un editor de texto plano como Notepad++ [4]
   en vez del editor incluído con el sistema. En este curso se asume que los
   programas necesarios están instalados y que el alumno es capaz de 
   ejecutarlos desde una línea de comandos de su sistema.

   Alternativamente, el alumno puede usar cualquier otro entorno de diseño
   de circuitos que soporte Verilog, como los entornos proporcionados por los
   fabricantes de FPGA Xilinx o Altera. Con estos entornos el alumno podrá
   realizar la implementación de los diseños en los dispositivos del
   fabricante correspondiente. Aunque la fase de implementación no se
   contempla en este curso por ser dependiente del fabricante y la tecnología,
   todos los ejemplos se han realizado con intención de que sean sintetizables.

   [1] http://www.icarus.com/eda/verilog/
   [2] http://gtkwave.sourceforge.net/
   [3] http://bleyer.org/icarus/
   [4] http://notepad-plus-plus.org/
	
CONTENIDOS
	
   UNIDAD 1. Fundamentos de lenguajes de descripción de hardware

     Lección 1-1. Introducción a los lenguajes de descripción de hardware y 
                  presentación de las herramientas básicas.

     Lección 1-2. Descripción de funciones combinacionales y simulación.

     Lección 1-3. Tipos de descripciones en Verilog
       
   UNIDAD 2. Bancos de prueba
   
     Lección 2-1. Simulación con banco de pruebas
   
     Lección 2-2. Comparación de descripciones con el mismo banco de pruebas
     
   UNIDAD 3. Ejemplos combinacionales
   
     Lección 3-1. Descripción procedimental de una función compleja
     
     Lección 3-2. Demostración de un circuito con azares
     
     Lección 3-3. Diseño de una alarma sencilla para un automóvil
     
   UNIDAD 4. Subsistemas combinacionales
   
     Lección 4-1. Ejemplos de descripciones de subsistemas combinacionales
     
     Lección 4-2. Diseño de un convertidor BCD-7 segmentos (ejercicio)
     
     Lección 4-3. Análisis de un circuito con subsistemas (ejercicio)
     
   UNIDAD 5. Circuitos aritméticos
   
     Lección 5-1. Diseño de sumadores
     
     Lección 5-2. Diseño de sumadores/restadores
     
     Lección 5-3. Diseño de una Unidad Lógico-Aritmética

   UNIDAD 6. Circuitos secuenciales
   
     Lección 6-1. Descripción y comparación de biestables
     
     Lección 6-2. Asignaciones con y sin bloqueo
     
     Lección 6-3. Descripción de máquinas secuenciales. Detector de secuencia
     
     Lección 6-4. Diseño de un arbitrador
     
   UNIDAD 7. Registros y contadores
   
     Lección 7-1. Diseño de un registro universal
     
     Lección 7-2. Diseño de un contador con varias operaciones
     
     Lección 7-3. Diseño de un cronómetro (ejercicio)
     
   UNIDAD 8. Proyecto final: diseño de un reloj digital
	
		
CONVENIOS
	
   - Los archivos usan tabuladores para una mejor estructuración del código.
     Se supone que el tabulador tiene en ancho estándar de 8 caracteres.
     Con esta configuración todos los archivos se componen de líneas de 80
     carácteres como máximo, por lo que son fácilmente legibles y editables
     en un terminal estándar de 80 columnas.
	
   - En el código se emplean dos tipos de comentarios con funciones
     diferenciadas. Los comentarios de tipo "//" se emplean para aclaraciones
     breves que se consideran útiles para entender mejor el código. Los
     comentarios de tipo "/ * * /" contienen explicaciones más largas propias
     del curso. Este segundo tipo de comentario puede eliminarse de los
     archivos fuente para producir sólo los ejemplos sin explicaciones
     adicionales. Por ejemplo:
	  
       $ awk '/\/\*/,/\*\// {next};{print}' alarma.v > clean/alarma.v
       
   - Este curso emplea el estándar Verilog-2001 (IEEE 1634-2001) por lo que se
     necesita un simulador y herramientas de síntesis que soporten este 
     estándar si se quieren simular o implementar los ejemplos.
   
   - El código emplea generalmente la sintáxis de estilo ANSI (similar a
     ANSI-C) introducida por el estándar Verilog-2001.

Jorge Juan
Junio 2010

