Aula 5.2 - Código de uma porta xor em Verilog HDL
Este artigo faz parte do projeto #LTCode
Na primeira aula dessa série de aulas você aprendeu toda a base para compreender códigos em Verilog HDL e rodar os códigos, se ainda não leu clique aqui e confira.
Hoje vamos projetar um circuito lógico OU Exclusivo (xor) usando 3 maneiras para descrição em Verilog HDL.
A primeira maneira é a forma estrutural onde se usa-se portas lógicas primitivas para descrever um circuito através das conexões dos componentes que os compõe.
Confira como fica o código de um circuito XOR na forma ESTRUTURAL:
module porta_xor (Y,A,B);
output Y;
input A,B;
wire notA, notB;
wire and1, and2;
not invA (notA,A); //nega o A e atribui a notA
not invB (notB,B); //nega o B e atribui a notB
and flor (and1,notA,B); //faz AND entre notA e B
and bola (and2,notB,A); //faz AND entre notB e A
or sorte (Y,and1,and2); //faz OR entre and1 e and2 e atribui a Y
or sorte (Y,and1,and2); //faz OR entre and1 e and2 e atribui a Y
endmodule
Em laranja no código acima, são palavras aleatória (escolhida por você) para nomear os blocos entre parênteses. Você deve estar se perguntando o que é uma variável "wire", são variáveis intermediárias ou seja não são de entrada e nem de saída, por exemplo "and1" e "and2" são intermediárias pois no bloco "sorte" o resultado da operação "or" entre elas é atribuído a variável de saída "Y".
A segunda maneira é a forma de fluxo de dados onde são representados sinais de saída em função de sinais de entradas.
Confira como fica o código do mesmo circuito acima na forma de FLUXO DE DADOS:
module porta_xor (Y,A,B);
output Y;
input A, B;
assign Y = ((~A)&B)|(A&(~B)); //atribui resultado da operação lógica a Y
endmodule
Em "assign Y = " temos: ((not A) and B) or (A and (not B));
Por fim temos abaixo um exemplo usando a maneira comportamental que descreve o circuito através do comportamento, na forma de um algoritmo. Geralmente usa-se if-then, case.
module porta_xor (Y,A,B);
output reg Y;
input A, B;
always@(A or B)
begin
case ({A,B}) //concatena A e B
2'b00 : Y = 1'b0; // caso 00: Y recebe 0
2'b01 : Y = 1'b1; // caso 01: Y recebe 1
2'b10 : Y = 1'b1; // caso 10: Y recebe 1
2'b11 : Y = 1'b0; // caso 11: Y recebe 0
endcase; //sim precisa de ";" aqui
end
endmodule
Note que "Y" é uma "output" do tipo "reg" pois "Y" está presente dentro do ambiente "always". Neste ambiente as declaração são executadas sequencialmente se e somente se na lista de sensitividade "@ (lista de sensibilidade)" houver uma mudança de evento lógico, no caso se A ou B tiver mudança de sinais de entrada. Na linha do "case", dentro das chaves "{}" ocorre uma concatenação dos bits de A e B, assim quando A e B forem 0 e 0 é o mesmo que 2 bits: 00. Note que no comando "case" basicamente foi criado a tabela verdade do XOR.
>> Próxima aula, clique aqui.
COMENTÁRIOS