Graduação em Engenharia Eletrônica Universidade Federal de Itajubá IESTI Verilog HDL Descrição algorítmica Prof. Rodrigo de Paula Rodrigues
Descrição algorítmica A B RTL E Representação Intermediária Circuito digital F C D
Descrições Por fluxo e estrutural Algorítmica X Y Código concorrente Código sequencial Hardware opera de forma paralela
Descrição algorítmica em Verilog Bloco a Comando 1 Comando 2... Comando N A B E F D C F D Bloco b Comando 1 Comando 2... Comando M
Bloco always [ ] always @( ) lista de sensibilidade opcionais no caso de um único comando ser executado [ begin ] [ end ] lista de comandos a serem executados [ ] parâmetro opcional
Bloco always Evento de ativação always @(... ) Comando 1 Comando 1 Comando 2 Comando 3... Fluxo Comando 2 Comando 3 Comando N... Comando N Fim
Bloco always - Ativação always always @( a ) always @( b or c ) always @(posedge d) a b c ou d! negedge
Comandos sequenciais always @(... ) Comando sequencial comando reg dados integer float! Não sintetizável tipos bloqueadores não bloqueadores
Registros nome do registro [[ ]] reg ; dimensão especificação dos limites tamanho e 1 bit [ ] parâmetro opcional
Números inteiros lista de inteiros [[ ]] integer ; tamanho de 32 bits sinalizado número de inteiros especificação dos limites [ ] parâmetro opcional
Atribuições bloqueadoras Registro a receber a atribuição registro * Valor de atribuição a = b; c = d ^ w; d = ~ e;... f = g b; valor ou equação de atribuição Importante: A análise e atribuição são realizadas no mesmo momento do comando * Aplicável ao se modelar lógica sequencial
Atribuições não bloqueadoras Registro a receber a atribuição * registro < Valor de atribuição... a <= b; c <= d ^ w; d <= ~ e; f <= g b; valor ou equação de atribuição * Aplicável ao modelamento de lógica combinacional Importante: A análise é realizada no momento do comando, enquanto a atribuição, ao final do bloco
Exemplos 1 Levante o circuito gerado por cada um do trechos de descrições apresentados 1 a module M1( a, b, c ); input a, b; // entradas output c; // saídas reg c; // registros always @( a or b ) begin c = a b; end endmodule a b c
Exemplos 1 b module M2( a, b, clk ); input a, clk; // entradas output b; // saídas reg b; // registros always @( posedge clk ) begin b = a; end endmodule a C b D FF D clk Q
Exemplos 1 c module M3( a, b, clk ); input a, clk; // entradas output b; // saídas reg b, s; // registros always @( negedge clk ) begin s = a; b = s; end a clk D C FF D Q b endmodule
Exercícios 1 d module M4( a, b, clk ); input a, clk; // entradas output b; // saídas reg b, s; // registros a D s Q D b Q b always @( negedge clk ) begin s <= a; b <= s; end clk FF D FF D endmodule
Operadores lógicos Símbolo Função lógica Exemplo! Negação! e Ou c d && E a && b == Teste de igualdade f == g!= Teste de desigualdade w!= h === Teste de igualdade (x, z) w === h!== Teste de desigualdade (x, z) x!== y
Operadores lógicos A = 2 d3, B = 2 d0 A && B A B! B! A A == B Resultado: 0 Resultado: 1 Resultado: 1 Resultado: 0 Resultado: 0 A = 3 b0xx, B = 3 b0xz, C = 3 b0xx A && B A!= B A!== B A === B A === C Resultado: x Resultado: x Resultado: 1 Resultado: 0 Resultado: 1
Operadores relativos Símbolo Função Exemplo < Menor que > Maior que a < b c > d <= Menor ou igual a a <= b >= Maior ou igual a f >= g
Operadores relativos A = 4, B = 3, X = 4 b1010, Y = 4 b1101, Z = 4 b1xxx A <= B A > B Y >= X Y < Z A > Z Resultado: 0 Resultado: 1 Resultado: 1 Resultado: x Resultado: x
Estrutura de comparação SE Formato 1 Formato 2 Formato 3 Formato 4 if ( ) if ( ) if ( ) if ( ) ; ; ; begin else else if ( ) ; else ; end ;
Estrutura de comparação SE Formato 1 Formato 2 Formato 3 Formato 4 if ( A == 1 b1 ) S = B & C ; if ( A == 1 b1 ) S = B & C; else S = B C; if ( A == 2 b01 ) S = 4 b1010; else if ( A == 2 b10 ) S = 4 b1110; if ( A === 1 bx ) begin C <= A & B; D <= C E; else F <= ~ G; S = 4 b0000; end
Estrutura de comparação CASO case ( ) expressão de teste alternativas alternativa padrão 1 2 3 : 1 ; : 2 ; : 3 ; [ default : padrão ;] endcase... [ ] parâmetro opcional comandos a serem executados no caso da alternativa associada ser verdadeira um único comando ou um bloco de comandos entre as palavras begin e end
Estrutura de comparação CASO case ( controle ) 2 b00, 2 b01 : saida = x y; 2 b10 : begin saida = x ^ y; sinal = 1 b1; end 2 b11 : sinal = 1 b0; endcase
Estrutura de comparação CASO case ( funcao_ula ) 3 b000 : saida = x & y; 3 b001 : saida = x y; 3 b101 : saida = x ^ y; 3 b110 : saida = ~x ; default : saida = 4 h0; endcase
Estrutura de comparação CASO casez casex Estado z é tratado como não importa Estados x e z são tratados como não importa
Estrutura de comparação CASO reg [3:0] codigo; integer estado; casex ( codigo ) 4 b1xxx : estado = 1; 4 bx1xx : estado = 2; 4 bxx1x : estado = 3; 4 bxxx1 : estado = 4; endcase
Estrutura de repetição Enquanto expressão de teste while ( ) ; while ( ) begin comando a ser executado enquanto a condição de teste for verdadeira end bloco de comandos a serem executado enquanto a condição de teste for verdadeira
Estrutura de repetição Enquanto reg [0:9] entrada, saida; integer indice; indice = 0; while ( indice < 10 ) begin saida[ indice ] = entrada[ indice ] ^ 1 b1; indice = indice + 1; end
Estrutura de repetição Para inicialização teste atualização for ( ; ; ) ; for ( ; ; ) begin comando a ser executado enquanto a condição de teste for verdadeira end bloco de comandos a serem executado enquanto a condição de teste for verdadeira
Estrutura de repetição Para reg [0:9] entrada, saida; integer indice; for( indice = 0; indice < 10; indice = indice + 1 ) begin saida[ indice ] = entrada[ indice ] ^ 1 b1; end
Exemplos Mux 2 para 1 /* Mux 2 para 1 comportamental */ module mux2p1( a, b, s, z ); a b 0 1 s z input a, b, s; // entradas output z; // saídas reg z; // registro de saída always @( a or b or s ) begin if ( s == 1 b1 ) z = b; else z = a; end endmodule
Exemplos Circuito combinacional /* Combinacional */ module combinacional( a, b, c, d ); a b c s sinal interno d input a, b, c; // entradas output d; // saídas reg s, d; // registros always @( a or b or c ) begin s <= a & b; d <= s & c; end endmodule
Exemplos Demux 4 para 1 /* Demux 4 para 1 comportamental */ module demux4p1( I, S, O ); I 00 01 10 11 s 1 s 0 O 0 O 1 O 2 O 3 input I; // entrada I input [1:0] S; // entradas de seleção output [3:0] O; // saídas reg [3:0] O; // registro de saída integer cnt; // contador always @( I or S ) begin end endmodule for (cnt = 0; cnt < 4; cnt = cnt + 1 ) if ( cnt == S ) O[ cnt ] = I; else O[ cnt ] = 1 b0;
Exercícios 1 Implemente um demux 4 para 1 por meio da construção comportamental case 2 Implemente um decodificador de prioridade de 4 entradas e 2 saídas
Demux 4 para 1 I 00 01 10 11 O 0 O 1 O 2 O 3 s 1 s 0
Codificador de prioridade Entradas Saídas E 0 E 1 E 2 E 3 Codif. Prioridade s 0 s 1 E3 E1 E2 E0 S1 S0 1 x x x 1 1 0 1 x x 1 0 0 0 1 x 0 1 0 0 0 1 0 0
Verilog Fim Obrigado