PRÁCTICAS DE COMPUTADORES I

QUINTA SESIÓN


  1. Jerarquía de módulos. Nombrado

    Al instanciar unos módulos dentro de otros, se forma una jerarquía de módulos. En el ejemplo del comparador de un bit de la sesión anterior, esta jerarquía de módulos se refleja en este gráfico:
    Jerarquía de TestComp1 Comparador de un bit
    module TestComp1;
    
      reg a,b;
      wire M,m,igual;
    
      Comp1 c(M,igual,m,a,b);
    
      // Bloque de comportamiento
      initial
        begin
          $monitor($time," a=%b, b=%b, mayor=%b, igual=%b, menor=%b",
                         a,b,M,igual,m);
          a=0; b=0;
          #5 a=0; b=1;
          #5 a=1; b=0;
          #5 a=1; b=1;
        end
    
    endmodule
    // MOdulo comparador de un bit
    module Comp1(output wire mayor, output wire igual, output wire menor,
                 input wire a, input wire b);
    
      wire wArriba, wAbajo;
    
      not nArriba(wArriba,a);
      not nAbajo(wAbajo,b);
      and aArriba(mayor,a,wAbajo);
      and aAbajo(menor,b,wArriba);
      nor n(igual,mayor,menor);
    
    endmodule
    
    

    El módulo raíz no tiene nombre y es instanciado por Verilog automáticamente. Para hacer referencia a un objeto directamente perteneciente al módulo raíz desde sí mismo, simplemente se pone el nombre del objeto como ya hemos visto. ¿Pero qué hacer si queremos acceder desde el módulo raíz a la puerta aAbajo del módulo c? La respuesta es que se usa un punto (.) para descender por la jerarquía de objetos. Por consiguiente, para acceder a dicha puerta, se pondría c.aAbajo. El esquema se generaliza cuando hay más niveles.

  2. Búferes triestado

    En teoría hemos visto los siguientes búferes con línea adicional de control para poder poner la salida en alta impedancia:

    Búfer activo en alta                         Búfer activo en baja
    Las instrucciones en Verilog que permiten instanciar el búfer de la izquierda y el de la derecha son:
      bufif1 bIzquierda(Y,A,G);
      bufif0 bDerecha(Y,A,G);
    
    También existen las equivalentes puertas NOT con control de triestado por alto y por bajo que son, respectivamente, notif1 y notif0.
  3. Contingencia de señales

    Puede ocurrir que sobre un cable se viertan varias señales a la vez. Para que Verilog haga un tratamiento correcto de estos casos, en aquellas situaciones en que puedan coincidir varias señales, se tiene que definir la variable no como wire, sino como tri.

    En el caso de contingencia en una variable de tipo tri, se resuelve del modo siguiente:
    Algunos diseños lógicos exigen cables con funciones especiales. En caso de contingencia, actúan del siguiente modo:
  4. Asignación de señales a cables

    Para efectuar una conexión permanente de un registro a un cable, se debe usar una asignación. Esto hace que el valor del registro se vuelque continuamente al cable. La instrucción en verilog es assign:
      wire w; reg r;
    
      assign w=r;
    
  5. Ejercicio

    Vamos a aplicar lo aprendido en puntos anteriores con el siguiente ejemplo de un transmisor/receptor de bus de un bit, visto en teoría:
    Transceiver de un bit

    Programemos el módulo:

    module Transceiver(inout tri a, inout tri b, input wire g, input wire dir);
    
      wire ng,ndir,sa1,sa2;
    
      not (ng,g);        // No hacemos referencia despuEs => no damos nombres
      not (ndir,dir);
      and (sa1,ng,dir);
      and (sa2,ng,ndir);
      bufif1 (b,a,sa1);
      bufif1 (a,b,sa2);
    endmodule
    
    Se ha cambiado la señal G para que sea activa a nivel alto. Los nombres usados han sido:
    Nombres Transceiver
    Construimos ahora el módulo de comprobación:
    Test Transceiver
    module TestTransceiver;
    
      tri a,b;
      reg g,dir;
      reg ra,rb;
      Transceiver t(a,b,g,dir);
      assign a=ra; assign b=rb;
    
      // Bloque de comportamiento
      initial
        begin
          $monitor($time," g=%b, dir=%b, a=%b, b=%b, ra=%b, rb=%b",
                         g,dir,a,b,ra,rb);
             ra=0; rb=1; g=1; dir=0;
          #5 ra='bz; rb='bz; g=1; dir=0;
          #5 rb=1; g=0; dir=0;
          #5 ra='bz; rb='bz; g=1; dir=1;
          #5 ra=0; g=0; dir=1;
          #5 ra=0; rb=1; g=0; dir=1;
        end
    
    endmodule
    
    Observad el uso de las variables tri y la orden assign. Antes de ejecutar la simulación, tratad de adivinar cuáles son los valores que aparecerán en la pantalla. ¿Qué cambios habría que hacer para que la línea G del módulo sea activa por nivel bajo tal y como aparecía en el diseño original?
  6. Ejercicio

    Constrúyase un módulo multiplexor 4x1 con línea de control de salida OE, de modo que si dicha línea está inactiva, la salida Y esté en alta impedancia. En caso contrario, funciona como multiplexor normal. Con dos de estos multiplexores constrúyase otro módulo multiplexor 8x1 según el esquema de la figura. Pruébese con ayuda de un módulo auxiliar.

    Multiplexor 8x1

    Pista: si no sois capaces de construir el multiplexor 4x1, podéis fijaros en esta solución. Hay alternativas similares a la solución de la figura que usan un decodificador o búferes triestado, por ejemplo.

  7. Ejercicio

    Siguiendo el procedimiento descrito en teoría, y con ayuda del módulo multiplexor 8x1 construido en el ejercicio anterior, genérese la función de cuatro variables lógicas:
    Función h(a,b,c,d)
    Recordemos los pasos que hay que dar:
    1. Elegir una variable para cada entrada de selección. Se dará cuenta de la variable no elegida mediante las entradas D del multiplexor
    2. Sacar factor común de la variable no elegida en cada posibilidad de las otras
    3. Operar hasta conseguir que aparezcan todos los minitérminos de las variables elegidas
    4. Conseguimos, simplificando, que a cada línea del multiplexor hay que aplicar 0, 1, la variable no elegida o la variable no elegida negada
    5. Construir un módulo que imprima la tabla de verdad del diseño realizado
    6. Compararla con la tabla de verdad de la función h:
      abcd     h
      0000 1
      0001 0
      0010 1
      0011 0
      0100 0
      0101 1
      0110 0
      0111 0
      1000 1
      1001 1
      1010 0
      1011 0
      1100 1
      1101 1
      1110 1
      1111 1
  8. Órdenes de la shell relacionadas.

    ls
    lista el contenido de un directorio
    cd
    cambia el directorio de trabajo
    rm
    borra un fichero
    man
    muestra la página de manual de una orden
    cat
    muestra el contenido de un fichero


  9. LPEs.


© 2011 Guillermo González Talaván.