VHDL Very High Speed Integrated Circuit Hardware Description Language Prof. Eduardo Todt 2008.
Hardware Description Language (HDL) Para que precisamos de uma Linguagem de Descrição de Hardware...
Transcript of Hardware Description Language (HDL) Para que precisamos de uma Linguagem de Descrição de Hardware...
Hardware Description Language (HDL)
• Para que precisamos de uma Linguagem de Descrição de Hardware ?
• Modelar, Representar e simular hardware digital
– Concorrência
– Paralelismo
– Valores de sinais no tempo
• Construções especiais
– Transições (bordas) de valores de sinais
– Atrasos de propagação de sinais
– Verificação de condições temporais
Hardware Description Language (HDL)
• A linguagem Verilog foi introduzida em 1985 pela Gateway Design Automation.
• A Gateway foi comprada pela empresa Cadence Design Systems, em 1989, que tornou a linguagem de domínio público em maio de 1990 com a formação da Open Verilog International (OVI).
• Hoje o Verilog é um padrão IEEE, já tendo duas extensões ou modificações: Verilog-95 (padrão IEEE 1364-1995), Verilog 2001 (IEEE 1364-2001) e Verilog 2005 (IEEE 1364-2005).
• O Verilog tem uma grande semelhança com a linguagem de programação C.
unidade básica – o módulo
Módulo (module)
• Define terminais (pinos, portas) de entrada e saída
• Descreve a funcionalidade do circuito
VERILOG HDL
Módulo – Definição Geral
module <nome do módulo> (declaração das portas);
… declaração de variáveis;
… descrição do comportamentoendmodule
VERILOG HDL
Módulo – Definição Geral
module <nome do módulo> ( declaração das portas );
… declaração de variáveis;
… descrição do comportamentoendmodule
VERILOG HDL
Exemplo:
module meu_and (output reg C, input A, B); always @ (A, B) begin C = A & B; // & operador AND endendmodule
VERILOG HDL
Identificadores
A ... Za ... z0 ... 9Underscore
• O primeiro caractere do identificador não pode ser um dígito
Verilog diferencia letras maiúsculas de minúsculas
VERILOG HDL
Comentários em Verilog
// comentário de uma linha só/* outra forma de comentário de uma linha *//* inicio de comentário com múltiplas linhas todo text é ignorado termina com a linha abaixo*/
Números
decimal, hexadecimal, octal, binarioDecimal sem sinal Decimal com sinal
Cadeias de caracteres
"Delimite usando aspas numa mesma linha"limitados a 1024 caracteres
VERILOG HDL
Modelos de Descrição
• Estrutural: descreve um circuito lógico através da interligação dos componentes que os compõe.
• Fluxo de dados: descreve um circuito através das funções booleanas que os compõe.
• Comportamental: descreve o circuito através do comportamento do mesmo, na forma de um algoritmo.
• RTL (Register Transfer Level): descreve o circuito através do que acontece a cada transição ativa do sinal de relogio
VERILOG HDL
Modelo estrutural
• Execução: Concorrente
• Formato: portas lógicas primitivas
Exemplo:
f1
f2
f3ABCin
VERILOG HDL
Exemplo somador completo:
module somador_completo_estrutural (output Cout, S, input A, B, Cin); and g1(f1, A, Cin), // saída sempre o primeiro parâmetro da instância (f1)) g2(f2, A, B), g3(f3, B, Cin); or g4(Cout, f1, f2, f3); xor g5(S, A, B, Cin); endmodule
VERILOG HDL
Modelo fluxo de dados
• Execução: Concorrente.
• Formato: assign net = expressão;
• A ordem das atribuições dentro do arquivo Verilog não tem efeito sobre a execução.
Exemplo:
VERILOG HDL
Exemplo somador completo (fluxo de dados):
module soma_fluxo_de_dados (output S, Cout, input A, B, Cin);
assign S = A ^ B ^ Cin; // Soma assign Cout = (A & B) | (A & Cin) | (B & Cin); // Cout endmodule
VERILOG HDL
Modelo comportamental:
• Uso de instruções alto nível da linguagem (if, case, while, for)
• Uso do comando always
• Comandos dentro do procedimento always são executados sequencialmente
• O comando always é executado quando há uma mudança no valor lógico de um sinal da lista de sensibilidade
• Formato do comando always:
always @ (a, b, c...) begin <comandos> end
• Os comandos always são concorrentes
lista de sensibilidade (todas as entradas do circuito)
VERILOG HDL
Exemplo: Modelo Comportamental do Multiplexador
sel out
0 a
1 b
Tabela Verdade do Multiplexador
a
b
sel
outMultiplexador
2X1
Se sel = 0 então out = a
Senão out = b
Algoritmo dp Comportamento do MUX
VERILOG HDL
Exemplo: Modelo Comportamental do Multiplexador
sel out
0 a
1 b
Tabela Verdade do Multiplexador
module comportamental_mux (output reg out, input a, b, sel); always @(a,b, sel) begin if (sel == 0) out = a; else out = b; end endmodule
Descrição Verilog:
Símbolo do Mux:
VERILOG HDL
Exemplo: Modelo Comportamental do Multiplexador
sel out
0 a
1 b
Tabela Verdade do Multiplexador
a
b
sel
outMultiplexador
2X1out = (~ sel & a) | (sel & b)
Equação booleana do Mux (2x1):
VERILOG HDL
Exemplo: Modelo Comportamental do Multiplexador
Tabela Verdade do Multiplexador
module comportamental2_mux (output reg out, input a, b, sel); always @(*) begin out = (~ sel & a) | (sel & b); end endmodule
Descrição Verilog:
sel out
0 a
1 b
Síntese
Substitui a lista de sensibilidade
VERILOG HDL
Exemplo:
A B Cin S Cout
0 0 0 0 0
0 0 1 1 0
0 1 0 1 0
0 1 1 0 1
1 0 0 1 0
1 0 1 0 1
1 1 0 0 1
1 1 1 1 1
Tabela Verdade do Somador Completo
VERILOG HDL
Instruções Condicionais (Instrução IF)
Formato:
if (condição) // obs: usar BEGIN e END quando existir mais de um comando comando;else if (condição) comando;else
comando;
Exemplo:
if (reset) Q = 0;else Q = D;
VERILOG HDL
Instruções Condicionais (Instrução CASE)
Formato:
case (sinal) // obs: usar BEGIN e END quando existir mais de um comando
<número de bits>’<sistema de numeração><alvo1>: comando; ... <número de bits>’<sistema de numeração><valor2>: comando;
end case
<sistema de numeração> d – decimal; h – hexadecimal, b - binário
<alvo1>, <alvo2>... será executado o comando cujo alvo for igual ao sinal
VERILOG HDL
Instruções Condicionais (Instrução CASE)
Exemplo:
module exemplo_case (output reg[1:0] Y, input [1:0] A, B, X); always @ (*) begin case (X) 2'b00: Y = A+B; 2'b01: Y = A-B; 2'b10: Y = A/B; default: Y = 00; endcase end endmodule
VERILOG HDL
Instruções Condicionais (Instrução CASE)
Exemplo:
module exemplo_case (output reg[1:0] Y, input [1:0] A, B, X); always @ (*) begin case (X) 2'b00: Y = A+B; 2'b01: Y = A-B; 2'b10: Y = A/B; default: Y = 00; endcase end endmodule
Formato:
case (sinal)
<número de bits>’<sistema de numeração><alvo1>: comando; ... <número de bits>’<sistema de numeração><valor2>: comando;
end case
<sistema de numeração> d – decimal; h – hexadecimal, b - binário
<alvo1>, <alvo2>... será executado o comando cujo alvo for igual ao sinal
VERILOG HDL
Instruções Condicionais (Instrução CASE)
Exemplo:
module exemplo_case (output reg[1:0] Y, input [1:0] A, B, X); always @ (*) begin case (X) 2'b00: Y = A+B; 2'b01: Y = A-B; 2'b10: Y = A/B; default: Y = 00; endcase end endmodule
VERILOG HDL
Tipos de Dados:
• Net (wire) – usado para modelar uma conexão elétrica wire [msb:lsb] msb: most significant bit; lsb: least significant bit
Exemplo:
wire Reset; // 1-bit wire
wire [6:0] Clear; // 7-bit wire
VERILOG HDL
Exempo de NET do tipo wire:
module somador_completo_estrutural (output Cout, S, input A, B, Cin); wire f1, f2, f3; and g1(f1, A, Cin), g2(f2, A, B), g3(f3, B, Cin); or g4(Cout, f1, f2, f3); xor g5(S, A, B, Cin); endmodule
f1
f2
f3ABCin
wire
wire
VERILOG HDL
Tipos de Dados:
• Register (reg) tipo de dado que armazena o valor de um sinal, até o mesmo ser alterado (não representa um registrador de fato). reg [msb:lsb] msb: most significant bit; lsb: least significant bit
Exemplo:
reg [ 3: 0 ] cla; // 4-bit register
reg cla; // A 1-bit register
VERILOG HDL
Exempo de Register do tipo reg:
module comportamental2_mux (output reg out, input a, b, sel); always @(*) begin out = (~ sel & a) | (sel & b); end endmodule
VERILOG HDL
Uso dos tipos de dados:
• Nos modelos de descrição Estrutural e Fluxo de dados são usados o tipo wire, não se usa o tipo reg
• Nos modelos de descrição Comportamental e RTL são usados o tipo reg, não se usa o tipo wire
VERILOG HDL
Mais exemplos:
1) Fazer o modelo Verilog Fluxo de Dados de um circuito comparador com as características:
• O circuito possui duas entradas de 8 bits (a, b)
• O circuito possui três saídas de 1bit, denominadas (maior, menor e igual)
• O circuito possui a seguinte função: se a >b; maior = 1; se a< b ; menor = 1; se a = b; igual = 1
VERILOG HDL
Descrição Verilog Simulação
module comparador (output igual,maior,menor, input [7:0] a, b); assign igual = (a==b); assign maior = (a>b); assign menor = (a<b); endmodule
VERILOG HDL
Mais exemplos:
2) Fazer o modelo Verilog Comportamental de um circuito comparador com as características:
• O circuito possui duas entradas de 8 bits (a, b)
• O circuito possui três saídas de 1bit, denominadas (maior, menor e igual)
• O circuito possui a seguinte função: se a >b; maior = 1; se a< b ; menor = 1; se a = b; igual = 1
VERILOG HDL
Descrição Verilog Simulação module comparador_comportamental (output reg igual,maior,menor, input [7:0] a, b); always @(*) begin if (a==b) begin igual=1; maior=0; menor=0; end else if (a>b) begin menor=0; maior=1; igual=0; end else begin menor=1; maior=0; igual=0; end end endmodule
VERILOG HDL
Descrição Verilog Descrição RTL module comparador_comportamental (output reg igual,maior,menor, input [7:0] a, b); always @(*) begin maior=0; menor = 0; igual = 0; if (a==b) begin igual=1; end else if (a>b) begin maior=1;; end else begin menor=1; end end endmodule
VERILOG HDL
Descrição Verilog Descrição RTL
module comparador (output igual,maior,menor, input [7:0] a, b); assign igual = (a==b); assign maior = (a>b); assign menor = (a<b); endmodule
VERILOG HDL
Operadores Lógicos:
and & or | xor ^ not ~ nand ~& nor ~| right shift >> left shift << concatenacao { } condicional ?
VERILOG HDL
Exemplo Concatenação:
A B Cin S Cout
0 0 0 0 0
0 0 1 1 0
0 1 0 1 0
0 1 1 0 1
1 0 0 1 0
1 0 1 0 1
1 1 0 0 1
1 1 1 1 1
Tabela Verdade do Somador Completo
Concatena as entradas: {A, B, Cin }
VERILOG HDL
Exemplo Concatenação:
A B Cin S Cout
0 0 0 0 0
0 0 1 1 0
0 1 0 1 0
0 1 1 0 1
1 0 0 1 0
1 0 1 0 1
1 1 0 0 1
1 1 1 1 1
Tabela Verdade do Somador Completo
module exemplo_concatena (output reg S, Cout, input A, B, Cin); always @ (*) begin // procedimento resolve a soma case ({A, B, Cin}) // concatena A, B, Cin, numa única variável 3'b001: S = 1; 3'b010: S = 1; 3'b100: S = 1; 3'b111: S = 1; default: S = 0; endcase end always @ (*) begin // procedimento resolve o Cary (Cout) case ({A, B, Cin}) // concatena A, B, Cin, numa única variável 3'b011: Cout = 1; 3'b101: Cout = 1; 3'b110: Cout = 1; 3'b111: Cout = 1; default: Cout = 0; endcase end endmodule
Concatena as entradas: {A, B, Cin }
VERILOG HDL
Simulação
VERILOG HDL
module buffer_terceiro_estado (output out, input enable, dado); assign out = (enable) ? dado : 1'bz;
endmodule
Síntese
VERILOG HDL
module buffer_terceiro_estado (output out, input enable, dado); assign out = (enable) ? dado : 1'bz;
endmodule
Síntese
Simulação
Descrição Verilog
terceiro estado
(tri-state)
terceiro estado (tri-state)
VERILOG HDL
Operações Aritméticas :
adicao + subtracao - multiplicacao * divisao / modulo %
VERILOG HDL
Instruções de Laço
• Repeat• While• For
• O laço Repeat não é usado para síntese de circuitos • O laço While é usado para síntese de circuitos sequenciais
• O laço For é usado para síntese de circuitos combinacionais