El comportamiento del hardware no puede implementarse sin declaraciones condicionales y otras formas de controlar el flujo de lógica. Verilog tiene un conjunto de bloques y mecanismos de flujo de control para lograrlo. if-else-if Esta declaración condicional se usa para decidir si ciertas declaraci
Asignación bloqueante Las declaraciones de asignación bloqueante usan = y se ejecutan una tras otra en un bloque procesual. Sin embargo, esto no impide la ejecución de declaraciones que se ejecutan en bloques paralelos. module tb; reg [7:0] a, b, c, d, e; initial begin a = 8hDA; $displa
La colocación de valores en redes (nets) y variables se denomina asignaciones. Existen tres formas básicas: Procesuales Continuas Procesuales continuas Valores LHS válidos Una asignación tiene dos partes: lado derecho (RHS) y lado izquierdo (LHS) con un símbolo de igualdad (=) o menor-igual
Hay formas de agrupar sentencias que son sintácticamente equivalentes a una sola sentencia, llamadas sentencias de bloque. Dos tipos: secuencial y paralelo. Secuencial Sentencias envueltas con begin y end se ejecutan secuencialmente en orden dado, una tras otra. Valores de delay se tratan relativos
Un ejemplo previo exploró un detector de secuencia simple. Aquí otro ejemplo para detector de patrón que detecta un patrón ligeramente más largo. Diseño module det_110101 ( input clk, input rstn, input in, output out ); parameter IDLE = 0, S1 = 1, S11 = 2, S110 = 3, S1101 = 4, S11010
Un ejemplo muy común de FSM (Máquina de Estados Finitos) es el detector de secuencia donde el hardware debe detectar cuándo un patrón fijo aparece en una stream de bits binarios de entrada. Ejemplo module det_1011 ( input clk, input rstn, input in, output out ); parameter IDLE = 0, S
Un bloque generate permite multiplicar instancias de módulos o realizar instanciación condicional de cualquier módulo. Proporciona capacidad de construir diseño basado en parámetros Verilog. Estas sentencias son convenientes cuando la misma operación o instancia debe repetirse múltiples veces o si c
Todo código conductual va dentro de module y endmodule. Cualquier diseño digital que crees, irá dentro de un bloque module. Puede tener o no puertos definidos - permiten señales entrar como input o salir como output. Módulo El módulo vacío en el ejemplo se llama testbench. Puedes nombrarlo como quie
Un conjunto de sentencias Verilog se ejecutan secuencialmente en simulación. Estas se colocan en un bloque procedimental. Hay dos tipos principales: initial y always. Sintaxis initial [sentencia única] initial begin [múltiples sentencias] end ¿Para qué sirve el bloque initial? Un bloque initial no
Un artículo previo mostró ejemplos de always para lógica combinacional. El always también se usa principalmente para lógica secuencial con elementos de memoria como flip-flops que retienen valores. Flip-Flop JK Un flip-flop JK almacena valores y tiene dos entradas de datos j y k, más reset rstn y cl
El bloque always de Verilog sirve tanto para lógica secuencial como combinacional. Un artículo previo mostró ejemplos con assign. Aquí exploramos los mismos diseños usando always. Ejemplo #1: Lógica combinacional simple El código implementa lógica combinacional simple con salida z tipo reg que se ac
Un bloque always es uno de los bloques procedimentales en Verilog. Las sentencias dentro se ejecutan secuencialmente. Sintaxis always @ (evento) [sentencia] always @ (evento) begin [múltiples sentencias] end El bloque always se ejecuta en algún evento particular. El evento se define por una lista d
Wires y variables multi-bit en Verilog pueden agruparse para formar un wire o variable multi-net mayor usando operadores de concatenación { y } separados por comas. La concatenación también permite expresiones y constantes con tamaño como operandos además de wires y variables. El tamaño de cada oper
Los datos que no se pueden procesar son inútiles; siempre hay algún cálculo requerido en circuitos digitales y sistemas computacionales. Veamos operadores en Verilog que permiten a herramientas de síntesis realizar elementos de hardware apropiados. Operadores Aritméticos Si el segundo operando de di
La sentencia assign de Verilog se usa típicamente para impulsar continuamente señales de tipo wire y se sintetiza como lógica combinacional. Aquí más ejemplos de diseño usando assign. Ejemplo #1: Lógica combinacional simple El código implementa lógica combinacional simple con salida z impulsada cont
Señales de tipo wire o tipos similares requieren asignación continua de valor. Por ejemplo, un cable eléctrico en protoboard: mientras se aplique +5V a un extremo, el componente en el otro extremo recibirá el voltaje. En Verilog, esto se realiza con la sentencia assign donde cualquier wire o tipo s
Como vimos, diseños grandes y complejos se construyen integrando múltiples módulos jerárquicamente. Los módulos pueden instanciarse dentro de otros y los puertos de estas instancias conectarse con otras señales dentro del módulo padre. Estas conexiones de puertos pueden hacerse vía lista ordenada o
Los puertos son un conjunto de señales que actúan como entradas y salidas de un módulo y son la forma principal de comunicarse con él. Piensa en un módulo como un chip fabricado colocado en un PCB: queda claro que la única forma de comunicarse con el chip es a través de sus pines. Los puertos son co
Un module es un bloque de código Verilog que implementa cierta funcionalidad. Los módulos pueden incrustarse en otros y un módulo de nivel superior se comunica con los de nivel inferior usando sus puertos de entrada y salida. Sintaxis Un módulo debe encerrarse entre module y endmodule. El nombre va
Una declaración de array de un net o variable puede ser escalar o vectorial. Cualquier número de dimensiones puede crearse especificando un rango de dirección tras el nombre del identificador, llamado array multi-dimensional. Arrays permitidos para reg, wire, integer y real. reg y1 [11:0];
Verilog