En este artículo, implementaremos el decodificador 2:4 usando todos los niveles de abstracción en Verilog HDL con un procedimiento paso a paso. Antes de proceder con el código, examinaremos la tabla de verdad y el símbolo lógico del decodificador 2:4 .
Decodificador 2:4
Un decodificador es un circuito lógico combinacional que tiene ‘n’ líneas de señal de entrada y 2 n líneas de salida. En el decodificador 2:4 tenemos 2 líneas de entrada y 4 líneas de salida. Además, proporcionamos ‘ habilitar ‘ a la entrada para garantizar que el decodificador funcione siempre que la habilitación sea 1 y se apague cuando la habilitación sea 0. La tabla de verdad, el diagrama lógico y el símbolo lógico se muestran a continuación:
Mesa de la verdad:
es | Aporte |
Producción |
||||
---|---|---|---|---|---|---|
a | b | y3 | y2 | y1 | y0 | |
1 | X | X | 1 | 1 | 1 | 1 |
0 | 0 | 0 | 1 | 1 | 1 | 0 |
0 | 0 | 1 | 1 | 1 | 0 | 1 |
0 | 1 | 0 | 1 | 0 | 1 | 1 |
0 | 1 | 1 | 0 | 1 | 1 | 1 |
Símbolo lógico:
Diagrama de lógica:
Similar al decodificador 2:4, el decodificador 3 a 8 produce ocho líneas de señal de salida y el decodificador 4 a 16 produce dieciséis líneas de señal de salida.
Ahora implementaremos un decodificador 2:4 en diferentes niveles de abstracción de mayor a menor.
1. Modelado de comportamiento:
El modelado de comportamiento representa el circuito en un alto nivel de abstracción. La sintaxis del modelado de comportamiento se asemeja a la de la programación en C. Podemos implementar declaraciones de condiciones como si, declaración de caso, bucle y procedimientos de estructura (inicial y siempre) dentro del bloque de diseño de Verilog utilizando el modelado de comportamiento.
Sintaxis:
if(condition) true_statement; else if(condition) true_statement; else else_statement
Bloque de diseño: modelado de comportamiento
module decoder24_behaviour(en,a,b,y); // input port input en,a,b; // use reg to store the output value output reg [3:0]y; // always is used in design block // only in Behavioural modeling. always @(en,a,b) begin // using condition if statement // implement the 2:4 truth table if(en==0) begin if(a==1'b0 & b==1'b0) y=4'b1110; else if(a==1'b0 & b==1'b1) y=4'b1101; else if(a==1'b1 & b==1'b0) y=4'b1011; else if(a==1 & b==1) y=4'b0111; else y=4'bxxxx; end else y=4'b1111; end endmodule
Banco de pruebas: modelado de comportamiento
Una vez que hemos diseñado el bloque de diseño debemos probarlo. El banco de pruebas es un bloque de simulación que se utiliza para probar el bloque de diseño mediante la aplicación de estímulos y la verificación de resultados sin pasar por los valores de entrada. Piense en el bloque de diseño como la implementación de salida donde solo pensamos en el resultado de salida sin preocuparnos por la entrada. Pero mientras escribe el banco de pruebas, debe proporcionar las entradas adecuadas, aquí la tabla de verdad es muy importante para declarar los valores de entrada.
En Testbench el paso importante es vincular el bloque de diseño, esto se hace por instanciación:
modulename instance(port list);
Para mostrar el resultado utilizaremos la tarea del sistema $monitor.
Sintaxis:
$monitor(display_statement);
module tb; // input port are declared in reg(register) reg a,b,en; // output port are declared in wire(net) wire [3:0]y; // instantiate design block decoder24_behaviour dut(en,a,b,y); initial begin $monitor("en=%b a=%b b=%b y=%b",en,a,b,y); // with reference to truth table provide input values en=1;a=1'bx;b=1'bx;#5 en=0;a=0;b=0;#5 en=0;a=0;b=1;#5 en=0;a=1;b=0;#5 en=0;a=1;b=1;#5 // terminate simulation using $finish system task $finish; end endmodule
Salida: Para ejecutar el programa:
iverilog -o behavior tb.v dut.v vvp behavior
Nota: iverilog es el compilador de Verilog para ejecutar programas de Verilog. vvp es el comando para ejecutar el código Verilog.
2. Modelado de flujo de datos:
Al definir el modelado de flujo de datos, un diseñador debe tener en cuenta cómo fluyen los datos en la descripción del diseño. El modelado de flujo de datos se ha convertido en un enfoque de diseño muy apreciado, a medida que se perfeccionaron las herramientas de síntesis lógica. En Data Flow usamos la asignación de palabras clave para almacenar los valores netos.
Sintaxis:
assign out = expression;
Bloque de diseño: flujo de datos
module decoder24_assign(en,a,b,y); // declare input and output ports input en,a,b; output [3:0]y; // supportive connection required wire enb,na,nb; assign enb = ~en; assign na = ~a; assign nb = ~b; // assign output value by referring to logic diagram assign y[0] = ~(enb&na&nb); assign y[1] = ~(enb&na&b); assign y[2] = ~(enb&a&nb); assign y[3] = ~(enb&a&b); endmodule
TestBench: flujo de datos
module tb; // input port are declared in reg(register) reg a,b,en; // output port are declared in wire(net) wire [3:0]y; // instantiate design block decoder24_assign dut(en,a,b,y); initial begin $monitor("en=%b a=%b b=%b y=%b",en,a,b,y); // with reference to truth // table provide input values en=1;a=1'bx;b=1'bx;#5 en=0;a=0;b=0;#5 en=0;a=0;b=1;#5 en=0;a=1;b=0;#5 en=0;a=1;b=1;#5 // terminate simulation using $finish system task $finish; end endmodule
Salida: Para ejecutar el programa:
iverilog -o assign tb.v dut.v vvp assign
3. Modelado de nivel de puerta:
Las puertas lógicas son bloques de construcción de circuitos lógicos. Verilog admite puertas básicas como primitivas predefinidas. Estas primitivas se instancian (creando instancia/objeto) y se pueden implementar dentro de la definición del módulo.
Sintaxis:
logicgate object(output_port,input_port)
Ejemplo:
nand n1(y,x1,x2)
Nota: Las puertas lógicas están en minúsculas y el objeto puede tener cualquier nombre que no sean palabras clave. En el ejemplo anterior, y es la salida y x1 y x2 son señales de entrada.
El código de Verilog comienza con la definición del módulo con los puertos de entrada y salida pasados como argumento. Con la ayuda del diagrama lógico, instanciaremos 4 compuertas NAND y 3 compuertas NO para conectar señales de entrada y salida para implementar el decodificador 2:4.
Bloque de diseño: Nivel de puerta
module decoder24_gate(en,a,b,y); // declare input and output ports input en,a,b; output [3:0]y; // supportive connections required // to connect nand gates wire enb,na,nb; // instantiate 4 nand gates and 3 not gates // make connections by referring the above logic diagram not n0(enb,en); not n1(na,a); not n2(nb,b); nand n3(y[0],enb,na,nb); nand n4(y[1],enb,na,b); nand n5(y[2],enb,a,nb); nand n6(y[3],enb,a,b); endmodule
Banco de pruebas: nivel de puerta
module tb; // input port are declared in reg(register) reg a,b,en; // output port are declared in wire(net) wire [3:0]y; // instantiate design block decoder24_gate dut(en,a,b,y); initial begin $monitor("en=%b a=%b b=%b y=%b",en,a,b,y); // with reference to truth table provide input values en=1;a=1'bx;b=1'bx;#5 en=0;a=0;b=0;#5 en=0;a=0;b=1;#5 en=0;a=1;b=0;#5 en=0;a=1;b=1;#5 // terminate simulation using $finish system task $finish; end endmodule
Salida: Para ejecutar el programa:
iverilog -o gate tb.v dut.v vvp gate
Aplicación de decodificador:
Aquí hay algunos campos donde se implementa el decodificador en el mundo real:
- Conversores de código
- Vehículo robótico con detector de metales
- Sistema de automatización del hogar basado en RF
- Utilizado en ALU de CPU
- Sincronización de velocidad de múltiples motores en industrias