PRÁCTICAS DE COMPUTADORES I

TERCERA SESIÓN


  1. Puerta AND

    Recordemos de la parte de teoría el comportamiento de una puerta AND:
    Puerta AND
    Vamos a comprobar, con Verilog, el funcionamiento de esta puerta:
    /* ComprobaciOn de puerta AND: TestAnd.v */
    
    module TestAnd;
    
      reg a,b; // Entradas
      wire  salida;
    
      and a1(salida,a,b);
    
      // Bloque de comportamiento
      initial
        begin
          $monitor($time," a=%b, b=%b, a.b=%b", a,b,salida);
          a=0; b=0;
          #5 a=0; b=1;
          #5 a=1; b=0;
          #5 a=1; b=1;
        end
    
    endmodule


    Esquema con variables

    En el programa definimos dos registros a y b que van a proporcionar el valor de entrada a la puerta y un cable salida, para obtener la salida de la puerta según sean los valores de a y b.

    La propia puerta se crea (se instancia) a continuación y se le da el nombre de a1. En las puertas básicas de Verilog, indicar un nombre es opcional. Los nombres se usan para poder hacer referencia a los elementos creados. En la misma línea en que se crea la puerta, se conectan sus entradas y salidas a las variables antes definidas.

    Finalmente, viene el bloque de comportamiendo del módulo principal TestAnd. Damos instrucción mediante la orden $monitor de que se sigan los cambios de las variables a, b y salida. Cada vez que alguna de esas variables cambie, se imprimirá automáticamente una línea indicando el tiempo de la simulación ($time). Las unidades en que se mide el tiempo son arbitrarias.

    A continuación, se establece el valor inicial de a y b a cero. Cinco unidades de tiempo después (#5), ponemos b a uno. Se prosigue estableciendo los otros dos casos que quedan.

    La salida del programa da el resultado esperado:

                       0 a=0, b=0, a.b=0
                       5 a=0, b=1, a.b=0
                      10 a=1, b=0, a.b=0
                      15 a=1, b=1, a.b=1
  2. Ejercicio

    Completar la tabla de la puerta AND añadiendo como posibles entradas x (indefinido) y z (alta impedancia). Tiene que haber, por consiguiente, dieciséis líneas en la tabla.
  3. Otras puertas sencillas en Verilog

    Recordemos algunas otras puertas vistas en teoría y cómo se expresan en Verilog:
    • Puerta OR, or(salida,a,b):
      Puerta OR
    • Puerta NOT, not(salida,a):
      Puerta NOT
    • Puertas NAND, nand(salida,a,b), y NOR, nor(salida,a,b):
      Puerta NAND                       Puerta NOR
    • Puertas XOR, xor(salida,a,b), y XNOR, xnor(salida,a,b):
      Puerta XOR                       Puerta XNOR
    • Puerta BUFFER, buf(salida,a):
      Puerta BUFFER
  4. Ejercicio

    Haced en un papel una tabla de dieciséis líneas y tantas columnas como puertas lógicas vistas. Rellenad la tabla con los valores de las puertas lógicas correspondientes a cada posible combinación de entradas formadas con 0,1,x y z. Añadid una a una las puertas al código del ejercicio anterior y comprobad con Verilog si habéis acertado al rellenar la tabla.
  5. Interconexión de puertas lógicas

    Vamos a construir la tabla de verdad de la función lógica f2(a,b,c)=ab+c con la ayuda de Verilog.
    ab+c
    En lugar de escribir a mano los 8 casos de posibles combinaciones de valores de a, b y c, construiremos un registro de tres bits, le daremos valor inicial cero y lo iremos incrementando hasta alcanzar el valor 7 (1112):
  6. // Tabla de verdad de f2(a,b,c)=ab+c
    
    module f2;
    
      reg [2:0] r; // Entradas: a=r[2], b=r[1], c=r[0]
      wire  salida, ab;
    
      and a1(ab,r[2],r[1]);
      or  o1(salida,ab,r[0]);
    
      // Bloque de comportamiento
      initial
        begin
          $display("                     a b c | f2");
          $display("                     ----------");
          $monitor($time," %b %b %b | %b", r[2],r[1], r[0], salida);
          r=0; // r=000 => a=0, b=0, c=0
          while (r!='b111) #5 r=r+1;
        end
    
    endmodule


    Diagrama con variables

    rr[2]r[1]r[0]
    00002000
    10012001
    20102010
    30112011
    41002100
    51012101
    61102110
    71112111

    Se ha usado un cable auxiliar ab para conectar la salida de la puerta AND a1 con una entrada de la puerta OR o1. El resultado de su ejecución coincide con la tabla vista en teoría:

    
                         a b c | f2                  
                         ----------
                       0 0 0 0 | 0
                       5 0 0 1 | 1
                      10 0 1 0 | 0
                      15 0 1 1 | 1
                      20 1 0 0 | 0
                      25 1 0 1 | 1
                      30 1 1 0 | 1
                      35 1 1 1 | 1
            
  7. Operadores relacionales

    Además del ya visto !=, Verilog admite los siguientes operadores relacionales: < (menor que), <= (menor o igual que), == (igual que), >= (mayor o igual que) y > (mayor que). Cuando alguno de los operandos contiene x o z, el resultado es x. En otro caso, el resultado dependerá de si se cumple la condición (1) o no (0).

    Si se desea una comparación de igualdad estricta (considerando las xs y las zs) se ha de usar === (estrictamente igual) y !== (estrictamente distinto)

  8. Operadores lógicos

    Para expresar una condición dentro de un programa Verilog, a veces es necesario disponer de los operadores lógicos Y, O y NO. En Verilog se expresan como && (Y), || (O) y ! (NO). Así, para expresar algo como: "Si no ocurre que a es mayor que cero y b distinto de cuatro...", lo haríamos con:
    
            if (!(a>0 && b!=4)) ...
            
    Aplicando las leyes de De Morgan, ya sabemos que expresamos lo mismo con:
    
            if (a<=0 || b==4) ...
            

  9. Ejercicio

    Constrúyase la tabla de verdad de la función f3 vista en teoría y cuyo diagrama con puertas es el que se muestra a continuación:
    f3
    f3
  10. Ejercicio

    Comprobad, mediante un programa Verilog, que la función f3 es equivalente a esta otra elaborada solamente con puertas NAND:
    f3 con puertas NAND
  11. Ó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


  12. LPEs.


© 2010 Guillermo González Talaván.