Tutorial Verilog 1ª Edição

Documentos relacionados
Sistemas Digitais. Linguagem Verilog. Monitoria SD Daniel Alexandro/Reniê Delgado/Vanessa Ogg. Editado por (DARA)

1. Objetivos: Familiarizar o aluno com o uso do ambiente de desenvolvimento da Linguagem Verilog. Familiarizar o aluno com a linguagem Verilog.

VERILOG. Alex Vidigal Bastos

Circuitos sequenciais elementares

Circuitos combinatórios. (Revisão)

Máquina de Estados. Transições Estados Em Verilog. Monitoria SD Daniel Alexandro/Reniê Delgado/Vanessa Ogg.

Treinamento em Projeto de Sistemas Digitais

Xilinx ISE. O projecto

Introdução às máquinas de estado finitas

Máquinas de Estados Finitos. Aula 19 Prof. Abel Guilhermino

Circuitos sequenciais elementares

Verilog HDL Introduzida em 1985 pela Gateway Design System Corporation Após 1990, passou a ser de domínio público, e em 1995 passou a ser padrão IEEE

low): Descreve o que o sistema deve fazer utilizando expressões lógicas.

Aula 4 Objetivos if/else while

4. Constantes. Constantes pré-definidas

CURSO BÁSICO DE VERILOG

Capítulo 8. Estruturas de Controle no Nível de Sentença

Estruturas de Controle em c#

Linguagem de Programação III

Linguagens de descrição de hardware. Modelação de um circuito (digital) com HDL. fluxo de projecto seguindo uma metodologia top-down

Aula 2 Semântica de VHDL

Revisão da Linguagem C Prof. Evandro L. L. Rodrigues

Testbench. modelo não sintetizável (testbench) circuito a fabricar. modelo sintetizável (vai ser um circuito digital) Verilog

Módulo 9 VARIÁVEIS, TIPOS DE DADOS, OPERADORES, ESTRUTURAS DE CONTROLO P S I C P T G P S I

VHDL Circuitos Combinacionais

Prof. A. G. Silva. 28 de agosto de Prof. A. G. Silva INE5603 Introdução à POO 28 de agosto de / 1

Legibilidade do código fonte

Working 03 : Conceitos Básicos II

Uma Introdução às Linguagens de Descrição de Hardware

Working 03 : Conceitos Básicos II

FPGA & VHDL. Tutorial

Descrição por fluxo de dados (Data-Flow): Descreve o que o sistema deve fazer utilizando expressões lógicas.

Programação de Computadores I Introdução ao C PROFESSORA CINTIA CAETANO

5 - COMANDOS DE CONTROLE DE PROGRAMA Em C existem os comandos de decisões, os comandos de iteração (ou de laços) e os comandos de desvios.

VHDL. Descrição e Projeto de Circuitos Utilizando VHDL

Introdução à Linguagem de Programação Java 1 INTRODUÇÃO À LINGUAGEM DE PROGRAMAÇÃO JAVA

Linguagens de Programação

Algoritmos e Estruturas de Dados I IEC012. Linguagem C - Estruturas de Controle - Seleção. Prof. César Melo

Estruturas de Condição, Iteração, Arrays e Enumareção

Semana 2 Estruturas de Condição, Seleção e Repetição. Prof. Tiago Jesus de Souza

PROGRAMAÇÃO ESTRUTURADA E ORIENTADA A OBJETOS

CONVERSOR ANALÓGICO DIGITAL POR APROXIMAÇÕES SUCESSIVAS

Estruturas de Controle

Universidade Federal de Uberlândia Faculdade de Computação. Linguagem C: Operadores relacionais e lógicos estruturas condicionais If...

CIRCUITOS SEQUENCIAIS. Adão de Melo Neto

Modelação de máquinas de estados

12/11/13. Obje%vos do laboratório. SST20707 Síntese de Sistemas de Telecomunicações. Síntese de máquinas de estado (FSM) Finite State Machine (FSM)

SSC510 Arquitetura de Computadores 1ª AULA

Classes e Objetos. Sintaxe de classe em Java

