Programación en Verilog/Ejemplos

← Testbench Ejemplos



A continuación se muestra una serie de ejemplos diseñados en Verilog.

Multiplexor

editar

Como ejemplo se tiene un multiplexor de tres buses de 24 bits (entradas A, B y C), donde se supone que la opción de selección (entrada de dos bits) 2'b11 da una salida con todos los bits a cero.


  module mux(A, B, C, sel, O);
    input  [1:0]  sel;
    input  [23:0] A, B, C;
    output [23:0] O;

    reg [23:0] O;

    always @(sel or A or B or C)
      case(sel)
      'b00: O = A;
      'b01: O = B;
      'b10: O = C;
      default: O = 0;
      endcase
  endmodule


De-Multiplexor

editar

Otro ejemplo es un de-multiplexor que está decodificando un bus de direcciones:

  • 'h00_00 <= x <= 'h0f_ff activa el bit de selección 0.
  • 'h10_00 <= x <= 'h1f_ff activa el bit de selección 1.
  • 'h20_00 <= x <= 'h2f_ff activa el bit de selección 2.

  module mux(A, sel);
    input  [23:0] A;
    output [2:0]  sel;

    reg [2:0] sel;

    always @(A)
      case(A[15:12])
      0: sel = 'b001;
      1: sel = 'b010;
      2: sel = 'b100;
      default: sel = 0;
      endcase
  endmodule


Registro de desplazamiento

editar

En este ejemplo, en una única asignación se inserta el bit de entrada y se realiza el desplazamiento de todos los bits.


  module desplaza(clk, rst, A, B);
    input  clk, rst, A;
    output B;

    reg [3:0] C, nC;
    assign B = C[3];

    always @(posedge clk or negedge rst)
      if(rst == 0) C = 0;
      else C = nC;

    always @(C or A)
      nC = {C, A};
  endmodule

Contador

editar

Este ejemplo es un simple contador que incrementa el valor de un registro interno con cada flanco de reloj.


  module count(clk, rst, val);
    input  clk, rst;
    output [3:0] val;

    reg [3:0] val, nval;

    always @(posedge clk or negedge rst)
      if(rst == 0) val = 0;
      else val = nval;

    always @(val)
      nval = val + 1;
  endmodule



← Testbench Ejemplos