420 likes | 617 Views
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
E N D
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.
VERILOG HDL • 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 comportamento • endmodule
VERILOG HDL Exemplo: module meu_and (output reg C, input A, B); always @ (A, B) begin C = A & B; // & operador AND end endmodule • Módulo – Definição Geral • module <nome do módulo> • ( declaração das portas ); • … • declaração de variáveis; • … • descrição do comportamento • endmodule
VERILOG HDL • Identificadores • A ... Z • a ... z • 0 ... 9 • Underscore • 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, binario • Decimal 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 f3 A B Cin 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: assignnet = 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 é executadoquando 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)
a Multiplexador 2X1 out b sel VERILOG HDL Exemplo: Modelo Comportamental do Multiplexador Tabela Verdade do Multiplexador Algoritmo dp Comportamento do MUX Se sel = 0 então out = a Senão out = b
VERILOG HDL Exemplo: Modelo Comportamental do Multiplexador Tabela Verdade do Multiplexador Descrição Verilog: Símbolo do Mux: module comportamental_mux (outputreg out, input a, b, sel); always @(a,b, sel) begin if (sel == 0) out = a; else out = b; end endmodule
a Multiplexador 2X1 out b sel VERILOG HDL Exemplo: Modelo Comportamental do Multiplexador Tabela Verdade do Multiplexador Equação booleana do Mux (2x1): out = (~ sel & a) | (sel & b)
VERILOG HDL Exemplo: Modelo Comportamental do Multiplexador Tabela Verdade do Multiplexador Síntese Descrição Verilog: module comportamental2_mux (output reg out, input a, b, sel); always @(*) begin out = (~ sel & a) | (sel & b); end endmodule Substitui a lista de sensibilidade
VERILOG HDL Exemplo: 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 (outputreg[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
f1 f2 f3 A B Cin 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 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: • 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: Tabela Verdade do Somador Completo Concatena as entradas: {A, B, Cin }
VERILOG HDL 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 Exemplo Concatenação: Tabela Verdade do Somador Completo Concatena as entradas: {A, B, Cin }
VERILOG HDL Simulação
VERILOG HDL Síntese module buffer_terceiro_estado (output out, input enable, dado); assign out = (enable) ? dado : 1'bz; endmodule
VERILOG HDL Síntese Descrição Verilog module buffer_terceiro_estado (output out, input enable, dado); assign out = (enable) ? dado : 1'bz; endmodule Simulação 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