Circuitos Digitais Tutorial Linguagem Verilog Baseado em: http://doulos.com/knowhow/verilog_designers_guide/design_flow_using_verilog/ Universidade Federal Rural de Pernambuco Professor: Abner Corrêa Barros abnerbarros@gmail.com Projetos sem HDL ● Especificações ● Modelagem ● ● Máquina de Estados ● Tabela Verdade/Tabela de transição Simplificação ● ● Mapa de karnaugh Circuito Elétrico 2 Projeto com HDL ● Especificação (specs) ● Modelagem ● Projeto de Alto Nível ● Codificação RTL ● Verificação ● Sintese. 3 Projeto com HDL - Verilog 4 Níveis de abstração em projetos com Verilog 5 Níveis de abstração em projetos com Verilog No seu mais alto nível de abstração a linguagem Verilog permite o uso de funções estocásticas, por meio das quais é possível efetuar diversos estudos importantes para amodelagem e validação do sistema. Em um nível mais baixo de abstração, é possível o uso da modelagem comportamental, por meio de comandos de linguagens de alto nível. Desta forma pode-se modelar a funcionamento de dos módulos de um sistema sem se preocupar com os detalhes da implementação em hw. 6 Níveis de abstração em projetos com Verilog • A linguagem verilog suporta duas abordagens na descrição dos circuitos. • Descrição a nível comportamental, na qual o projeto será descrito com base no funcionamento esperado, abstraindo o modo como esse será mapeado FPGA/ASIC • Descrição a nível de mapeamento de módulos e portas lógicas , conhecida como descrição RTL ( Regiter Transfer Level). Esse nível de descrição dá mais liberdade ao desenvolvedor para definir como o projeto será mapeado no FPGA/ASIC. 7 Níveis de abstração em projetos com Verilog Verilog pode ser utilizado também para descrever ambientes de simulação, com vetores de teste, resultados esperados e circuitos de comparação e análise com os resultados obtidos. Algumas ferramentas de simulação permitem também que sejam introduzidos breakpoints e checkpoints a fim de facilitar o processo de verificação e debug dos módulos em desenvolvimento. 8 Modelagem e Particionamento 9 Elementos da Linguagem Verilog Construtores Módulos Portas Tipos de dados básicos(wire, reg) Operadores (lógicos, aritméticos, relacionais, atribuição, etc) Biblioteca de componentes básicos Hierarquia 10 Módulos ● Módulos são a parte principal de um projeto verilog – Representam o módulo eletrônico implementado – – ● ● Módulo = bloco Funcional Módulos possuem entradas e saidas (Elementos de conexão entre os módulos) Utiliza-se a palavra reservada module para definir um módulo Pode-se fazer um paralelo entre os módulos verilog e as funções e procedimentos das demais linguagens de programação 11 Exemplo: módulo arbrito module arbiter ( clock , // clock reset , // Active high, syn reset req_0 , // Request 0 req_1 , // Request 1 gnt_0 , // Grant 0 gnt_1 // Grant 1 ); Portas do módulo 12 Portas • Portas são os elementos que fazem a interface elétrica do módulo. As portas devem ser declaradas como entrada, saída ou entrada e saída 13 Exemplo1: módulo arbrito module arbiter ( clock , // clock reset , // Active high, syn reset req_0 , // Request 0 req_1 , // Request 1 gnt_0 , // Grant 0 gnt_1 // Grant 1 ); //-------------Input Ports----------------------------input clock; input reset; input req_0; input req_1; //-------------Output Ports---------------------------output gnt_0 ; output gnt_1 ; 14 Exemplo2: módulo arbrito module arbiter ( input clock , // clock input reset , // Active high, syn reset input req_0 , // Request 0 input req_1 , // Request 1 output gnt_0 , // Grant 0 output gnt_1 // Grant 1 ); 15 Tipos de Dados Verilog suporta dois principais tipos de dados e dois modificadores: •Wire: Tipo de dado utilizado para conectar dois pontos de um módulo ou duas portas de módulos diferentes (um fio condutor). A princípio, salvo indicação em contrário, todos os elementos de uma porta são do tipo Wire. •Reg: Tipo de dado utilizado para armazenar um dado lógico . Equivalente a um Flip/Flop ou a um Latch. •Input / Output: Modificadores que indicam que a porta é de entrada ou saida. Obs: Apenas sinais do tipo Wire podem ser associados como input. 16 Declaração de valores • A fim de otimizar o uso dos recursos do hardware, em Verilog um valor constante pode ser declarado acompanhado da quantidade de bits que deve ser utilizado na sua representação • Formato: • NN’BYYY…YY • NN = Número de Bits • B = Base numérica (b=binária, h=hexadecimal, d=decimal) • YYY…YY = Valor a ser atribuido • Exemplo: 8’h01 = valor 1 em hexadecimal representado em 8 bits 7’b0101100 = valor 46 em binário com 8 bits 17 Tipos de Dados Vectors A linguagem Verilog permite agrupar sinais na forma de vetores dos tipos básicos de dados. Declaração: Data Type [Range] name; • Range = Higher Bound: Lower Bound • Exemplo: Reg [7:0] reg_name; 19 Exemplos Vectors wire[7:0] dado; Reg [3:0] cnt; dado=8’d234; cnt = 4’b0111; dado=8’hAB; dado[5]=1’b0; 20 Tipos de Dados Array A linguagem Verilog permite definir array de elementos dos tipos básicos de dados. Declaração: Data Type [Range] name [Size]; • • • • Range = Higher Bound: Lower Bound Size = Tamanho do array Exemplo: Reg [7:0] dados [0:7]; Dados[5] = 8’hAA; 21 Exemplos Arrays Reg [7:0] dado [0:7]; Wire [7:0] word; Wire bit; dado[5]=8’hAA; word= dado[3]; // acessa uma palavra bit = word[5]; // acessa um bit 22 Operadores Lógicos e Aritméticos 23 Control Statements • if, else, case, repeat, while, for - são os comandos de controle de fluxo do Verilog e funcionam de forma muito parecida aos seus equivalentes das outras linguagens • Entretanto, por ser um linguagem de descrição de Hw, nem todos os comandos de controle são de fato implementáveis em hardware. Comandos de repetição normalmente não são suportados • Na verdade, apesar da sintaxe ser bem parecida, temos que lembrar que estes comandos serão implementados em HW utilizando portas lógicas e não instruções de um processador e isto pode fazer muita diferença no seu funcionamento 24 Exemplo de uso do If-else 25 Exemplo do comando Case Wire a,b,c; … case ({a, b, c}) 3'b000: f = 1'b0; 3'b00l: f = 1'b1; 3'b0l0: f = 1'b1; 3'b011: f = 1'b1; 3'b100: f = 1'b1; default: f = 1'b0; endcase Wire [2:0] dado; … case (dado) 3'b000: f = 1'b0; 3'b00l: f = 1'b1; 3'b0l0: f = 1'b1; 3'b011: f = 1'b1; 3'b100: f = 1'b1; default: f = 1'b0; endcase 26 Estilos de Codificação em Verilog • RTL (Regiter Transfer Lógic) • Representa o mais baixo nível de abstração da liguagem, normalmente associado aos elementos lógicos (portas, operadores) que tem representação direta no hardware • Behavioral (Comportamental) • Permite projetar com mais alto nível de abstração, sem se preocupar como o circuito será de fato implementado em hardware 27 Simple Design A B C D AOI F // Verilog code for AND-OR-INVERT gate module AOI (input A, B, C, D, output F); .... endmodule // end of Verilog code 28 Simple Design Module xxx (O1 , O2 , … I1, I2…); Input I1, I2, …., In; output O1, O2, …., On; assign O1=…. …. assign On=…. endmodule // Verilog code for AND-OR-INVERT gate module AOI (input A, B, C, D, output F); assign F = ~((A & B) | (C & D)); endmodule // end of Verilog code 29 Utilizando Wires Wire // Verilog code for AND-OR-INVERT gate module AOI (input A, B, C, D, output F); wire F; // the default wire AB, CD, O; // necessary assign AB = A & B; assign CD = C & D; assign O = AB | CD; assign F = ~O; endmodule // end of Verilog code 30 Utilizando Wires // Verilog code for AND-OR-INVERT gate module AOI (input A, B, C, D, output F); /* start of a block comment wire F; wire AB, CD, O; assign AB = A & B; assign CD = C & D; Comentário assign O = AB | CD; em Bloco assign F = ~O; end of a block comment */ // Equivalent... wire AB = A & B; wire CD = C & D; wire O = AB | CD; wire F = ~O; endmodule // end of Verilog code 31 Projeto Hierarquico // Verilog code for 2-input multiplexer module INV (input A, output F); // An inverter assign F = ~A; endmodule module AOI (input A, B, C, D, output F); assign F = ~((A & B) | (C & D)); endmodule module MUX2 (input SEL, A, B, output F); // 2:1 multiplexer // wires SELB and FB are implicit // Module instances... INV G1 (SEL, SELB); AOI G2 (SELB, A, SEL, B, FB); // Position mapping INV G3 (.A(FB), .F(F)); // Named mapping endmodule // end of Verilog code 32 Testbench module MUX2TEST; // No ports! ... initial // Stimulus ... MUX2 M (SEL, A, B, F); initial // Analysis ... endmodule 33 Testbench - Stimulus initial // Stimulus begin SEL = 0; A = 0; B = 0; #10 A = 1; #10 SEL = 1; #10 B = 1; end 34 Testbench - Analysis initial // Response $monitor($time, , SEL, A, B, F); 0 0000 10 0101 20 1100 30 1111 35 Verilog RTL 36 Bloco Always – Verilog Comportamental 37 Módulo AOI utilizando Always 38 Declaração de variáveis 39 Lógica combinacional com always Golden Rule 1: Para sintetizar lógica combinacional utilizando o always todos os sinais de entrada devem aparacer na lista de sensibilidade Mux 2x1 a f b sel 40 Comando If • O comando if é por natureza sequencial, ou seja, ele primeiro avalia a expressão de controle e em seguida executa o comando associado e, assim como na liguagem C, aceita apenas um comando aninhado em cada fluxo de execução. • Sendo necessário aninhar mais de um comando deve se utilizar o comando de bloco begin…end • Normalmente o comando if é sintetizado na forma de um multiplexador 41 Comando if aninhado 42 Problemas com o comando if 43 Problemas com o comando if Golden Rule 2: Para sintetizar lógica combinacional utilizando o always todas as variáveis devem ser carregadadas em todas as condições 44 Resolvendo o problema com always combinacional Se não for possível garantir que todas as variáveis sejam carregadas em todas as condições, carrege-as com valores default antes de executar o código condicional 45 Comando Case Reg a,b,c; … case ({a, b, c}) 3'b000: f = 1'b0; 3'b00l: f = 1'b1; 3'b0l0: f = 1'b1; 3'b011: f = 1'b1; 3'b100: f = 1'b1; default: f = 1'b0; endcase Reg [2:0] dado; … case (dado) 3'b000: f = 1'b0; 3'b00l: f = 1'b1; 3'b0l0: f = 1'b1; 3'b011: f = 1'b1; 3'b100: f = 1'b1; default: f = 1'b0; endcase 46 47 Projeto de módulos sequenciais Módulos sequenciais diferem dos módulos combinacionais por disporem de elementos de memória que registram o estado do sistema de forma a alterar a sua resposta aos estímulos da entrada a partir do estado em que se encontra Log. Combinacional Elementos de Memória 48 Projeto de módulos sequenciais Como elementos de memória normalmente utilizamse Flip-Flops, os quias são implementados utilizando o comando always • O comando always executa o que estiver em seu interior de maneira síncrona com os eventos monitorados em sua lista de sensibilidade • Da mesma forma que os flip-flops ativam o armazenamento de informação sincronamente com o sinal de clock • Enquanto o evento não ocorre a lógica interna do flipflop não é ativada 49 Always - Lista de sensibilidade always @(sensitivity-list) begin // statements end always @(a, b, c, d) sensitivity-list always @(a or b or c or d) always @(*) always @* always @(posedge a or posedge b) always @(negedge a or posedge b) always @(negedge a) 50 Always - observações • Tipos de transições • posedge (transição de subida) • negedge (transição de descida) • sem polaridade (qualquer transição) • Não é permitido misturar transições com e sem polaridade na lista de sensibilidade always @(a or b or c or d) always @(posedge a or negedge b) Х always @(a or posedge b) 51 Exemplos de projetos Lógica Combinacional - RTL 52 Exemplos de projetos Lógica Combinacional – RTL Hierárquico 53 Exemplos de projetos Lógica Combinacional – Comportamental 54 Exemplos de projetos Lógica Sequencial– Comportamental 55 Exemplos de projetos Lógica Sequencial– Comportamental 56 Exemplos de projetos Lógica Sequencial– Comportamental 57 Lógicas sequencial x combinacional • Na lógica sequencial as atualizações nas saidas ocorrem sincronamente com as transições indicadas para os elementos da lista de sensibilidade. • Na lógica combinacional as saidas estão em constante atualização. Qualquer alteração no estado de qualquer das entradas força a atualização das saidas. 58 Review Combinacional RTL // continuous assignments assign selb = ~sel; assign fb = ~((a & sel) | (b & selb)); assign f = ~fb Hierárquico // a hierarchy of designs INV G1 (SEL, SELB); AOI G2 (SELB, A, SEL, B, FB); INV G3 (.A(FB), .F(F)); Combinacional Comportamental // always block always @(sel or a or b) begin if (sel == 1) f = a; else f = b; end Sequancial // always block always @(posedge clk) Begin q=d; end 59 Exercícios Implemente e verifique a funcionalidade dos seguintes módulos: a) b) c) d) Porta and com 5 entradas Multiplexador 4 x 4 Contador módulo 4 Somador/subtrator completo de 4 bits no padrão de magnitude e sinal e) Conversor BCD – 7 seguimentos f) Flip-Flops JK, D e T 60 Comando Case logic a,b,c; … case ({a, b, c}) 3'b000: f = 1'b0; 3'b00l: f = 1'b1; 3'b0l0: f = 1'b1; 3'b011: f = 1'b1; 3'b100: f = 1'b1; default: f = 1'b0; endcase logic [2:0] dado; … case (dado) 3'b000: f = 1'b0; 3'b00l: f = 1'b1; 3'b0l0: f = 1'b1; 3'b011: f = 1'b1; 3'b100: f = 1'b1; default: f = 1'b0; endcase 61 Projeto 1 Implemente uma calculadora de 4 bits com as seguintes operações: • • • • SOMA SUBTRAÇÃO MULTIPLICAÇÃO DIVISÃO 62 Projeto 2 Implemente uma máquina de vender refrigerantes com as seguintes funcionalidades: • Aceita moedas de R$ 0,50 e R$ 1,0 • Vende refrigerantes de R$ 1.50 , R$ 2.50 e R$ 3.00 • Pode acumular até 6,0 em créditos • Fornece quantos refrigerantes os créditos acumulados permitirem • Fornece troco (tem uma tecla para pedir o troco) • Possui um display para mostrar o valor acumulado e o troco • Tem um estoque para até 3 latas de cada refrigerante • Sinaliza quando tem refrigerante no estoque (LED) 63 Projeto 2 SALDO Refri 1 1,50 0,50 1,00 TROCO Refri 2 2,50 Refri 3 3,00 SERVE 64