NEANDERWIN. Algumas características do processador Neander são:

Profa. Luiza Maria Romeiro Codá 2

Introdução às linguagens de descrição de hardware

Arquitetura Von Neumann Dados e instruções são obtidos da mesma forma, simplificando o desenho do microprocessador;

Lógica de Programação. Lógica de Programação com Java

Módulo 5. Instruções if e switch. Algoritmos e Estruturas de Dados I C++ (Rone Ilídio)

Unidade 3: Estruturas de Controle Parte 2 - Lógica, SWITCH, FOR, WHILE e DO WHILE Prof. Daniel Caetano

Linguagem e Técnicas em Programação. Gilson de Souza Carvalho

SISTEMAS DIGITAIS II Enunciado do Projecto

FPGA & VHDL. Tutorial Aula 1. Computação Digital

Introdução à Programação em C. Prof. Ricardo Teixeira Tecnologia em Mecatrônica Industrial SENAI

Introdução à Linguagem VHDL

Fundamentos do Projeto Lógico

Introdução à Programação. Expressões Booleanas e Comandos Condicionais

Programação Estruturada e Orientada a Objetos

LABORG. VHDL Máquina de estados finitos

Módulo 04 Expressões, Estruturas de Seleção e Controle de Fluxo. Última atualização: 09/06/2010

Tutorial de Turbo Pascal

Programação Computacional C/C++

Aula 4 Estruturas de Controle

Variáveis primitivas e Controle de fluxo

Fundamentos de Programação em Python

Transcrição:

UFPE Universidade Federal de Pernambuco CIn Centro de Informática Tutorial Verilog 1ª Edição 2011.1 Felipe de Assis Souza (fas5)

INTRODUÇÃO Resolvi elaborar este documento após pagar a cadeira de Sistemas Digitais em 2011.1, já que a maior dificuldade que os alunos (me incluindo) sentiram durante o projeto da 2º unidade, foi em enter a sintaxe e semântica da linguagem Verilog. O objetivo deste tutorial é esclarecer algumas dúvidas a respeito da linguagem, utilizada no projeto da 2ª Unidade de Sistemas Digitais, além de servir como revisão para a cadeira de Infraestrura de Hardware, onde ela será trabalhada mais a fundo. Aqui você encontrará a explicação das principais keywords além de exemplos de como utilizálas, tentei explicá-las de uma maneira menos formal para facilitar o entimento. E não, você não vai encontrar o código entregue de bandeja neste tutorial (apesar de dar para pescar alguma coisa). A lógica é com você, ou como diz um amigo meu: Dá teus pulo, boy!. fas5.

1. PRINCIPAIS KEYWORDS 1) module/module é a mesma coisa que método (ou função) em outras linguagens. OBS.: Um module sempre é encerrado com um module. module nome_do_modulo (input 1, input N,..., output1,..., outputn); Ex1.: module SomaSub (In1, In2, Seletor, Overflow, Out); // Início do módulo SomaSub ( ) module // Fim do módulo SomaSub In1, In2, Seletor = entradas. Overflow, Out = saídas. Ex2.: module MaiorQue (A, B, Status); // Início do módulo MaiorQue ( ) module // Fim do módulo MaiorQue A, B = entradas. Status = saída. 2) input usado para declarar uma entrada. input nome_da_entrada; Ex1.: input In1, In2; // Declarando duas entradas, In1 e In2, de 1 bit Ex2.: input [3:0] A; // Declarando uma entrada, A, de 4 bits input [3:0] B; // Declarando uma entrada, B, de 4 bits Ex3.: input [7:0] A, B; // Declarando duas entradas, A e B, de 8 bits input Clock; // Declarando uma entrada, Clock, de 1 bit 3) output usado para declarar uma saída. output nome_da_saida; Ex1.: output Out; // Declarando uma saída, Out, de 1 bit Ex2.: output [2:0] Out; // Declarando uma saída, Out, de 3 bits output Overflow, Status; // Declarando duas saídas, Overflow e Status, de 1 bit

