Diseño de mostrador usando verilog HDL

Requisito previo: contadores en lógica digital 

Problema:
Diseñe un contador síncrono ascendente-descendente de 4 bits Lenguaje de descripción de hardware Verilog junto con Testbench

Especificación de diseño :

Diagrama de bloques de requisitos de diseño: contador de 4 bits

El contador es un circuito secuencial digital y aquí es un contador de 4 bits, lo que simplemente significa que puede contar de 0 a 15 y viceversa según la dirección de conteo (arriba/abajo). 

  • El valor del contador (» count «) se evaluará en cada flanco positivo (ascendente) del ciclo del reloj (» clk «).
  • El contador se pondrá a cero cuando la entrada de » restablecimiento » esté en nivel lógico alto.
  • El contador se cargará con la entrada de » datos » cuando la señal de » carga » esté en nivel lógico alto. De lo contrario, contará hacia arriba o hacia abajo.
  • El contador contará hacia arriba cuando la señal » up_down » sea lógicamente alta; de lo contrario, contará hacia atrás.

Código Verilog HDL:

Diseño –

// Here we will learn to write a verilog HDL to design a 4 bit counter
module counter(clk,reset,up_down,load,data,count);
  //define input and output ports
  input clk,reset,load,up_down;
  input [3:0] data;
  output reg [3:0] count;
  //always block will be executed at each and every positive edge of the clock
  always@(posedge clk) 
  begin
    if(reset)    //Set Counter to Zero
      count <= 0;
    else if(load)    //load the counter with data value
      count <= data;
    else if(up_down)        //count up
      count <= count + 1;
    else            //count down
      count <= count - 1;
  end
endmodule :counter

Banco de pruebas :

// Code your testbench here
module counter_tb;
  reg clk,reset,load,ud;
  reg [3:0] data;
  wire [3:0] count;
  // instance counter design
  counter ct_1(.ud(up_down),.*);
  //clock generator
  initial begin clk = 1'b0; repeat(30) #3 clk= ~clk;end
  //insert all the input signal
  initial begin reset=1'b1;#7 reset=1'b0; #35 reset=1'b1;end
  initial begin #12 load=1'b1; #5 load=1'b0;end
  initial begin #5 ud=1'b1;#24 ud=1'b0;end
  initial begin data=4'b1000;#14 data=4'b1101;#2 data=4'b1111;end
  //monitor all the input and output ports at times when any inputs changes its state
  initial begin $monitor("time=%0d,reset=%b,load=%b,ud=%b,data=%d,count=%d",
                               $time,reset,load,ud,data,count);end
endmodule :counter_tb

Rendimiento esperado :

time=0,reset=1,load=x,ud=x,data= 8,count= x
time=3,reset=1,load=x,ud=x,data= 8,count= 0
time=5,reset=1,load=x,ud=1,data= 8,count= 0
time=7,reset=0,load=x,ud=1,data= 8,count= 0
time=9,reset=0,load=x,ud=1,data= 8,count= 1
time=12,reset=0,load=1,ud=1,data= 8,count= 1
time=14,reset=0,load=1,ud=1,data=13,count= 1
time=15,reset=0,load=1,ud=1,data=13,count=13
time=16,reset=0,load=1,ud=1,data=15,count=13
time=17,reset=0,load=0,ud=1,data=15,count=13
time=21,reset=0,load=0,ud=1,data=15,count=14
time=27,reset=0,load=0,ud=1,data=15,count=15
time=29,reset=0,load=0,ud=0,data=15,count=15
time=33,reset=0,load=0,ud=0,data=15,count=14
time=39,reset=0,load=0,ud=0,data=15,count=13
time=42,reset=1,load=0,ud=0,data=15,count=13
time=45,reset=1,load=0,ud=0,data=15,count= 0

Nota: Siga este enlace para simular en línea este diseño.

Publicación traducida automáticamente

Artículo escrito por manishkj116 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *