15 de noviembre de 2024
Es una técnica de diseño que permite organizar un sistema digital complejo en bloques más pequeños y manejables.
El diseño jerárquico se basa en la interconexión e instanciación de módulos simples para crear circuitos complejos.
En este ejemplo veremos cómo diseñar un multiplexor 4x1 partiendo de multiplexores 2x1.
La imagen siguiente muestra el circuito a describir. Para implementar dicho diseño emplearemos el diseño jerárquico y la instanciación de módulos simples.
En el Capítulo 3 dedicado a la tarjeta Basys 3, vimos diferentes formas de describir multiplexores. Pues bien, partiendo de dicho tema, veremos cómo implementar el multiplexor 4x1 que nos ocupa.
Creamos un nuevo proyecto y añadimos el archivo que contiene el multiplexor 2x1 hecho con puertas lógicas + otro archivo .v que será el módulo principal o top module.
Luego botón derecho sobre el archivo top_module.v y clic en Set as Top para establecer la jerarquía del diseño.
A la izquierda tenemos el código que describe el mux 2x1 con puertas lógicas y a la derecha el módulo top instanciando tres mux 2x1 para crear el multiplerxor 4x1.
Atención al orden en que se listan los puertos a la hora de instanciar en el módulo top. Hay que respetar el mismo orden en que se han declarado los puertos en el módulo original: module mux_2x1 (in0, in1, sel, out); deber ser igual a mux_2x1 mod0 (in0, in1, sel0, w0); // (entrada1 entrada2, selección, salida)
A esta técnica se le llama instanciar y lo que hace Verilog es crear tres copias del módulo original mux-2x1 dentro del módulo top. De esta forma ahorramos código; no hace falta escribir tres veces el código del mux 2x1 y luego conectar las diferentes E/S.
La imagen siguiente muestra el esquema generado por Vivado. Haciendo clic en el símbolo + vemos cómo los módulos que hemos instanciado son el multiplexor 2x1 modelado con puertas lógicas.
Otro ejemplo, tomando diferentes formas de describir el multiplexor 2x1. Utilizaremos las puertas lógicas para describir los mux de entrada y el mux 2x1 descrito con la declaración case para instanciar el mux de salida.
Creamos un nuevo proyecto y añadimos el archivo que contiene el multiplexor 2x1 hecho con puertas lógicas, el mux 2x1 hecho con la declaración case + otro archivo .v que será el módulo principal o top module.
Luego botón derecho sobre el archivo top_module.v y clic en Set as Top para establecer la jerarquía del diseño.
A la izquierda tenemos el código que describe el mux 2x1 con puertas lógicas, en el centro el mux 2x1 hecho con la declaración case y a la derecha el módulo top instanciando tres mux 2x1 para crear el multiplerxor 4x1.
Igual que en el ejemplo anterior, hay que respetar el orden en que se han declarado los puertos en el módulo original.
La imagen siguiente muestra el esquema generado por Vivado. Haciendo clic en el símbolo + vemos cómo los módulos que hemos instanciado son el multiplexor 2x1 modelado con puertas lógicas y el módulo de salida es el símbolo de un mux 2x1 estándar.
Decíamos al principio de este tema, que la jerarquía en Verilog hace referencia a la inclusión de módulos simples dentro de un módulo de nivel superior o top module. Un diseño puramente estructural no contiene ninguna declaración de comportamiento, sólo contiene la instanciación y las interconexiones de los módulos simples. Además, las interconexiones de los módulos dentro del módulo top, deben respetar unas reglas de diseño.
Los puertos de entrada de un módulo son siempre tipo net (wire) y se pueden conectar a variables tipo net o reg.
Las salidas de un módulo pueden ser tipo net o reg y se conectan siempre a variables tipo net.
La interconexión de las entradas y salidas dentro de un diseño jerárquico se conoce como mapeo de puertos y puede hacerse de dos maneras: explícita (nombrando los puertos) o posicional (respetando el orden de los puertos).
Los nombres de los puertos del módulo inferior se listan junto a la señal que se conecta. El punto .puerto indica el nombre del puerto y el paréntesis (señal) indica la señal a la que se conecta. Dado que el mapeo explícito se hace con el nombre de las E/S, el orden en que se declaran es irrelevante. Veamos un ejemplo.
En el módulo principal o superior se declaran las E/S del circuito, los cables (wire1, wire2) si fueran necesarios.
Los puertos de E/S de los módulos van precedidos del punto .clk_in .step1 .step2 y entre paréntesis la señal a la que se conectan (clk) (wire1) (wire2).
Veamos otro ejemplo de mapeo explícito. No importa lo que contengan los módulos simples, sólo queremos ver cómo se interconectan entre sí.
El módulo superior o top module es el llamado tone_mixer.
Para el MOD_1 el puerto de entrada .reloj se conecta a la señal clk esto es: .reloj(clk) y los puertos de salida se conectan a los cables w1 y w1: .Hz_200(w1) y .KHz_2(w2)
Lo mismo reza para el MOD_2 que tiene cuatro puertos de E/S .reloj .in1 .in2 .out que se conectan a las señales (clk) (w1) (w2) (spk) como se muestra a continuación:
En la técnica de mapeo posicional, las señales que se conectan al módulo inferior se enumeran en el mismo orden en que se declararon los puertos. Cada nombre de señal va separado por una coma. Los nombres de los puertos del módulo inferior se listan en el mismo orden en que se declaran, tal como vimos en los ejemplos del mux 4-1 más arriba.
El mapeo explícito se recomienda cuando el número de puertos y se señales a interconectar es elevado, ya que es menos dado a errores y el orden de las declaraciones no importa.
El mapeo posicional requiere menos texto para describir la conexión, pero también puede dar lugar a errores de conexión si no se respeta escrupulosamente el orden de la declaración de E/S.
Verilog con Basys 3 . Capítulo 3. Multiplexores
Hierarchical Design. Thanks to Mr Anas Salah Eddin for sharing