# Programación en Verilog/Elementos básicos del lenguaje

Antes de comenzar es preciso conocer algunos elementos básicos del lenguaje Verilog.

## Comentarios

Los comentarios van precedidos de los caracteres //, cuya información hasta el final de la línea es ignorado. También, pueden ir entre /* y */, donde la información entre estos caracteres es ignorada, la diferencia con la anterior alternativa, es que en esta segunda puede haber más de una línea. Ejemplos:

## Identificadores

Un identificador esta formado por una letra o "_" seguido de letras, números y los caracteres "$" o "_". Este lenguaje si distingue entre mayúsculas y minúsculas.

## Números

Los números en Verilog pueden especificarse en decimal, hexadecimal, octal o binario. Los números negativos se representan en complemento a2 y el carácter "_" puede utilizarse para una representación más clara del número. La sintaxis para la representación de un número es la siguiente.
* Tamaño: es el número de bits expresado en decimal de la cantidad que viene a continuación. Este dato es opcional, en caso de no darse, por defecto el valor es de 32 bits.
* Base: indica la base en la que se va a expresar el valor. Es opcional, por defecto es decimal.
* Valor: Verilog tiene 4 valores que cualquier señal puede tomar:
| Valor | Significado |
| 0 | Un valor binario de cero. Corresponde a cero voltios. |
| 1 | Un valor binario de 1. Dependiendo de la tecnología de fabricación, puede corresponder a +5V, +3.3V, o algún otro valor positivo. |
| x | Un valor cualquiera. los valores x no son ni 0 o 1, y debería ser tratado como un valor desconocido. |
| z | Un valor de alta impedancia de un buffer de tres estados cuando la señal de control no está definida. Corresponde a un wire que no está conectado, o está flotando. |
A continuación, se muestra una serie de ejemplos.

## Tipos de datos

Fundamentalmente existen dos tipos de datos: reg y wire. La sintaxis para declarar esta variables es la siguiente.
* Tipo: existen varios tipos de variables, aunque las más destacadas son reg ywire.
* MSB y LSB: Por defecto estas las variables son de un sólo bit, aunque es posible definir vectores de bits.
* Nombre: Indica el nombre de la variable.
A continuación, se muestran varios ejemplos de variables.

## Operadores

Los operadores que proporciona el lenguaje son:

### Tipos de operadores
#### Binarios aritméticos

El operador aparece entre dos operandos. Si algún bit es 'X' el resultado es 'X'.
* + (suma o signo positivo): Sirve para indicar una suma entre dos números. También puede actuar como símbolo si se sitúa delante de una expresión.
* - (resta o signo negativo): Sirve para indicar la resta entre dos números. Si va delante de una expresión modifica el signo de la expresión.
* * (multiplicación): Multiplica dos números de cualquier tipo.
* / (división): Divide dos números de cualquier tipo.
* % (resto): Obtiene el resto de la división de dos números de cualquier tipo.

#### Igualdad

Permiten comparar dos operandos, retornando 1 ó 0, verdadero o falso respectivamente.
* ==, != (igualdad): El primero devuelve verdadero si los operando son iguales y falso en caso contrario. El segundo indica desigualdad, funcionando al revés que el anterior. Si algún bit es 'X' el resultado también será 'X'.
* ===, !== (igualdad): Su funcionalidad es idéntica a la anterior, pero difiere en también se comparan los valores indefinidos ('X') o de alta impedancia ('Z').

#### Relacionales

Permiten comparar dos operandos, retornando 1 ó 0, verdadero o falso respectivamente. Si algún bit es 'X' el resultado también será 'X'.
* >, >=, <, <= (menor mayor): Poseen el significado habitual (mayor que, mayor o igual que, menor que, menor o igual que, respectivamente).

#### Lógicos

Aparece entre dos operandos lógicos y proporciona un valor lógico (verdadero o falso).
* ! (negación): Cambia el valor lógico del operando que va justo detrás del operador.
* && (y lógica): El resultado será la combinación de los dos operandos lógicos. Es decir, para que el valor sea verdadero, ambos operandos deben serlo, en caso contrario el resultado será falso.
* || (o logica): El resultado será la combinación de los dos operandos lógicos. Para que el resultado sea verdadero, bastará con que uno de los operandos lo sea.

#### Lógica de bit

Permite efectuar operaciones lógicas con los bits de los operandos.
* ~ (negación): Negación bit a bit.
* & (AND): AND bit a bit.
* | (OR): OR bit a bit.
* ^ (XOR): XOR bit a bit.
* ~& (NAND): NAND bit a bit.
* ~| (NOR): NOR bit a bit.
* ~^ (NOT XOR): NOT XOR bit a bit. También puede ser ^~.

#### Lógica de reducción

El resultado de aplicar este operando al único argumento es un sólo bit.
* & (AND): Se realiza un AND de todos los bits.
* | (OR): Se realiza un OR de cada uno de los bits del operando.
* ^ (XOR): Se realiza un XOR de cada bit.
* ~& (NAND): Se realiza un NAND de todos los bits.
* ~| (OR): Se realiza un NOR de cada uno de los bits del operando.
* ~^ (XOR): Se realiza un NOT XOR de cada bit. También puede ser ^~.

#### Otros

* {,} (Concatenación): Concatenación de dos operandos.
* << (Desplazamiento izquierda): Desplaza bits a la izquierda, añadiendo ceros.
* >> (Desplazamiento derecha): Desplaza bits a la derecha, añadiendo ceros.
* ?: (Condicional): Dependiendo del resultado lógico (verdadero o falso) se devolverá un valor u otro.

### Precedencia de operadores

El orden de precedencia de los diferentes operadores es el siguiente.
1. Unarios, multiplicación, división y módulo
2. Suma, resta y desplazamientos
3. Relación e igualdad
4. Reducción
5. Lógicos
6. Condicional