Esse é o primeiro de uma série de artigos que visa trazer diversas informações de como desenvolver um bom código em Verilog.

Estados do Bit

Primeiramente vou apresentar todos os estados que os bits podem ter em um design com Verilog. Esse fato é muito importante pois impacta no desenvolvimento do projeto e sempre ter isso em mente ajuda a não cometermos gafes simples. Em HDL, todo bit pode ter os seguintes estados:

bits verilog

Operadores em Verilog

Vamos criar um módulo bem simples de hardware descrevendo seu comportamento em Verilog. Conforme foi discutido no post de Rodrigo Pereira sobre a implementação de um processador em Verilog, o modelo comportamental descreve exatamente como um circuito deve funcionar, utilizando uma linguagem HDL, e deixa a responsabilidade da criação da lógica e da simulação correta para as ferramentas de síntese.

Conforme André Prado cita em seu artigo sobre sistemas digitais, no nível comportamental o sistema é descrito em função do seu comportamento, é uma representação funcional do mesmo. Estamos, nesse caso, preocupados em descrever o que acontece na saída do sistema quando há uma alteração em uma entrada, é a relação direta de entrada/saída. 

Uma porta AND, ilustrada na figura 1, pode ser reproduzida simplesmente como:

and
Figura 1: AND
// Exemplo de Modelo Comportamental em Verilog de uma porta AND
// Rodrigo Pereira - 16/03/2015

module EXEMPLO_AND ( x, y, out); // declaração do nome do módulo AND
input wire x, y; // entrada de dados - um bit
output wire out; // saída de dados - um bit

assign out = x & y; // circuito AND utilizando a chamada assign em Verilog

endmodule // final do módulo AND

Abaixo demonstro um código para um circuito com 3 portas lógicas descrito na figura 2.

figura 1 verilog
Figura 2: Circuito combinacional proposto para o segundo exemplo
// Exemplo de Modelo Comportamental em Verilog de um circuito com 3 portas logicas
// Thiago Lima - 16/04/2015

module EXAMPLE_2 (
                  a, 
                  b, 
                  c, 
                  e,
                  f
);

input 
      a,b,c; // sinais de entrada um bit
output 
      e,f;     // saidas um bit

wire 
      ab, d;

assign ab = a & b;
assign d = ~c;
assign e = ab | d;
assign f = a | b;
endmodule

Note algumas características interessantes do módulo escrito em Verilog:

Todas as operações são realizadas em paralelo. Veja que para o circuito combinacional mostrado anteriormente, o caminho mais rápido é relativo a operação:

assign f = a | b;

Confira abaixo todos os operadores que podem ser utilizados com Verilog. 

Operadores unitários

+                a = b + c ;               // Soma , adição binaria
a = b – c ; // Subtração, subtração binaria

Operadores de todos os bits

|a = |b ; // OR para todos os bits de b
&a = &b ; // AND para todos os bits de b
^a = ^b ; // XOR para todos os bits de b
~|a = ~|b ; // NOR para todos os bits de b
~&a = ~&b ; // NAND para todos os bits de b
~^              a = ~^b ;                 // XNOR para todos os bits de b

Operadores de bit-wise

~a = ~b;  // inverte b 
a = b | c;  // OR bit a bit
 & a = b & c;  // AND bit a bit
 ^ a = b ^ c;  // XOR bit a bit
 ~| a = b ~| c;  // NOR bit a bit
 ~& a = b ~& c; // NAND bit a bit
 ~^             a = b ~^ c;             // XNOR bit a bit

Operadores de igualdade

=a = b a recebe o valor de b
==a == bO valor de a é igual ao valor de b? 
===            a === b                   O valor de a é igual ao valor de b?  Inclui os estados Z e X.
!=a != bO valor de a nao é igual ao valor de b?
!==a !== bO valor de a nao é igual ao valor de b?  Inclui os estados Z e X.

Saiba mais sobre Verilog

PROCESSADORES PROGRAMÁVEIS – como projetar um processador em VERILOG – Arquitetura – parte 1

PROCESSADORES PROGRAMÁVEIS – como projetar um processador em VERILOG – Organização – parte 2

PROCESSADORES PROGRAMÁVEIS – como projetar um processador em VERILOG – Codificação – parte 3

Formas de representar um sistema digital

Tutorial de Modelsim: Verificando o VHDL antes de programar o FPGA

Tutorial de Verilog – Operadores Lógicos e Aritméticos Shift Right e Shift Left