Baixe o app para aproveitar ainda mais
Prévia do material em texto
Projeto a partir de VHDL Prof. Thiago Felski Pereira Universidade do Sul de Santa Catarina– UNISUL Slides utilizados para apresentação dos conceitos iniciais de VHDL no LEDS/UNIVALI Adaptado da palestra da EMICRO 2007 do prof. Dr. Cesar Albenes Zeferino Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Tópicos Introdução ao VHDL Noções Básicas de VHDL Pacotes e Bibliotecas Sinais Variáveis Modelagem de Circuitos Combinacionais em VHDL Modelagem de Circuitos Seqüenciais em VHDL Considerações Finais Introdução ao VHDL Definição Tipos de modelagem Fluxos de simulação e síntese Aspectos gerais Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 O que é VHDL? É uma linguagem de descrição de hardware Desenvolvida a partir da necessidade do Departamento de Defesa (DoD) dos EUA para unificar a documentação de projetos de seus fornecedores no contexto do programa VHSIC, substituindo os diagrama esquemáticos VHDL = VHSIC HDL VHSIC = Very High Speed Integrated Circuit HDL = Hardware Description Language Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 O VHDL ou a VHDL? Assim como toda e qualquer linguagem de programação, em português, costuma-se “masculinizar” o gênero da linguagem o C o Delphi o JAVA o assembly o VHDL Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Cronologia e uso do VHDL Marcos históricos 1980: criação da linguagem 1987: padronização pelo IEEE (IEEE Std 1076-1987) 1993: revisão do padrão 2008: modernização da linguagem (IEEE Std 1076-2008) Uso Documentação Simulação Síntese Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Tipos de modelagem Estrutural “O que é” Comportamental “O que faz” ENTITY mux_2x1 IS PORT (a, b : IN BIT; sel : IN BIT; s : OUT BIT); END mux; ARCHITECTURE structural OF mux_2x1 IS BEGIN s <= (a AND NOT sel) OR (b AND sel); END structural; ENTITY mux_2x1 IS PORT (a, b : IN BIT; sel : IN BIT; s : OUT BIT); END mux; ARCHITECTURE behavior OF mux_2x1 IS BEGIN PROCESS(a,b,sel) BEGIN IF (sel='0') THEN s <= a; ELSE s <= b; END IF; END PROCESS; END behavior; Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Simulação funcional de um modelo VHDL Biblioteca VHDL Modelo VHDL Testbench VHDL Modelo de Simulação Vetores de teste Opcional Diagrama de Formas de Onda Saída em Formato texto Simulação VHDL Compilador de Simulação Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Síntese de um modelo VHDL Biblioteca VHDL Modelo VHDL Arquivo de Tecnologia Netlist Opcional Simulação VHDL com timing Compilador de Síntese Análise de Timing Posicionamento e Roteamento Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Aspectos gerais do VHDL Dois conjuntos de construtores Simulação Síntese Características É baseado em palavras reservadas (BEGIN, END, ...) É insensível à caixa (BEGIN = Begin = begin) Declarações terminadas por ponto e vírgula “;” Comentários marcados precedidos por duplo hífen “--” Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Aspectos gerais do VHDL Ex: Editor de texto com destaque coloridos de sintaxe Palavras reservadas Comentários Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Resumo VHDL é uma linguagem de descrição de hardware para Documentação Simulação Síntese Foi criada no contexto de um projeto do DoD-USA e hoje é uma HDL padronizada pelo IEEE Noções Básicas de VHDL Entidade Arquitetura Configuração Componentes Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Estrutura de um modelo VHDL básico Modelo VHDL = Entidade + Arquitetura Entidade (ENTITY) Define a interface com o mundo externo (portas de entrada e saída) Arquitetura (ARCHITECTURE): Define a implementação do projeto (ex. equações lógicas) Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Estrutura de um modelo VHDL básico ENTITY <identifier> IS ... END <identifier>; ARCHITECTURE <identifier> OF <entity_identifier> IS ... END <identifier>; Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Exemplo: Multiplexador 2-para-1 (mux_2x1) s a b sel 0 1 s a b 0 0 1 sel s 0 a 1 b Tabela verdade s = sel.a + sel.b Equação lógica if (sel == 0) s = a; else s = b; Funcionalidade (C) s a b 1 0 1 Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Exemplo: Multiplexador 2-para-1 (mux_2x1) Diagrama esquemático s = sel.a + sel.b sel.a sel.b Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Exemplo: Multiplexador 2-para-1 (mux_2x1) Diagrama de formas de onda sel = 0 sel = 1 sel a b s Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Modelando o mux_2x1 em VHDL ARCHITECTURE structural OF mux_2x1 IS BEGIN s <= (a AND NOT sel) OR (b AND sel); END structural; ENTITY mux_2x1 IS PORT (a, b : IN BIT; -- data inputs sel : IN BIT; -- selector s : OUT BIT); -- data output END mux_2x1; ARQUITETURA ENTIDADE Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Modelando o mux_2x1 em VHDL ENTIDADE ARQUITETURA Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Modelando o mux_2x1 em VHDL ENTIDADE ARQUITETURA ENTITY mux_2x1 IS PORT (a, b : IN BIT; sel : IN BIT; s : OUT BIT); END mux_2x1; ARCHITECTURE structural OF mux_2x1 IS BEGIN s <= (a AND NOT sel) OR (b AND sel); END structural; Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Entidade (ENTITY) É onde são declarados os parâmetros (GENERIC) da entidade e os seus sinais de entrada e de saída (PORT) ENTITY <identifier> IS GENERIC ( <parameter_name>: STRING := <default_value>; <parameter_name>: INTEGER := <default_value> ); PORT ( <input_name> : IN BIT; <bidir_name> : INOUT BIT; <buffer_name> : BUFFER BIT; <output_name> : OUT BIT ); END <identifier>; Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Entidade (ENTITY) Parâmetros (GENERIC) Permite passar informações a um modelo. Ex: Especificação de atrasos de propagação (somente simulação) Especificação de largura de canais em modelos parametrizáveis Podem ser definidos com valores defaults e modificados por instâncias superiores em uma descrição hierárquica Estrutura geral da declaração de um parâmetro GENERIC <parameter_name>: <type> := <default_value>; Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Entidade (ENTITY) Sinais da interface (PORTS) Entradas e saídas do modelo Existem quatro modos de port IN entrada OUT saída BUFFER saída com realimentação interna INOUT bidirecional SIGNAL <signal_name>: <mode> <type>; Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Entidade (ENTITY) Exemplo ou ENTITY mux_2x1 IS PORT (SIGNAL a, b : IN BIT; -- data inputs SIGNAL sel : IN BIT; -- selector SIGNAL s : OUT BIT); -- data output END mux_2x1; ENTITY mux_2x1 IS PORT (a, b : IN BIT; -- data inputs sel : IN BIT; -- selector s : OUT BIT); -- data output END mux_2x1; Projeto a partir de VHDLThiago Felski Pereira, UNISUL/2014 Arquitetura (ARCHITECTURE) Descreve a estrutura e/ou a funcionalidade do modelo Tem que ser associada a uma entidade. Ex: Uma entidade pode ter múltiplas arquiteturas Estilos de arquitetura Comportamental Estrutural Híbrida ARCHITECTURE structural OF mux_2x1 IS Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Arquitetura (ARCHITECTURE) Um arquitetura é constituída por processos Tipos de processos Implícito (em inglês, usa-se implied = implicado) Uma declaração de atribuição a um sinal Explícito Consiste de declarações seqüenciais Os múltiplos processos de uma arquitetura são executados de forma concorrente Não importa a ordem em que são declarados no modelo Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Arquitetura (ARCHITECTURE) ARCHITECTURE <identifier> OF <entity_identifier> IS BEGIN -- Concurrent Signal Assignments (implied processes) -- ... END <identifier>; --(1076-1987 Version) END ARCHITECTURE; --(1076-1993 Version) Estrutura mínima de uma descrição estrutural Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Arquitetura (ARCHITECTURE) Exemplo ARCHITECTURE structural OF mux_2x1 IS BEGIN s <= (a AND NOT sel) OR (b AND sel); END structural; Processo implícito Uma atribuição a um sinal Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Arquitetura (ARCHITECTURE) ARCHITECTURE <identifier> OF <entity_identifier> IS BEGIN -- Process statements (explicit processes) -- ... END <identifier>; --(1076-1987 Version) END ARCHITECTURE; -- (1076-1993 Version) Estrutura mínima de uma descrição comportamental Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Arquitetura (ARCHITECTURE) Exemplo ARCHITECTURE behavior OF mux_2x1 IS BEGIN PROCESS(a,b,sel) BEGIN IF (sel='0') THEN s <= a; ELSE s <= b; END IF; END PROCESS; END behavior; Processo explícito Declarações seqüenciais Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Arquitetura (ARCHITECTURE) ARCHITECTURE <identifier> OF <entity_identifier> IS -- Signal Declarations -- Constant Declarations -- Type Declarations -- Component Declarations -- Subtype Declarations -- Attribute Declarations -- Attribute Specifications -- Subprogram Declarations -- Subprogram Body BEGIN -- Process Statements -- Concurrent Procedural Calls -- Concurrent Signal Assignment -- Component Instantiation Statements -- Generate Statements END <identifier> ; --(1076-1987 Version) END ARCHITECTURE; -- (1076-1993 Version) Estrutura genérica Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Configuração (CONFIGURATION) Usada para fazer associações em modelos Associar uma entidade a um arquitetura Associar um componente a um par entidade-arquitetura Largamente usada em ambientes de simulação Facilita a exploração do espaço de projeto Uso limitado em ambientes de síntese (nem sempre suportada) CONFIGURATION <identifier> OF <entity_name> IS FOR <architecture_name> END FOR; END; -- (1076-1987 version) END CONFIGURATION; -- (1076-1993 version) Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Configuração (CONFIGURATION) Exemplos CONFIGURATION config OF mux_2x1 IS FOR structural END FOR; END; CONFIGURATION config OF mux_2x1 IS FOR behavior END FOR; END; Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Exemplo de modelo ENTITY mux_2x1 IS PORT (a, b : IN BIT; -- data inputs sel : IN BIT; -- selector s : OUT BIT); -- data output END mux_2x1; ------------------------------------- ARCHITECTURE structural OF mux_2x1 IS BEGIN s <= (a AND NOT sel) OR (b AND sel); END structural; ------------------------------------- ARCHITECTURE behavior OF mux_2x1 IS BEGIN PROCESS(a,b,sel) BEGIN IF (sel='0') THEN s <= a; ELSE s <= b; END IF; END PROCESS; END behavior; ------------------------------------- CONFIGURATION config OF mux_2x1 IS FOR behavior END FOR; END; Este modelo possui duas arquiteturas Estrutural Comportamental A configuração seleciona a arquitetura a ser usada Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Exemplo de modelo ENTITY mux_2x1 IS PORT (a, b : IN BIT; -- data inputs sel : IN BIT; -- selector s : OUT BIT); -- data output END mux_2x1; ------------------------------------- ARCHITECTURE structural OF mux_2x1 IS BEGIN s <= (a AND NOT sel) OR (b AND sel); END structural; ------------------------------------- ARCHITECTURE behavior OF mux_2x1 IS BEGIN PROCESS(a,b,sel) BEGIN IF (sel='0') THEN s <= a; ELSE s <= b; END IF; END PROCESS; END behavior; ------------------------------------- CONFIGURATION config OF mux_2x1 IS FOR behavior END FOR; END; Este modelo possui duas arquiteturas Estrutural Comportamental A configuração seleciona a arquitetura a ser usada Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 mux_2x1.vhd Alternativas de modelagem: em um único arquivo ou em múltiplos arquivos ENTITY mux_2x1 IS PORT (a, b : IN BIT; -- data inputs sel : IN BIT; -- selector s : OUT BIT); -- data output END mux_2x1; ------------------------------------- ARCHITECTURE structural OF mux_2x1 IS BEGIN s <= (a AND NOT sel) OR (b AND sel); END structural; ------------------------------------- ARCHITECTURE behavior OF mux_2x1 IS BEGIN PROCESS(a,b,sel) BEGIN IF (sel='0') THEN s <= a; ELSE s <= b; END IF; END PROCESS; END behavior; ------------------------------------- CONFIGURATION config OF mux_2x1 IS FOR behavior END FOR; END; mux_2x1_entity.vhd ENTITY mux_2x1 IS PORT (a, b : IN BIT; -- data inputs sel : IN BIT; -- selector s : OUT BIT); -- data output END mux_2x1; mux_2x1_arch_behavior.vhd ARCHITECTURE behavior OF mux_2x1 IS BEGIN PROCESS(a,b,sel) BEGIN IF (sel='0') THEN s <= a; ELSE s <= b; END IF; END PROCESS; END behavior; mux_2x1_arch_structural.vhd ARCHITECTURE structural OF mux_2x1 IS BEGIN s <= (a AND NOT sel) OR (b AND sel); END structural; mux_2x1_config.vhd CONFIGURATION config OF mux_2x1 IS FOR behavior END FOR; END; ou Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Alternativas de modelagem: em um único arquivo ou em múltiplos arquivos ou Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Componente (COMPONENT) Um modelo VHDL pode ser implementado de forma hierárquica, utilizando instâncias de componentes baseados em outros modelos VHDL Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Componente (COMPONENT) Declaração do componente COMPONENT <identifier> IS PORT ( <signal_name> : <mode> <type>; ... <signal_name> : <mode> <type>); END COMPONENT; Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Componente (COMPONENT) Declaração do componente x declaração de entidade COMPONENT <identifier> IS PORT ( <signal_name> : <mode> <type>; ... <signal_name> : <mode> <type>); END COMPONENT; ENTITY <identifier> IS PORT ( <signal_name> : <mode> <type>; ... <signal_name> : <mode> <type>); END <identifier>; Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Componente (COMPONENT) Instanciação do componente Mapeamento dos ports da instância do componente com os sinais do modelo de nível mais alto Mapeamento posicional (feito na ordem exata da declaração) Mapeamento nomeado (pode ser feito em qualquer ordem) <label> : <component_identifier> PORT MAP(<signal_name>,..., <signal_name>); <label> : <component_identifier> PORT MAP(<component_signal_name> => <signal_name>, ... <component_signal_name> => <signal_name>); Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Componente (COMPONENT) Onde declarar e instanciar o componente? Na arquitetura do modelo ARCHITECTURE <identifier> OF <entity_identifier> IS -- ... -- Component Declarations -- ... BEGIN -- ... -- Component Instantiation Statements -- ... END <identifier> ; --(1076-1987 Version) END ARCHITECTURE; -- (1076-1993 Version) Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Exemplo: Circuito com dois mux_2x1 (mux_2x1_duo) s0 a0 b0 sel 0 1 s1 a1 b1 0 1 ENTITY mux_2x1_duo IS PORT (SIGNAL a0, b0 : IN BIT; -- data inputs SIGNAL a1, b1 : IN BIT; -- data inputs SIGNAL sel : IN BIT; -- selector SIGNAL s0, s1 : OUT BIT); -- data output END mux_2x1_duo; ARCHITECTURE structural OF mux_2x1_duo IS -- Component declaration COMPONENT mux_2x1 PORT (SIGNAL a, b : IN BIT; -- data inputs SIGNAL sel : IN BIT; -- selector SIGNAL s : OUT BIT); -- data output END COMPONENT; BEGIN -- Component instantiation u0 : mux_2x1 PORT MAP (a0, b0, sel, s0); u1 : mux_2x1 PORT MAP (sel => sel, a => a1, b => b1, s => s1); END structural; Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Resumo Um modelo VHDL é formado por Entidade (ENTITY): interface Arquitetura (ARCHITECTURE): corpo do modelo A arquitetura pode ser modelada de forma Estrutural: “O que o circuito é” Comportamental: “O que o circuito faz” Híbrida (estrutural + comportamental) Um modelo pode ter múltiplas arquiteturas (selecionadas pela configuração) Um modelo pode ser implementado usando instâncias de outros modelos (componentes) Pacotes e Bibliotecas Pacotes Bibliotecas Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Pacote (PACKAGE) É uma forma conveniente para armazenar e usar informações ao longo de um modelo completo (tipicamente com múltiplas entidades) Um pacote consiste de: Declaração do pacote Declaração de tipos Declaração de subprogramas Corpo do pacote (opcional) Definição de subprogramas (se declarados) VHDL possui dois pacotes implícitos (built in) Standard Textio Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Pacote (PACKAGE) PACKAGE <identifier> IS -- Constant Declarations -- Type Declarations -- Signal Declarations -- Subprogram Declarations -- Component Declarations END <identifier>; -- (1076-1987) END PACKAGE <identifier>; -- (1076-1993) PACKAGE BODY <identifier> IS -- Constant Declarations -- Type Declarations -- Subprogram Body END <package_name>; -- (1076-1987) END PACKAGE BODY <package_name>; -- (1076-1993) Estrutura genérica Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Exemplo: Pacote com a declaração do componente mux_2x1 PACKAGE my_package IS -- Component declaration COMPONENT mux_2x1 PORT (SIGNAL a, b : IN BIT; -- data inputs SIGNAL sel : IN BIT; -- selector SIGNAL s : OUT BIT); -- data output END COMPONENT; END my_package; -- There is no package body Declaração do componente Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Bibliotecas Contém um ou mais pacotes Bibliotecas de recursos Pacotes padrão Pacotes IEEE Pacotes específicos da ferramenta EDA (ex. pacotes Altera) Qualquer biblioteca de unidades de projeto que são referenciadas em um projeto Biblioteca de trabalho (WORK) Biblioteca na qual a unidade de projeto corrente está sendo compilada Bibliotecas implícitas: WORK e STD Não precisam ser referenciadas Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Referenciando uma biblioteca ou um pacote Bibliotecas implícitas: WORK e STD Cláusula LIBRARY Define um nome simbólico da biblioteca referenciada, o qual aponta para um caminho de diretórios LIBRARY <identifier>; Cláusula USE Especifica o pacote e o objeto a serem utilizados da biblioteca A palavra reservada ALL permite referenciar todos os objetos do pacote USE <lib_id>.<package_id>.<object_id>; USE <lib_id>.<package_id>.ALL; Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Exemplo: Modelagem o mux_2x1_duo com o mux_2x1 declarado no pacote my_package LIBRARY WORK; USE WORK.my_package.ALL; ENTITY mux_2x1_duo IS PORT (SIGNAL a0, b0 : IN BIT; -- data inputs SIGNAL a1, b1 : IN BIT; -- data inputs SIGNAL sel : IN BIT; -- selector SIGNAL s0, s1 : OUT BIT); -- data output END mux_2x1_duo; ARCHITECTURE structural OF mux_2x1_duo IS BEGIN u0 : mux_2x1 PORT MAP(a0, b0, sel, s0); u1 : mux_2x1 PORT MAP(a1, b1, sel, s1); END structural; Instâncias do componente Referência à biblioteca WORK (opcional) Referência ao pacote my_package Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Biblioteca STD Contém os seguintes pacotes STANDARD Suporta os tipos: BIT, BOOLEAN, INTEGER, REAL e TIME) Funções de operadores para os tipos suportados TEXTIO Suporte a operações com arquivos É uma biblioteca implícita e não precisa ser referenciada Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Biblioteca STD Tipos de dados escalares do pacote STANDARD No tipo INTEGER é conveniente limitar a faixa de representação para economizar recursos. Ex: SIGNAL int_8bit : INTEGER RANGE 0 TO 255; Classe Tipo Valores Exemplo Enumerado BIT Um e zero 1, 0 BOOLEAN Verdadeiro e falso TRUE, FALSE CHARACTER Caracteres ASCII a, b, c,..., A, B, C Numérico INTEGER -231 x 231-1 19, 8#57#, 16#A2#, 2#11# REAL -3.65x1047 x +3.65x1047 2.63, 1.75E+2, 16#8.C# Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Biblioteca STD Tipos de dados compostos do pacote STANDARD Na declaração de um tipo composto, seus limites são definidos por TO e DOWNTO Exemplos CONSTANT X: BIT_VECTOR(0 TO 3) := "1011" CONSTANT X: BIT_VECTOR(3 DOWNTO 0) := "1101" Classe Tipo Valores Exemplo Vetor BIT_VECTOR Tipo BIT “1110”, B”11_10”, O”32”, X”A2” STRING Tipo CHARACTER “teste”, “oi mundo” bit 0 Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Biblioteca IEEE Contém os seguintes pacotes STD_LOGIC_1164 Descreve os tipos STD_LOGIC e STD_LOGIC_VECTOR e funções relacionadas STD_LOGIC_ARITH Descreve os tipos SIGNED e UNSIGNED, funções de conversão, aritméticas e relacionais STD_LOGIC_SIGNED e STD_LOGIC_UNSIGNED Fazem referência aos pacotes NUMERIC_BIT e NUMERIC_STD os quais descrevem funções que permitem à ferramenta de síntese usar os tipos BIT_VECTOR e STD_LOGIC_VECTOR para sintetizar os tipos SIGNED e UNSIGNED Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Biblioteca IEEE Tipos de dados do pacote STD_LOGIC_1164 STD_LOGIC 9 valores lógicos (‘U’, ‘X’, ‘0’, ‘1’, ‘Z’, ‘W’, ‘L’, ‘H’, ‘-’) Possui funções de resolução associadas para a modelagem de múltiplos drivers acionando o mesmo sinal (ex. barramento) STD_LOGIC_VECTOR Vetor de elementos STD_LOGIC STD_ULOGIC Não possui funções de resolução STD_ULOGIC_VECTOR Vetor de elementos STD_ULOGIC Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Biblioteca IEEE Funções disponíveis no pacote STD_LOGIC_1164 Operadores lógicos and, or, nand, nor, xor, xnor, not Funções de conversão entre BIT, STD_LOGIC e STD_ULOGIC To_bit, To_bitvector, To_StdLogicVector, e outras Funções de detecção de borda de subida rising_edge e falling_edge Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Biblioteca IEEE Tipos de dados do pacote STD_LOGIC_UNSIGNED UNSIGNED Número inteiro sem sinal Composto por elementos do tipo STD_LOGIC (ou BIT) Os elementos mais significativos são posicionados à esquerda Tipos de dados do pacote STD_LOGIC_SIGNED SIGNED Número inteiro com sinal Representação em complemento de dois O bit mais à esquerda é o bit de sinal Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Biblioteca IEEE Funções disponíveis nos pacotes STD_LOGIC_SIGNED e STD_LOGIC_SIGNED Tipo do operador Nome do operador (função) Lógico and, or, nand, nor, xor, xnor Relacional =, /=, <, <=, >, >= Adição e subtração +, – Concatenação & Multiplicação e divisão *, /, mod, rem Sinalização – Miscelânea **, abs e not Deslocamento shift_right, shift_left, srl, sll Rotação rotate_right,rotate_left, ror, rol Conversão to_integer, to_unsigned, to_signed ... ... Sinais e Variáveis Sinais Processos implícitos Processos explícitos Variáveis Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Sinais Representam interconexão física (fio) que realizam a comunicação de informações entre os processos Declaração Declarados na entidade, na arquitetura ou em um pacote ENTIDADE ARQUITETURA Processo A Processo B sinal sinal sinal sinal SIGNAL <signal_name>: <type>; Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Atribuindo valores a sinais (processos implícitos) A atribuição é feita usando <= Uma atribuição a um sinal possui um processo implícito associado <signal_name> <= <expression>; a b c d ENTIDADE ARQUITETURA c <= a and b; d <= not c; Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Atribuindo valores a sinais Exemplo Atribuindo valor a todos os bits (usar aspas duplas) temp <= “10101010”; temp <= X“AA”; Atribuindo valor a um único bit (usar aspas simples) temp(7) <= ‘1’; Atribuindo valor a um grupo de bits temp (7 downto 4)<= “1010”; SIGNAL temp : STD_LOGIC_VECTOR (7 DOWNTO 0); Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Tipos de atribuição a sinais concorrentes Exemplo: mux_2x1 Atribuição simples Atribuição condicional Atribuição selecionada s <= (a AND NOT sel) OR (b AND sel); s <= a WHEN sel=‘0’ ELSE b; WITH sel SELECT s <= a WHEN ‘0’ b WHEN OTHERS; No caso de sel ser do tipo STD_LOGIC, WHEN OTHERS garante um valor definido para s (ou seja b) quando sel possuir qualquer outro valor diferente de ‘0’ Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Processos explícitos Necessários na implementação de funções compostas por atribuição seqüenciais (ex. if-then-else) <process_label>: -- (optional) PROCESS (<sensitive_list>) -- Constant declarations -- Type declarations -- Variable declarations BEGIN -- Signal Assignment Statement (optional) -- Variable Assignment Statement (optional) -- Procedure Call Statement (optional) -- If Statement (optional) -- Case Statement (optional) -- Loop Statement (optional) END PROCESS <process_label>; Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Processos explícitos Um processo é executado infinitamente se não for quebrado por uma declaração WAIT ou por uma lista de sensibilidade Uma lista de sensibilidade infere uma declaração WAIT no final do processo Um processo pode ter múltiplos WAIT, mas não pode ter um WAIT e uma lista de sensibilidade As atribuições a sinais em um processo são efetivadas ao término da sua execução ARCHITECTURE behavior OF mux_2x1 IS BEGIN PROCESS(a,b,sel) BEGIN IF (sel='0') THEN s <= a; ELSE s <= b; END IF; END PROCESS; END behavior; ARCHITECTURE behavior OF mux_2x1 IS BEGIN PROCESS BEGIN IF (sel='0') THEN s <= a; ELSE s <= b; END IF; WAIT(a,b,sel); END PROCESS; END behavior; Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Variáveis Declaradas dentro de processos e constituem-se em objetos de armazenamento temporário Declaração A atribuição é feita usando “:=” São atualizadas no momento da atribuição (não ao término do processo, como os sinais) <variable_name> := <expression>; VARIABLE <variable_name>: <type>; Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Atribuindo valores a variáveis Exemplo ARCHITECTURE behavior OF mux_2x1 IS VARIABLE temp := BIT; BEGIN PROCESS(a,b,sel) BEGIN IF (sel='0') THEN temp := a; ELSE temp := b; END IF; s <= temp; END PROCESS; END behavior; Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Sinais x Variáveis Sinal Variável Atribuição <= := Utilidade Representa um fio no circuito Representa um local de armazenamento temp. Escopo Global (comunicação entre processos) Local (dentro do processo) Comportamento Atualizado no final do processo Atualizada imediatamente Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Atribuindo valores a variáveis Exemplo Atribuindo valor a todos os bits (usar aspas duplas) temp := “10101010”; temp := X“AA”; Atribuindo valor a um único bit (usar aspas simples) temp(7) := ‘1’; Atribuindo valor a um grupo de bits temp (7 downto 4):= “1010”; VARIABLE temp : STD_LOGIC_VECTOR (7 DOWNTO 0); Modelagem de Circuitos Combinacionais em VHDL Definição Multiplexadores Somadores Comparadores Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Circuitos Combinacionais São aqueles cujas saídas dependem exclusivamente do estado atual das entradas Exemplos: Codificadores e decodificadores Multiplexadores e demultiplexadores Somadores e subtratores Unidade Aritmética e Lógica Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Multiplexador 2-para-1 com canais de W bits (mux_2x1_Wbits) s(W-1..0) a (W-1..0) b (W-1..0) sel 0 1 s(0) a(0) b(0) sel 0 1 s(w-1) a(w-1) b(w-1) 0 1 Associação em paralelo de mux_2x1 Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Modelando o mux_2x1_Wbits – Entidade ENTITY mux_2x1_Wbits IS GENERIC (W : NATURAL := 16); PORT (a, b : IN BIT_VECTOR (W-1 DOWNTO 0); -- data inputs sel : IN BIT; -- selector s : OUT BIT_VECTOR (W-1 DOWNTO 0)); -- data output END mux_2x1_Wbits; Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Modelando o mux_2x1_Wbits – Arq. Estrutural ARCHITECTURE structural OF mux_2x1_Wbits IS BEGIN f0: FOR i IN (W-1) DOWNTO 0 GENERATE s(i) <= (a(i) AND NOT sel) OR (b(i) AND sel); END GENERATE f0; END structural; __generate_label: FOR __index_variable IN __range GENERATE __statement; __statement; END GENERATE; FOR ... GENERATE Realiza a replicação concorrente Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Modelando o mux_2x1_Wbits – Arq. Estrutural ARCHITECTURE structural OF mux_2x1_Wbits IS BEGIN f0: FOR i IN 3 DOWNTO 0 GENERATE s(i) <= (a(i) AND NOT sel) OR (b(i) AND sel); END GENERATE f0; END structural; ARCHITECTURE structural OF mux_2x1_Wbits IS BEGIN s(3) <= (a(3)AND NOT sel) OR (b(3) AND sel); s(2) <= (a(2) AND NOT sel) OR (b(2) AND sel); s(1) <= (a(1) AND NOT sel) OR (b(1) AND sel); s(0) <= (a(0) AND NOT sel) OR (b(0) AND sel); END structural; = Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Modelando o mux_2x1_Wbits – Arq. Comportmental Igual à do mux_2x1 ARCHITECTURE behavior OF mux_2x1_Wbits IS BEGIN PROCESS(a,b,sel) BEGIN IF (sel='0') THEN s <= a; ELSE s <= b; END IF; END PROCESS; END behavior; ARCHITECTURE behavior OF mux_2x1 IS BEGIN PROCESS(a,b,sel) BEGIN IF (sel='0') THEN s <= a; ELSE s <= b; END IF; END PROCESS; END behavior; Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Multiplexador 4-para-1 com canais de 1 bit s0 a b sel(1..0) 0 1 c d 2 3 x a b Sel(0) 0 1 yc d 0 1 0 1 Sel(1) s Associação em série de mux_2x1 Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Modelando o mux_4x1 – Entidade Várias arquiteturas possíveis Baseada em equações lógicas Associação em série de mux_2x1 WHEN ... ELSE WITH ... SELECT IF-THEN-ELSE CASE ENTITY mux_4x1 IS PORT (a, b, c, d : IN BIT; -- data inputs sel : IN BIT_VECTOR(1 DOWNTO 0); -- selector s : OUT BIT); -- data output END mux_4x1; Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Modelando o mux_4x1 – Arquitetura 1 Baseada em equações lógicas ARCHITECTURE arch_1 OF mux_4x1 IS BEGIN s <= ((NOT sel(1)) AND (NOT sel(0)) AND a) OR ((NOT sel(1)) AND ( sel(0)) AND b) OR (( sel(1)) AND (NOT sel(0)) AND c) OR (( sel(1)) AND ( sel(0)) AND d); END arch_1; Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Modelando o mux_4x1 – Arquitetura 2 Associação em série de mux_2x1 ARCHITECTURE arch_2 OF mux_4x1 IS -- Component declaration COMPONENT mux_2x1 PORT (SIGNAL a, b : IN BIT; -- data inputs SIGNAL sel : IN BIT; -- selector SIGNAL s : OUT BIT); -- data output END COMPONENT; -- Signals declaration SIGNAL x,y : BIT; BEGIN -- Component instantiation u0 : mux_2x1 PORT MAP (a, b, sel(0), x); u1 : mux_2x1 PORT MAP (c, d, sel(0), y); u3 : mux_2x1 PORT MAP (x, y, sel(1), s); END arch_2; Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Modelando o mux_4x1 – Arquitetura 3 WHEN ... ELSE ARCHITECTURE arch_3 OF mux_4x1 IS BEGIN s <= a WHEN sel = "00" ELSE b WHEN sel = "01" ELSE c WHEN sel = "10" ELSE d ; END arch_3; Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Modelando o mux_4x1 – Arquitetura 4 WITH ... SELECT ARCHITECTURE arch_4 OF mux_4x1 IS BEGIN WITH sel SELECT s <= a WHEN "00", b WHEN "01", c WHEN "10", d WHEN OTHERS; END arch_4; Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Modelando o mux_4x1 – Arquitetura 5 IF-THEN-ELSE ARCHITECTURE arch_5 OF mux_4x1 IS BEGIN PROCESS(a,b,c,d,sel) BEGIN IF sel(1) = '0' THEN IF sel(0) = '0' THEN s <= a; ELSE s <= b; END IF; ELSE IF sel(0) = '0' THEN s <= c; ELSE s <= d; END IF; END IF; END PROCESS; END arch_5; Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Modelando o mux_4x1 – Arquitetura 6 CASE ARCHITECTURE arch_6 OF mux_4x1 IS BEGIN PROCESS(a,b,c,d,sel) BEGIN CASE sel IS WHEN "00" => s <= a; WHEN "01" => s <= b; WHEN "10" => s <= c; WHEN OTHERS => s <= d; END CASE; END PROCESS; END arch_6; Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Circuitos somadores Meio somador (half adder) – Arquitetura estrutural ENTITY half_adder IS PORT (a, b : IN BIT; -- data inputs s : OUT BIT; -- data output cout : OUT BIT); -- carry out END half_adder; -------------------------------------------------- ARCHITECTURE structural OF half_adder IS BEGIN s <= a XOR b; cout <= a AND b; END structural; Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Circuitos somadores RTL do meio somador (half adder) Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Circuitos somadores Somador completo (full adder) – Arquitetura estrutural ENTITY full_adder IS PORT (a, b : IN BIT; -- data inputs cin : IN BIT; -- carry in s : OUT BIT; -- data output cout : OUT BIT); -- carry out END full_adder; -------------------------------------------------- ARCHITECTURE structural OF full_adder IS BEGIN s <= a XOR b XOR cin; cout <= (a AND b) OR (a AND cin) OR (b AND cin); END structural; Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Circuitos somadores RTL do somador completo (full adder) Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Circuitos somadores Somador ripple carry de W bits – Entidade ENTITY adder_Wbits IS GENERIC(W : NATURAL := 4); PORT (a, b : IN BIT_VECTOR(W-1 DOWNTO 0); -- data inputs cin : IN BIT; -- carry in s : OUT BIT_VECTOR(W-1 DOWNTO 0); -- data output cout : OUT BIT); -- carry out END adder_wbits; Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Circuitos somadores Somador ripple carry de W bits – Arq. Estrutural 1 ARCHITECTURE arch_1 OF adder_Wbits IS -- Signals declaration SIGNAL carry : BIT_VECTOR(W DOWNTO 0); -- internal carry in BEGIN carry(0) <= cin; f0: FOR i IN (W-1) DOWNTO 0 GENERATE s(i) <= a(i) XOR b(i) XOR carry(i); carry(i+1) <= (a(i) AND b(i)) OR (a(i) AND carry(i)) OR (b(i) AND carry(i)); END GENERATE f0; cout <= carry(W); END arch_1; Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Circuitos somadores Somador ripple carry de W bits – Arq. Estrutural 2 ARCHITECTURE arch_2 OF adder_Wbits IS -- Component declaration COMPONENT full_adder IS PORT (a, b : IN BIT; -- data inputs cin : IN BIT; -- carry in s : OUT BIT; -- data output cout : OUT BIT); -- carry out END COMPONENT; -- Signals declaration SIGNAL carry : BIT_VECTOR(W DOWNTO 0); -- internal carry in BEGIN carry(0) <= cin; f0: FOR i IN (W-1) DOWNTO 0 GENERATE u: full_adder PORT MAP(a(i), b(i),carry(i),s(i),carry(i+1)); END GENERATE f0; cout <= carry(W); END arch_2; Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Circuitos somadores RTL do somador ripple carry com W = 4bis Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Circuitos somadores Utilizando o operador “+” do pacote std_logic_unsigned LIBRARY IEEE; USE IEEE.std_logic_1164.ALL; USE IEEE.std_logic_unsigned.ALL; ENTITY adder_unsigned_Wbits IS GENERIC(W : NATURAL := 4); PORT (a, b : IN STD_LOGIC_VECTOR(W-1 DOWNTO 0); -- data inputs s : OUT STD_LOGIC_VECTOR(W-1 DOWNTO 0)); -- data output END adder_unsigned_Wbits; ------------------------------------------------------------------ ARCHITECTURE behavior OF adder_unsigned_Wbits IS BEGIN s <= a + b; END behavior; Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Circuitos somadores Utilizando o operador “+” do pacote std_logic_unsigned LIBRARY IEEE; USE IEEE.std_logic_1164.ALL; USE IEEE.std_logic_unsigned.ALL; ENTITY adder_unsigned_Wbits_carried IS GENERIC(W : NATURAL := 4); PORT (a, b : IN STD_LOGIC_VECTOR(W-1 DOWNTO 0); -- data inputs s : OUT STD_LOGIC_VECTOR(W-1 DOWNTO 0); -- data output cout : OUT STD_LOGIC); -- carry out END adder_unsigned_Wbits_carried; ------------------------------------------------------------------- ARCHITECTUREbehavior OF adder_unsigned_Wbits_carried IS SIGNAL result : STD_LOGIC_VECTOR(W DOWNTO 0); BEGIN result <= ('0'& a) + ('0' & b); s <= result(W-1 DOWNTO 0); cout <= result(W); END behavior; Inclui carry de saída Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Circuito comparador LIBRARY IEEE; USE IEEE.std_logic_1164.ALL; USE IEEE.std_logic_unsigned.ALL; ENTITY comparator_Wbits IS GENERIC(W : NATURAL := 4); PORT (a, b : IN STD_LOGIC_VECTOR(W-1 DOWNTO 0); -- data inputs eq : OUT STD_LOGIC; -- a = b gt : OUT STD_LOGIC; -- a > b lt : OUT STD_LOGIC); -- a < b END comparator_Wbits; ------------------------------------------------------------------ ARCHITECTURE behavior OF comparator_Wbits IS BEGIN lt <= '1' WHEN (a < b) ELSE '0'; eq <= '1' WHEN (a = b) ELSE '0'; gt <= '1' WHEN (a > b) ELSE '0'; END behavior; Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Circuito comparador Números de 4 bits sem sinal [0,15] Números de 4 bits com sinal [-8, 7] Modelagem de Circuitos Seqüencias em VHDL Blocos construtivos básicos Inferência de flip-flops Registradores Contadores Máquinas de Estado Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Circuitos Seqüenciais São aqueles cujas saídas dependem do estado atual e passado das entradas Exemplos: Registradores Contadores Máquinas de Estado Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Arquitetura genérica de um circuito seqüencial Registrador de Estado Circuito Combinacional Entradas Saídas Próximo Estado Estado Atual Função de Transição de Estado Função de Saída Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Blocos construtivos básicos Latches Flip-flops D Q ENA D Q Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Latch transparente ENTITY latch_d IS PORT (d : IN BIT; -- data input ena : IN BIT; -- enable q : OUT BIT); -- data output END latch_d; --------------------------------------- ARCHITECTURE behavior OF latch_d IS BEGIN PROCESS(d,ena) BEGIN IF (ena = '1') THEN Q <= D; END IF; END PROCESS; END behavior; D Q ENA Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Latch com clear ENTITY latch_d_clear IS PORT (d : IN BIT; -- data input ena : IN BIT; -- enable clrn: IN BIT; -- clear q : OUT BIT); -- data output END latch_d_clear; ----------------------------------------- ARCHITECTURE behavior OF latch_d_clear IS BEGIN PROCESS(d,ena,clrn) BEGIN IF (clrn = '0') THEN Q <= '0'; ELSIF (ena = '1') THEN Q <= D; END IF; END PROCESS; END behavior; D Q ENA CLRN Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Flip-flop D (gatilhado pela borda de subida do clock) D Q ENTITY ff_d IS PORT (d : IN BIT; -- data input clk : IN BIT; -- clock q : OUT BIT); -- data output END ff_d; --------------------------------------- ARCHITECTURE arch_1 OF ff_d IS BEGIN PROCESS BEGIN WAIT UNTIL clk='1'; Q <= D; END PROCESS; END arch_1; Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Flip-flop D (gatilhado pela borda de subida do clock) D Q ENTITY ff_d IS PORT (d : IN BIT; -- data input clk : IN BIT; -- clock q : OUT BIT); -- data output END ff_d; --------------------------------------- ARCHITECTURE arch_2 OF ff_d IS BEGIN PROCESS(clk) BEGIN IF (clk'EVENT AND clk='1') THEN Q <= D; END IF; END PROCESS; END arch_2; Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Flip-flop D D Q LIBRARY IEEE; USE IEEE.std_logic_1164.ALL; ENTITY ff_d_std_logic IS PORT (d : IN STD_LOGIC; -- data input clk : IN STD_LOGIC; -- clock q : OUT STD_LOGIC); -- data output END ff_d_std_logic; --------------------------------------------- ARCHITECTURE arch_1 OF ff_d_std_logic IS BEGIN PROCESS(clk) BEGIN IF rising_edge(clk) THEN Q <= D; END IF; END PROCESS; END arch_1; Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Flip-flop D com clear ENTITY ff_d_clear IS PORT (d : IN BIT; -- data input clk : IN BIT; -- clock clrn: IN BIT; -- clear q : OUT BIT); -- data output END ff_d_clear; --------------------------------------- ARCHITECTURE arch_1 OF ff_d_clear IS BEGIN PROCESS(clk,clrn) BEGIN IF (clrn='0') THEN Q <= '0'; ELSIF (clk'EVENT AND clk='1') THEN Q <= D; END IF; END PROCESS; END arch_1; D Q CLRN Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Flip-flop D com clear e enable ENTITY ff_d_clear_ena IS PORT (d : IN BIT; -- data input clk : IN BIT; -- clock clrn: IN BIT; -- clear ena : IN BIT; -- enable q : OUT BIT); -- data output END ff_d_clear_ena; ---------------------------------------- ARCHITECTURE arch_1 OF ff_d_clear_ena IS BEGIN PROCESS(clk,clrn) BEGIN IF (clrn='0') THEN Q <= '0'; ELSIF (clk'EVENT AND clk='1') THEN IF (ena='1') THEN Q <= D; END IF; END IF; END PROCESS; END arch_1; D Q CLRN ENA Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Inferência de flip-flops Quando flip-flops serão inferidos para reg1.vhd? ENTITY reg1 IS PORT ( d : IN BIT; clk : IN BIT; q : OUT BIT); END reg1; ------------------------------------ ARCHITECTURE arch_1 OF reg1 IS SIGNAL a, b : BIT; BEGIN PROCESS(clk) BEGIN IF (clk'EVENT AND clk='1') THEN a <= d; b <= a; q <= b; END IF; END PROCESS; END arch_1; Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Inferência de flip-flops Quando flip-flops serão inferidos reg1.vhd? D Q D QD Q clk d a b q Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Inferência de flip-flops Quando flip-flops serão inferidos para reg2.vhd? ENTITY reg2 IS PORT ( d : IN BIT; clk : IN BIT; q : OUT BIT); END reg1; ------------------------------------ ARCHITECTURE arch_1 OF reg2 IS SIGNAL a, b : BIT; BEGIN PROCESS(clk) BEGIN IF (clk'EVENT AND clk='1') THEN a <= d; b <= a; END IF; END PROCESS; q <= b; END arch_1; Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Inferência de flip-flops Quando flip-flops serão inferidos reg1.vhd? D QD Q clk d a b q = b Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Inferência de flip-flops Quando flip-flops serão inferidos para reg3.vhd? ENTITY reg3 IS PORT ( d : IN BIT; clk : IN BIT; q : OUT BIT); END reg1; ------------------------------------ ARCHITECTURE arch_1 OF reg3 IS BEGIN PROCESS(clk) VARIABLE a, b : BIT; BEGIN IF (clk'EVENT AND clk='1') THEN a := d; b := a; q <= b; END IF; END PROCESS; END arch_1; Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Inferência de flip-flops Quando flip-flops serão inferidos reg3.vhd? D Q clk d q Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Registradores Registrador Paralelo-Paralelo de W bits D Q CLRN ENA D Q CLRN ENA D Q CLRN ENA ena clk clrn d(W-1) d(1) d(0) q(0)q(1)q(W-1) Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Registradores Registrador Paralelo-Paralelo de W bits ENTITY reg_pp_Wbits IS GENERIC(W : NATURAL := 4); PORT (d : IN BIT_VECTOR(W-1 DOWNTO 0);-- data input clk : IN BIT; -- clock clrn: IN BIT; -- clear ena : IN BIT; -- enableq : OUT BIT_VECTOR(W-1 DOWNTO 0));-- data output END reg_pp_Wbits; ARCHITECTURE arch_1 OF reg_pp_Wbits IS BEGIN PROCESS(clk,clrn) BEGIN IF (clrn='0') THEN q <= (OTHERS => '0'); ELSIF (clk'EVENT AND clk='1') THEN IF (ena='1') THEN q <= d; END IF; END IF; END PROCESS; END arch_1; Igual ao flip-flop tipo D com clear e enable Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Registradores Registrador Paralelo-Paralelo de W bits Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Contadores Incrementador de W bits Aplicação típica: Program Counter (PC) CLRN Ena Load Qf 0 X X 0 1 0 X Qa 1 1 D 0 Qa+1 D(W-1..0) CLRN ENA Q(W-1..0) LOAD CLRN é assíncrono Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Contadores Incrementador de W bits – Entidade LIBRARY IEEE; USE IEEE.std_logic_1164.ALL; USE IEEE.std_logic_unsigned.ALL; ENTITY counter_Wbits IS GENERIC(W : NATURAL := 4); PORT (d : IN STD_LOGIC_VECTOR(W-1 DOWNTO 0);-- data input clk : IN BIT; -- clock clrn: IN BIT; -- clear ena : IN BIT; -- enable load: IN BIT; -- load q : BUFFER STD_LOGIC_VECTOR(W-1 DOWNTO 0));-- data output END counter_Wbits; Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Contadores Incrementador de W bits – Arquitetura ARCHITECTURE arch_1 OF counter_Wbits IS BEGIN PROCESS(clk,clrn) BEGIN IF (clrn='0') THEN q <= (OTHERS => '0'); ELSIF (clk'EVENT AND clk='1') THEN IF (ena='1') THEN IF (load='1') THEN q <= d; ELSE q <= q+1; END IF; END IF; END IF; END PROCESS; END arch_1; Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Contadores Incrementador de W bits Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Máquinas de Estado Máquina de Moore mínima S0 0 S1 1 go /go back /back Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Máquinas de Estado Máquina de Moore mínima – Entidade e Arquitetura ENTITY fsm_go_back IS PORT (clk : IN BIT; -- clock clrn: IN BIT; -- clear go : IN BIT; -- input 1 back: IN BIT; -- input 2 q : OUT BIT); -- output END fsm_go_back; ARCHITECTURE arch_1 OF fsm_go_back IS TYPE state_type IS (s0, s1); SIGNAL state_reg : state_type; SIGNAL next_state: state_type; BEGIN -- next slides END arch_1; Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Máquinas de Estado Máquina de Moore mínima – Registrador de estado p_state_reg: PROCESS(clk,clrn) BEGIN IF (clrn='0') THEN state_reg <= s0; ELSIF (clk'EVENT AND clk='1') THEN state_reg <= next_state; END IF; END PROCESS; Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Máquinas de Estado Máquina de Moore mínima – Função de transição de estado p_next_state: PROCESS(state_reg) BEGIN CASE (state_reg) IS WHEN s0 => IF (go='1') THEN next_state <= s1; ELSE next_state <= s0; END IF; WHEN s1 => IF (back='1') THEN next_state <= s0; ELSE next_state <= s1; END IF; WHEN OTHERS=> next_state <= s0; END CASE; END PROCESS; Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Máquinas de Estado Máquina de Moore mínima – Função de saída -- Output q <= '1' WHEN (state_reg = s1) ELSE '0'; Considerações Finais Projeto a partir de VHDL Thiago Felski Pereira, UNISUL/2014 Para saber mais Referência D’AMORE, Roberto. VHDL: descrição e síntese de circuitos digitais. Rio de Janeiro: LTC, 2012 (na Saraiva por R$ 142,00) Muitos outros livros internacionais (mais caro$) Repositório The Hamburg VHDL Archive http://tams-www.informatik.uni-hamburg.de/vhdl/ Livros e tutoriais gratuitos Artigos Modelos (8051, DLX, Leon, ...) Ferramentas (Compiladores, Editores, Visualizadores)
Compartilhar