Programación en Verilog/Ejemplos
A continuación se muestra una serie de ejemplos diseñados en Verilog.
Multiplexor
editarComo 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
editarOtro 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
editarEn 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
editarEste 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