Projetando Lógica Combinacional em Verilog Usando Statements Assign Contínuos
O statement assign Verilog é tipicamente usado para conduzir continuamente um sinal de tipo de dado wire e é sintetizado como lógica combinacional. Aqui estão mais alguns exemplos de projeto usando o statement assign.
Exemplo #1: Lógica Combinacional Simples
O código mostrado abaixo implementa uma lógica combinacional digital simples que tem um fio de saída z que é conduzido continuamente com um statement assign para realizar a equação digital.
module combo (input a, b, c, d, e, output z);
assign z = ((a & b) | (c ^ d) & ~e);
endmodule
Exemplo #2: Half Adder
O módulo half adder aceita duas entradas escalares a e b e usa lógica combinacional para atribuir as saídas sum e carry bit cout. O sum é conduzido por um XOR entre a e b enquanto o carry bit é obtido por um AND entre as duas entradas.
module ha (input a, b, output sum, cout);
assign sum = a ^ b;
assign cout = a & b;
endmodule
Exemplo #3: Full Adder
Um full adder pode ser construído usando o módulo half adder mostrado acima ou a lógica combinacional inteira pode ser aplicada como está com statements assign para conduzir as saídas sum e cout.
module fa (input a, b, cin, output sum, cout);
assign sum = (a ^ b) ^ cin;
assign cout = (a & b) | ((a ^ b) & cin);
endmodule
Exemplo #4: Multiplexador 2x1
O simples multiplexador 2x1 usa um operador ternário para decidir qual entrada deve ser atribuída à saída c. Se sel é 1, saída é conduzida por a e se sel é 0 saída é conduzida por b.
module mux_2x1 (input a, b, sel, output c);
assign c = sel ? a : b;
endmodule
Exemplo #5: Demultiplexador 1x4
O demultiplexador usa uma combinação de entradas sel e f para conduzir os diferentes sinais de saída. Cada sinal de saída é conduzido por um statement assign separado. Note que o mesmo sinal geralmente não é recomendado ser conduzido por diferentes statements assign.
module demux_1x4 (input f, input [1:0] sel, output a, b, c, d);
assign a = f & ~sel[1] & ~sel[0];
assign b = f & sel[1] & ~sel[0];
assign c = f & ~sel[1] & sel[0];
assign d = f & sel[1] & sel[0];
endmodule
Exemplo #6: Decodificador 4x16
module dec_3x8 (input en, input [3:0] in, output [15:0] out);
assign out = en ? 1 << in: 0;
endmodule
Verilog
- Dominando VHDL & Verilog: Escrevendo Lógica Combinacional e Sequencial Limpa
- Circuito com Chave: Guia Prático para Circuitos Elétricos Básicos
- Circuitos Integrados: Fundamentos de Portas Lógicas Digitais
- Controladores Lógicos Programáveis (CLPs): Controle Digital Moderno para Sistemas Industriais
- Entendendo Álgebra Booleana: Dos Fundamentos Lógicos a Circuitos Digitais
- Dominando Multiplicação e Divisão com Notação Científica
- Indústria 4.0: Perguntas e Respostas com Verena Majuntke da Bosch.IO sobre IoT, Automação e a Fábrica do Futuro
- Monitoramento Preciso de Temperatura em Closet de Servidores com Raspberry Pi
- Design Prático em Nível de Porta Verilog: Portas AND, OR, NOT e Multiplexador 2x1
- Dominando $timeformat do Verilog: Precisão e Controle de Exibição