4) reg usado para quando se deseja guardar um valor em uma entrada ou saída até que outro valor seja enviado para essa entrada ou saída (registrador). OBS.: Entradas e saídas usadas dentro de blocos always/initial devem ser do tipo reg. reg nome_da_entrada/saida; Ex1.: reg In1, In2, Out; // Setando In1, In2 e Out como três registradores de 1 bit Ex2.: reg [2:0] Tx, Ty, Tz; // Setando Tx, Ty e Tz como três registradores de 3 bits reg [1:0] Tula; // Setando Tula como um registrador de 2 bits reg Conta, Reset; // Setando Conta e Reset como dois registradores de 1 bit 5) wire é o tipo padrão das entradas e saídas. OBS.: Não se pode usar entradas/saídas do tipo wire dentro de blocos always/initial. wire nome_da_entrada/saida; Ex.: wire [3:0] Outtemp; // Declarando um fio, OutTemp, que suporta 4 bits. 6) assign usado para atribuir um valor a uma entrada ou saída. assign nome_da_entrada/saida = valor; Ex1.: input [3:0] In1; // Declarando uma entrada, In1, de 4 bits assign In1 = 4 b1001; // In1 recebe a cadeia de 4 bits 1001. Ex2.: input [7:0] In1, In2; // Declarando duas entradas, In1 e In2, de 8 bits output Status; // Declarando uma saída, Status, de 1 bit assign Status = (In1 > In2); /* Status recebe 1, se In1 for maior do que In2, * caso contrário, recebe 0 */ Ex3.: input [3:0] In1, In2; // Declarando duas entradas, In1 e In2, de 4 bits input [1:0] Sel; // Declarando uma entrada, Sel, de 2 bits output [3:0] Out; // Declarando uma saída, Out, de 4 bits assign Out = (Sel == 2'b01)? In1: In2; /* Se Sel for igual à cadeia de 2 bits 01, Out * recebe In1, caso contrário, recebe In2 */

7) begin/ utilizado para iniciar uma sequência de comandos. Quando há apenas um comando a ser executado, não é necessária a utilização de begin/, mas é recomada, para melhorar a legibilidade do código. begin comando1; comando2; comandon; Ex.: exemplos no próximo item. 8) initial usado para inicializar inputs e/ou outputs. OBS.: Como o objetivo de inicializar inputs e outputs é fazer com que eles guardem algum valor, eles também têm que ser declarados como reg. initial begin Saida1 = dado1; Saida2 = dado2; Ex1.: output [3:0] Out; // Declarando uma saída, Out, de 4 bits reg [3:0] Out; // Setando Out como registrador de 4 bits initial Out <= 4'b0000; // Inicializando Out com a cadeia de 4 bits 0000 Ex2.: input [3:0] In1; // Declarando uma entrada, In1, de 4 bits input Sel; // Declarando uma entrada, Sel, de 1 bit reg [3:0] In1; // Setando In1 como registrador de 4 bits reg Sel; // Setando Sel como registrador de 1 bit initial begin // Início do bloco In1 = 4b 1010; // Inicializando In1 com a cadeia de 4 bits 1010 Sel = 1; // Inicializando Sel com o bit 1

9) always utilizado para realizar instruções sempre que houver mudança em alguma entrada/saída pré-determinada. OBS.: posegde = o bloco always executará na descida do clock. negedge = o bloco always executará na subida do clock. always @ (entrada1 or... or entradan) begin always @ (posedge Clock) begin código; ou código; Ex1.: input [2:0] In1, In2, In3; // Declarando três entradas, In1, In2 e In3, de 2 bits always (In1 or In2 or In3) begin /* Início do bloco. Sempre que In1, In2 ou In3 * mudarem de valor, o código dentro do bloco código; * será executado */ Ex2.: input Clock; // Declarando uma entrada, Clock, de 1 bit input [3:0] In1, In2; // Declarando duas entradas, In1 e In2, de 4 bits always @(posedge Clock) begin /* Início do bloco. Na descida do clock, o * código dentro do bloco será executado */ código; OBS.: Se ao invés de posedge estivesse escrito negedge, o código dentro do bloco seria executado na subida do clock.

10) case/case bloco condicional, semelhante ao bloco case em Java. OBS.: A keyword default é usada para descrever uma ação padrão, ou seja, caso a entrada não seja nenhuma das previstas pelo programador, um código padrão também definido pelo programador será executado. Seu uso não é não é obrigatório. case (entrada) possivel_entrada 1: begin código; possivel_entrada N: begin código; default: begin código; case Ex1.: input [1:0] In; // Declarando uma entrada, In, de 2 bits output [3:0] Out; // Declarando uma saída, Out, de 4 bits case (In) // Início do bloco 2 b00: Out <= 4 b0010; // Caso In seja igual a 00, Out receberá 0010 2 b01: Out <= 4 b1010; // Caso In seja igual a 01, Out receberá 1010 2 b10: Out <= 4 b0110; // Caso In seja igual a 10, Out receberá 0110 2 b11: Out <= 4 b0111; // Caso In seja igual a 11, Out receberá 0111 case Ex2.: input [1:0] In; // Declarando uma entrada, In, de 2 bits input Sel; // Declarando uma entrada, Sel, de 1 bit output [3:0] Out; // Declarando uma saída, Out, de 4 bits case (In) // Início do bloco 2 b00: Out <= 4 b0010; // Caso In seja igual a 00, Out receberá 0010 2 b01: Out <= 4 b1010; // Caso In seja igual a 01, Out receberá 1010 2 b10: begin /* Caso In seja igual a 10: Out <= 4 b0110; * Out receberá 0110 e Sel <= 1; * Sel receberá 1 */ default: Out <= 4 b0111; // Caso In seja igual a 11, Out receberá 0111 case

11) if/else bloco condicional semelhante ao bloco if/else de Java. Só pode ser utilizado dentro de blocos always. if (condicao) begin ou assign Saida = (Entrada == cadeia_de_bits)? Opcao1: Opcao2; código else begin Ex1.: input [3:0] A, B; // Declarando uma entrada, In, de 4 bits output [3:0] Out; // Declarando uma saída, Out, de 4 bits if (A > B) begin /* Início do bloco. Se A for maior do que B: Out <= A - B; * Out recebe o valor da operação A B, else begin * caso contrário: Out <= B - A; * Out recebe o valor da operação B - A */ Ex2.: input [3:0] In; // Declarando uma entrada, In, de 4 bits input [1:0] Sel; // Declarando uma entrada, Sel, de 2 bits output [3:0] Out; // Declarando uma saída, Out, de 4 bits wire [3:0] OutTemp; // Declarando um fio que suporta 4 bits assign Out = (Sel == 2'b11)? In: OutTemp; /* Caso Sel seja igual a 11, Out recebrá * o mesmo valor de In1, caso contrário, * receberá o valor de OutTemp */

12) parameter usado para rotular dados que serão utilizados muitas vezes, contribuindo para a legibilidade do código. parameter ROTULO = cadeia de bits; Ex.: input [3:0] Instrucao; // Declarando uma entrada, Instrucao, de 4 bits parameter CLRLD = 4b 0000; // Rotulando a cadeia de 4 bits 0000 como CLRLD parameter ADDLD = 4b 0001; // Rotulando a cadeia de 4 bits 0001 como ADDLD parameter HOLD = 4b 0010; // Rotulando a cadeia de 4 bits 0010 como HOLD case (Instrucao) // Início de um bloco do tipo case CLRLD: begin /* Caso Instrucao seja igual a 0000, execute ( ) * até o próximo */ ADDLD: begin /* Caso Instrucao seja igual a 0001, execute ( ) * até o próximo */ HOLD: begin /* Caso Instrucao seja igual a 0010, execute ( ) * até o próximo */ ( ) case OBS.: As cadeias 0000, 0001, 0010 foram rotuladas como CLRLD, ADDLD, HOLD, respectivamente. Sempre que for preciso usar essas cadeias no código, não será necessário digitá-las novamente, podo substituí-las por seus respectivos rótulos.

FONTES http://www.verilogtutorial.info/ http://www.asic-world.com/verilog/index.html