Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas

VHDL - INTRODUÇÃO, Notas de estudo de Administração Empresarial

Introdução ao VHDL e FPGA. Principais características dos circuitos combinacionais e utilização do software ISE da Xilinx. Material da Universidade de Caxias do Sul.

Tipologia: Notas de estudo

2011

Compartilhado em 21/09/2011

daniel-agnoletto-1
daniel-agnoletto-1 🇧🇷

4.3

(4)

18 documentos

Pré-visualização parcial do texto

Baixe VHDL - INTRODUÇÃO e outras Notas de estudo em PDF para Administração Empresarial, somente na Docsity! Introdução ao VHDL O que é VHDL? VHDL ou VHSIC Hardware Description Language é uma linguagem desenvolvida pela DARPA (agência de pesquisa em projetos de defesa norte-americanos), especificamente para a descrição de circuitos digitais, originalmente focando circuitos VHSIC ou Very High Speed Integrated Circuits. O propósito original do VHDL, como o próprio nome da linguagem diz, era descrever circuitos digitais, dessa forma servindo como uma fonte de documentação do funcionamento dos mesmos. Em seguida a idéia de simular os circuitos descritos nessa linguagem tornou-se bastante óbvia, com o que os primeiros simuladores surgiram no mercado, seguidos por ferramentas capazes também de sintetizar um circuito digital a partir da descrição fornecida pela linguagem (com limitações que iremos estudar aos poucos). Hoje existem ferramentas não somente capazes de sintetizar o código VHDL, mas igualmente capazes de sintetizar o mesmo otimizando determinados aspectos, tais como área em circuito, consumo de energia, etc. A sintaxe do VHDL é herdada da linguagem ADA (e, por sua vez, do PASCAL). O VHDL é essencialmente uma linguagem com descrições de operações executadas em paralelo (exceto em blocos especiais onde se pode garantir o sequenciamento das instruções). As duas principais versões em uso do VHDL são o VHDL87 (padrão IEEE 1076-1998) e o VHDL93 (padrão IEEE 1076-1993). Existem versões posteriores do VHDL, sendo a última a versão proposta e em análise pelo IEEE em 2008. Além dessas versões, existem diversos padrões derivados do VHDL que podem ser usados em conjunto com a linguagem de forma a expandir suas capacidades iniciais. Talvez a alternativa mais conhecida do VHDL seja o Verilog. Ainda assim, é interessante notar que existem diversas outras opções surgindo na atualidade, sendo uma delas a System C. Além disso, diversas ferramentas de alto nível, a exemplo do Matlab e do LabView, já permitem a conversão de alguns recursos para VHDL, o que permitiria a posterior síntese do mesmos. Vocabulário básico VHDL • Entidade (Entity): todo o desenvolvimento se dá em torno de entidades. A entidade é o bloco básico de construção do VHDL. Todo o projeto possui uma entidade top-level, ou seja, aquela que é a entidade principal do sistema. Uma entidade pode agregar dentro de si outras entidades através do mecanismo de componentes. De forma simplificada, podemos imaginar uma entidade como o “encapsulamento” de um dado circuito digital. Para exemplificar, quando utilizamos um circuito 7400, por exemplo, sabemos que é possível utilizar o mesmo da seguinte maneira: Ou seja, temos a visão de como o circuito se conecta com o mundo exterior. Fundamentalmente, esse é o papel de uma entidade VHDL. Definir como o circuito digital irá se comunicar com outros blocos do sistema. Ou seja, em VHDL, essencialmente, a maior parte dos projetos consistirá na interconexão de várias entidades de menor porte, a fim de construir a solução de um problema mais complexo. • Portas (Port): uma porta em VHDL é um sinal declarado dentro da entidade. Não confunda com o termo “porta” lógica. A porta, em VHDL, está associada com o conceito de pino de um circuito integrado. • Arquitetura (Architecture): todas as entidades demandam uma arquitetura, a qual descreve o papel ou funcionamento da entidade associada. Uma entidade pode possuir mais de uma arquitetura associada. Ou seja, através da arquitetura, descrevemos precisamente como os pinos/portas da entidade serão utilizados, em conjunto ou não com outros blocos, para realizar uma determinada função. • Sinal (Signal): um sinal possui um papel similar ao de uma variável dentro do código em VHDL, porém ele tem uma utilização e impactos completamente distintos. Um sinal pode ser visto como a realização física de uma informação. De fato, é conveniente (nem sempre absolutamente correto, mas serve como associação inicial), pensar em um sinal como sendo uma trilha de um circuito, um caminho físico. • Configuração (Configuration): um comando de configuração é feito para associar a instanciação de um componente a um determinado par entidade-arquitetura. A configuração pode ser vista como uma listagem de componentes para um projeto. • Pacote (Package): é uma coleção de subprogramas e tipos de dados comumente utilizados em um projeto. • Driver: é a fonte de um sinal. Se um sinal é “gerado” por duas fontes, então quando ambas as fontes estiverem ativas, o sinal terá dois drivers. • Bus: em VHDL, o termo BUS determina um tipo especial de sinal que pode ter seus drivers desligados. • Atributos (attribute): um atributo é um dado que é anexado aos objetos VHDL ou pré- definido acerca de objetos VHDL. Exemplos são a máxima temperatura de operação de um dispositivo. • Genéricos (generic): é um termo VHDL utilizado para passar informações de parâmetros para uma entidade. • Processos (process): é uma unidade de execução seqüencial básica do VHDL. Elementos básicos do VHDL Reduzindo a complexidade da linguagem, pode-se afirmar que, talvez, os três principais elementos construtivos do VHDL sejam: biblioteca (library), entidade (entity) e arquitetura (architecture). É evidente que neste circuito cada porta lógica está produzindo uma saída, estável ou não, independentemente de qualquer outra coisa. No VHDL a simulação do comportamento paralelo é efetuada através de um simulador de eventos discretos, onde é feito o agendamento da alteração do valor de sinais de saída (representando, por exemplo, a saída de uma porta lógica), conforme a lista de sensibilidade existente para o sinal de saída em questão. A lista de sensibilidade é usada para verificar se uma operação deve ou não deve ser feita com o sinal em questão, ou seja, se ele irá ou não irá sofrer alguma alteração. Note que o agendamento também possui o importante papel de simular o comportamento real de um sinal físico, visto que a mudança de um valor não ocorre instantaneamente (simulando, por exemplo, o atraso introduzido por uma porta lógica). É possível controlar esse atraso e agendamento, para efeitos de simulação, através do uso da cláusula AFTER do VHDL. Descrição estrutural ou comportamental Em VHDL é possível implementar uma entidade de várias formas distintas, usando arquiteturas distintas. Duas das principais formas de descrever entidades em VHDL são as descrições ditas comportamentais ou estruturais. Para exemplificar a diferença, podemos considerar o exemplo de um mux 4:1. ENTITY mux IS PORT (a, b, c, d : IN BIT; s0, s1 : IN BIT; x : OUT BIT); END mux; -- Descrição comportamental (é um exemplo, essa não é a melhor forma de fazer isso...) ARCHITECTURE dataflow OF mux IS SIGNAL select : INTEGER; BEGIN select <= 0 WHEN s0 = ‘0’ AND s1 = ‘0’ ELSE 1 WHEN s0 = ‘1’ AND s1 = ‘0’ ELSE 2 WHEN s0 = ‘0’ AND s1 = ‘1’ ELSE 3; x <= a AFTER 0.5 NS WHEN select = 0 ELSE b AFTER 0.5 NS WHEN select = 1 ELSE c AFTER 0.5 NS WHEN select = 2 ELSE d AFTER 0.5 NS; END dataflow; -- Descrição estrutural (também não é a melhor solução para um mux...) ARCHITECTURE netlist OF mux IS COMPONENT andgate PORT( a, b, c : IN bit; c : OUT BIT); END COMPONENT; COMPONENT inverter PORT( in1 : IN BIT; x : OUT BIT); END COMPONENT; COMPONENT orgate PORT( a, b, c, d : IN bit; x : OUT BIT); END COMPONENT; SIGNAL s0_inv, s1_inv, x1, x2, x3, x4 : BIT; BEGIN U1 : inverter(s0, s0_inv); U2 : inverter(s1, s1_inv); U3 : andgate(a, s0_inv, s1_inv, x1); U4 : andgate(b, s0, s1_inv, x2); U5 : andgate(c, s0_inv, s1, x3); U6 : andgate(d, s0, s1, x4); U7 : orgate(x2 => b, x1 => a, x4 => d, x3 => c, x => x); END netlist; Iniciando o trabalho com o VHDL Como vimos na seção anterior, o código VHDL apresenta três elementos básicos: as bibliotecas, entidades e arquiteturas. NOTA 1: O objetivo aqui é possibilitar o desenvolvimento de conceitos de forma estruturada e progressiva, razão pela qual por vezes iremos abordar novamente um conceito que foi anteriormente estudado, a fim de permitir compreender melhor determinados aspectos da linguagem. NOTA 2: Iremos utilizar as ferramentas da Xilinx como ferramenta de apoio, mas todos os princípios que vamos abordar podem ser igualmente utilizados com quaisquer outros fabricantes. Apenas as ferramentas são distintas. Primeiros projetos com o ambiente de trabalho ISE WebPack O ambiente utilizado para os trabalhos de síntese e simulação é o ISE WebPack da Xilinx (ferramenta: Project Navigator). ATENÇÃO: recomendamos aos alunos que tenham uma cópia local em sua casa ou notebook, a fim de poder desenvolver melhor os trabalhos. O software na versão indicada é gratuito e pode ser baixado do endereço www.xilinx.com. ATENÇÃO: recomenda-se que o estudante verifique se o ambiente no qual está trabalhando está corretamente instalado e habilitado. Para tanto, os procedimentos listados no documento TestesISE11-1.pdf devem ser executados com sucesso. NOTA: em ambientes com direitos restritos (como o da universidade) o teste em uma determinada porta USB não garante a operação do circuito nas demais. Ou utilize a mesma porta, ou teste se todas as portas que você pode utilizar estão funcionando corretamente ou não. Caso você não veja o link da ferramenta diretamente no desktop do Windows/Linux, a mesma pode ser acionada conforme mostra a figura abaixo: Figura: acessando o ambientes do ISE. Spartan 3E  CI: XC3S500E, pinagem: FG320 O próximo diálogo apresentado pode ser visto na figura abaixo. Figura: adicionar arquivo fonte ao projeto. Essa caixa de diálogo permite adicionar um novo arquivo fonte ao projeto, acionando o botão New Source. Note que o projeto pode ser criado sem nenhum arquivo fonte associado ao mesmo, mas isso não é usual (porém é útil no caso onde apenas se deseje reaproveitar arquivos VHD de um projeto antigo). Pressionando o botão New Source, as seguintes opções serão apresentadas: Figura: opções de arquivo fonte. Note que existem várias opções para os arquivos fonte de projetos. No momento, iremos explorar apenas a criação de módulos VHDL (VHDL Module). O usuário deve colocar o nome do arquivo, e pressionar o botão Next. IMPORTANTE: arquivos fontes VHDL recebem a extensão .VHD. O nome do arquivo, de acordo com o ambiente ISE e com a norma da linguagem, deve ser IDÊNTICO ao nome da ENTIDADE a ser criada. Novamente, uma entidade DEVE ter o mesmo nome de seu arquivo. No VHDL, um arquivo fonte contém uma única entidade de trabalho. A próxima tela de diálogo pode ser vista abaixo, onde podem ser determinadas as portas presentes na entidade. Não iremos utilizar esse mecanismo, mas sim descrever a entidade diretamente no editor de código. Deve-se pressionar o botão Next. Figura: configuração da entidade. Em seguida, pode ser visualizada uma tela de diálogo onde o usuário pode visualizar um resumo da entidade criada. O botão Finish deve ser acionado para continuar com a criação do projeto. Figura: resumo da entidade. A próxima caixa de diálogo apenas exibe o arquivo fonte adicionado ao projeto. Deve- se pressionar o botão Next. Figura: entidade top adicionada ao projeto. A tela de diálogo seguinte oferece a opção de adicionar arquivos VHD já existentes ao projeto. No momento essa opção não será utilizada e o aluno deverá pressionar a tecla Next. Figura: adicionar arquivos já existentes ao projeto [opcional]. Por fim, é apresento um sumário das características do projeto sendo criado. Ao pressionar o botão Finish, seremos direcionados para a visão inicial do projeto. Vamos iniciar a criação de uma nova entidade. Lembrando que a entidade descreve como o circuito deve se conectar ao mundo exterior, podemos criar um circuito com as seguintes entradas e saídas. Figura: entidade. Como o arquivo criado anteriormente como arquivo top-level para o projeto se chamava ckt_top.vhd, nossa entidade, pela regra já destacada, deverá receber o nome ckt_top. Uma dúvida comum é entender o que é uma entidade top. Se você lembrar que o VHDL de fato é uma linguagem de descrição de hardware, é possível pensar na entidade top como um “protoboard” ou como uma placa ou área onde todas as conexões são feitas entre os vários elementos dos circuitos. De fato, esses “elementos” serão, por sua vez, outras entidades, que também são “caixas” que podem conter, por sua vez, entidades menores interconectadas a fim de realizar alguma função. Ou seja, um elemento auxiliar visual muito útil ao VHDL é a visão estrutural do sistema sendo concebido em termos de diagrama em blocos e suas interconexões, onde cada bloco possivelmente pode ter uma complexidade interna variável. Iremos abordar mais esse conceito posteriormente. Prosseguindo com a descrição da nossa entidade, podemos escrever a mesma da seguinte forma: ----------------------------------------- -- Company: -- Engineer: -- -- Create Date: 21:09:10 04/13/2010 -- Design Name: -- Module Name: ckt_top - Behavioral -- Project Name: -- Target Devices: -- Tool versions: -- Description: -- -- Dependencies: -- -- Revision: -- Revision 0.01 - File Created -- Additional Comments: -- ----------------------------------------- Comentários diversos introduzidos automaticamente na criação do arquivo (são interessantes, mas não estritamente necessários) library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; Declarações de bibliotecas automaticamente inseridas pelo ambiente ISE entity ckt_top is Declaração da entidade port( A,B,C: in std_logic; Y: out std_logic); end ckt_top; architecture Behavioral of ckt_top is begin end Behavioral; Declaração da arquitetura inicialmente inserida pelo ISE Os pontos que devem ser destacados nessa declaração da entidade são os seguintes: • Comentários de uma linha em VHDL podem ser inseridos usando o sinal -- a frente do mesmo. • Notar que as portas/pinos declarados correspondem exatamente ao protótipo pretendido, sendo os sinais A, B e C sinais de mesmo tipo e mesmo sentido, e o sinal Y do mesmo tipo mas com sentido de saída. • Apesar do termo em VHDL ser PORTA, na prática a idéia associada a entidade é a de um PINO de um circuito integrado. Mas efetivamente, portas em VHDL são sinais direcionais. • Sinais de mesmo tipo e sentido podem ser declarados individualmente, em várias linhas, ou podem ser simplesmente separados por vírgulas. • Cada linha declarando as portas/pinos da entidade deve ser terminada por ponto-e- vírgula, com exceção da última – a qual fecha a declaração port e deve ser terminada com ); . Inicialmente, iremos trabalhar com dois modos de pinos/portas das entidades: • IN: representa o ingresso de um sinal na entidade. Um sinal/porta com modo de operação IN só pode ser lido, jamais escrito. • OUT: representa a saída de uma informação de sinal da entidade. Um sinal com modo OUT jamais pode ser lido, apenas escrito. Quanto aos tipos de dados, existem dois tipos básicos, fundamentais ao início do trabalho em VHDL, que devemos destacar: • bit: é um tipo de dados nativo do VHDL, o qual permite representar a informação de um único bit. Não é recomendado o seu uso. • std_logic 1 : é um tipo de dados pertencente a biblioteca IEEE_STD_LOGIC_1164, a qual oferece o uso de um tipo binário mais próximo da realidade do que o tipo bit original do VHDL. Seu uso é recomendado e a biblioteca inclusa por default nas novas entidades criadas a partir do ISE. Como estamos introduzindo apenas tipos binários simples, é importante destacar que os valores representativos do 0 e do 1 são, respectivamente, ‘0’ e ‘1’ – ou seja, o número 0 e o número 1 dentro de aspas simples, ou apóstrofos. Iremos ver em seguida que sequências de bits, por sua vez, são representadas dentro de aspas duplas. Exemplificando: Válidos: ‘1’ ‘0’ “1010” “01010” Inválidos: 1 Maiores informações sobre a biblioteca IEEE_STD_LOGIC podem ser obtidas aqui: http://www.cs.sfu.ca/~ggbaker/reference/std_logic/ “1” “0” ‘1010’ O símbolo de subscrito ou “underline” pode ser usado em qualquer literal numérico no VHDL, sem prejuízo a informação. Ou seja: “10100011” é o mesmo que “1010_0011” 103456 é o mesmo que 103_456 Adicionando o comportamento do circuito Como já foi dito, o comportamento do circuito é especificado dentro da arquitetura do mesmo. Nesse caso, vamos imaginar que o circuito que se deseja implantar seja o circuito abaixo: Para que seja possível realizar e descrever esse circuito dentro da arquitetura, devemos introduzir os primeiros operadores em VHDL. Operador Sintaxe Exemplo Atribuição simples de sinais Identificador <= expressão; Y <= a xor b; Operadores lógicos and, or, not, xor, nand, nor, xnor Y <= (a and b) xor c; AVISO: Apesar de a linguagem prever uma prioridade de operadores, no caso de expressões lógicas é FORTEMENTE recomendado que expressões que devam ser avaliadas primeiramente sejam destacadas pelo uso apropriado de PARÊNTESES. Abrindo o código da arquitetura e usando os operadores lógicos e de atribuição, podemos, portanto, descrever o comportamento do circuito acima com uma única expressão de código: architecture Behavioral of ckt_top is begin y <= (a and b) xor (not(a) and c); end Behavioral; Dado que temos o código completo descrevendo tanto a entidade em si e a arquitetura de sua operação, podemos agora iniciar o processo de verificação do código, simulação e síntese. Verificação da sintaxe do código Apenas para verificação, o código que você deve ter associado ao arquivo ckt_top.vhd, neste ponto, é (eliminando comentários): library IEEE; Figura: acionando o utilitário de síntese. Caso seja possível a síntese do circuito e não exista nenhum erro residual de sintaxe, uma saída típica ao processo (mensagens geradas no console) seria: IMPORTANTE: sempre salve os arquivos do projeto, a fim de se certificar que a síntese está ocorrendo com as últimas alterações efetuadas!!! Reading design: ckt_top.prj ========================================================================= * HDL Compilation * ========================================================================= Compiling vhdl file "E:/aulas/TESTE/ckt_top.vhd" in Library work. Architecture imp of Entity ckt_top is up to date. ========================================================================= * Design Hierarchy Analysis * ========================================================================= Analyzing hierarchy for entity <ckt_top> in library <work> (architecture <imp>). ========================================================================= * HDL Analysis * ========================================================================= Analyzing Entity <ckt_top> in library <work> (Architecture <imp>). Entity <ckt_top> analyzed. Unit <ckt_top> generated. ========================================================================= * HDL Synthesis * ========================================================================= Performing bidirectional port resolution... Synthesizing Unit <ckt_top>. Related source file is "E:/aulas/TESTE/ckt_top.vhd". Found 1-bit xor2 for signal <Y>. Unit <ckt_top> synthesized. ========================================================================= HDL Synthesis Report Macro Statistics # Xors : 1 1-bit xor2 : 1 ========================================================================= ========================================================================= * Advanced HDL Synthesis * ========================================================================= ========================================================================= Advanced HDL Synthesis Report Macro Statistics # Xors : 1 1-bit xor2 : 1 ========================================================================= ========================================================================= * Low Level Synthesis * ========================================================================= Optimizing unit <ckt_top> ... Mapping all equations... Building and optimizing final netlist ... Found area constraint ratio of 100 (+ 5) on block ckt_top, actual ratio is 0. Final Macro Processing ... ========================================================================= Final Register Report Found no macro ========================================================================= ========================================================================= * Partition Report * ========================================================================= Partition Implementation Status ------------------------------- No Partitions were found in this design. ------------------------------- ========================================================================= * Final Report * ========================================================================= Clock Information: ------------------ No clock signals found in this design Asynchronous Control Signals Information: ---------------------------------------- No asynchronous control signals found in this design Timing Summary: --------------- Speed Grade: -5 Minimum period: No path found Minimum input arrival time before clock: No path found Maximum output required time after clock: No path found Maximum combinational path delay: 5.753ns ========================================================================= Process "Synthesis" completed successfully Uma síntese com problemas pode exigir diversas intervenções no código VHDL. Muito embora o relatório acima tenha várias informações úteis, ainda não vamos explorar ele por completo, mas apenas destacar a mensagem final, a qual indica uma síntese efetuada com sucesso. Mapeando as portas nos pinos físicos da FPGA O próximo passo – considerando a implementação física do circuito – é definir como as portas/pinos da entidade mais abrangente do projeto – a entidade TOP – irá se relacionar com os pinos físicos da FPGA. Note que muitas das entidades compreendidas num projeto podem ter todos os seus sinais trafegando internamente ao circuito da FPGA, e apenas alguns dos sinais efetivamente serem ligados ao “mundo externo”. Para isso, contudo, é necessário indicar qual porta irá se conectar a qual pino. Muito embora exista o utilitário PlanAhead do ISE, por diversas razões é por vezes mais simples editar diretamente o arquivo de restrições de projeto – e esse será o método usado rotineiramente. Ainda assim, o processo é muito simples. Conforme mostra a figura abaixo, existem diversos tipos de restrições de projeto (User Constraints) que podem ser aplicadas ao mesmo. Para a questão de pinos, pura e simplesmente, devemos considerar a opção aonde consta FloorPlan Area/IO/Logic (PlanAhead). Clicando duas vezes sobre a opção ou com o botão direito e opção Run/ReRun, o utilitário PlanAhead será acionado. Figura: acionando o utilitário PlanAhead. Caso surja a caixa de diálogo abaixo, o usuário deve apenas concordar com a criação de um novo arquivo UCF. Figura: opção de criação do arquivo UCF via PlanAhead. A tela inicial (pode surgir uma caixa de diálogo intermediária que pode ser desprezada) do PlanAhead na criação de um novo arquivo UCS será a vista na figura abaixo: Figura: visão inicial do PlanAhead. Figura: Demais configurações dos pinos. Figura: Estado final da configuração dos pinos. Após ingressar os pinos para cada um dos sinais desejados e configurar os mesmos, o arquivo deverá ser salvo (vide figura acima) e o utilitário PlanAhead poderá ser encerrado. O resultado desse processo é a adição ao projeto de um arquivo com o nome do projeto e com a extensão UCF. De fato, esse arquivo é um arquivo texto e seu conteúdo é exibido abaixo: NET "A" LOC = L13; NET "A" IOSTANDARD = LVTTL; NET "A" PULLUP; NET "B" LOC = L14; NET "B" IOSTANDARD = LVTTL; NET "B" PULLUP; NET "C" LOC = H18; NET "C" IOSTANDARD = LVTTL; NET "C" PULLUP; NET "Y" LOC = F12; NET "Y" IOSTANDARD = LVTTL; NET "Y" DRIVE = 8; No caso de trabalho com o kit de desenvolvimento da Xilinx (kits Spartan 3 e Spartan 3E), o aluno deve ter a disposição – solicitar ao professor – dois arquivos distintos: Spartan3.ucf e Spartan3e.ucf. Eles são, respectivamente, indicados para trabalho com um ou com o outro kit. No caso do trabalho com os arquivos, TODOS os pinos não utilizados devem ser apagados e apenas deve ser renomeado o sinal. Pegando o arquivo original já com as entradas desnecessárias eliminadas, teríamos (para a Spartan3E): ##################################################### ### SPARTAN-3E STARTER KIT BOARD CONSTRAINTS FILE ##################################################### # ==== Discrete LEDs (LED) ==== # These are shared connections with the FX2 connector NET "LED<0>" LOC = "F12" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ; # ==== Slide Switches (SW) ==== NET "SW<0>" LOC = "L13" | IOSTANDARD = LVTTL | PULLUP ; NET "SW<1>" LOC = "L14" | IOSTANDARD = LVTTL | PULLUP ; NET "SW<2>" LOC = "H18" | IOSTANDARD = LVTTL | PULLUP ; Editando o arquivo de forma a refletir os sinais que desejamos mapear com os respectivos pinos, temos: ##################################################### ### SPARTAN-3E STARTER KIT BOARD CONSTRAINTS FILE ##################################################### # ==== Discrete LEDs (LED) ==== # These are shared connections with the FX2 connector NET "Y LOC = "F12" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ; # ==== Slide Switches (SW) ==== NET "A" LOC = "L13" | IOSTANDARD = LVTTL | PULLUP ; NET "B" LOC = "L14" | IOSTANDARD = LVTTL | PULLUP ; NET "C" LOC = "H18" | IOSTANDARD = LVTTL | PULLUP ; O arquivo deve ser SALVO, somente com a extensão UCF (cuidado para não gerar um arquivo ucf.txt  no bloco de notas ou wordpad, salve o arquivo com o nome completo, entre aspas, na forma “entidade.ucf”). O arquivo também deve ter o nome da entidade que se deseja mapear os pinos, usualmente a entidade top. AVISO: caso o arquivo esteja sendo editado/criado via Notepad ou WordPad ou Vi, o usuário deve adicionar o arquivo UCF ao projeto, indo no menu do ISE ProjectAdd Source, selecionando e adicionando o mesmo ao projeto, sob pena de o arquivo em questão ser desconsiderado. De fato, na versão atual do ISE, TODOS os arquivos devem ser sempre adicionados aos projetos (sejam UCFs ou VHDs). Processo de gravação no kit de trabalho Uma vez que todos os pinos estejam associados à FPGA, podemos iniciar os demais processos, que consistem na implementação física da síntese dentro da FPGA. Para tanto, conforme mostra a figura abaixo, primeiro é necessário implementar o projeto, selecionando o utilitário Implement Design, o qual irá traduzir a síntese para a tecnologia da FPGA, mapear, posicionar e rotear o projeto como um todo. Em projetos de grande porte, essa etapa pode demandar um tempo considerável para sua execução. Figura: Implementando o projeto. Em alguns casos a síntese pode transcorrer sem maiores problemas, porém o processo de implementação gere erros ou avisos. Isso usualmente pode ser contornado via opções de projeto dependentes especificamente da Xilinx. E usualmente refletem decisões de projeto que não são as mais adequadas. Uma implementação adequada gera um resultado no console conforme o abaixo (reduzido em tamanho): Command Line: E:\Xilinx\11.1\ISE\bin\nt\unwrapped\ngdbuild.exe -ise TESTE.ise -intstyle ise -dd _ngo -nt timestamp -i -p xc3s500e-fg320-5 ckt_top.ngc ckt_top.ngd Reading NGO file "E:/aulas/TESTE/ckt_top.ngc" ... Reading in constraint information from 'ckt_top.ucf'... Gathering constraint information from source properties... Done. Resolving constraint associations... Checking Constraint Associations... Done... Checking Partitions ... Checking expanded design ... … Process "Translate" completed successfully Using target part "3s500efg320-5". … Mapping design into LUTs... Running directed packing... Running delay-based LUT packing... Running related packing... Updating timing models... Design Summary: Number of errors: 0 Number of warnings: 0 Logic Utilization: Number of 4 input LUTs: 1 out of 9,312 1% Logic Distribution: Number of occupied Slices: 1 out of 4,656 1% Number of Slices containing only related logic: 1 out of 1 100% Number of Slices containing unrelated logic: 0 out of 1 0% *See NOTES below for an explanation of the effects of unrelated logic. Total Number of 4 input LUTs: 1 out of 9,312 1% Number of bonded IOBs: 4 out of 232 1% Figura: Visão inicial do Impact. Sobre a tela que surgir (vide mensagem e figura abaixo), o aluno deverá clicar com o botão direito e selecionar a opção indicada na figura – Initialize Chain. Isso fará a detecção da placa e, se não ocorrer nenhum erro, o Impact irá exibir uma nova mensagem de diálogo, perguntando se deve continuar e associar os arquivos de configuração – a resposta deverá ser positiva. Figura: Varredura pela FPGA. Figura: Diálogo sobre configuração da FPGA. Ao selecionar a opção Yes, diversas caixas de diálogo irão surgir, questionando sobre os arquivos de configuração que devem ser associados a cada um dos dispositivos detectados – note que o Impact detecta apenas os dispositivos Xilinx. Note que a cada diálogo, o ambiente irá destacar com a cor verde qual é o dispositivo a ser configurado. No nosso caso, queremos configurar apenas a FPGA e para os demais dispositivos detectados, bypassar (Bypass) a configuração, conforme mostra a figura abaixo. O arquivo a ser selecionado para a configuração será o arquivo com o nome da entidade/projeto com a extensão bit. Figura: Selecionando o arquivo de configuração. No caso do ambiente questionar a opção de gravação de Flashs PROMs, o usuário deverá seleciona a opção No (isso para os projetos padrões). Figura: Configuração da Flash PROM. Figura: Bypass da configuração dos demais dispositivos. Figura: Bypass da configuração dos demais dispositivos. Uma janela apresentando um relatório final (figura abaixo) deve surgir, e o aluno deverá clicar apenas na opção Ok. Figura: Visão geral da configuração. Para efetivamente programar o dispositivo, o usuário deverá selecionar o mesmo com o mouse e clicar com o botão direito, selecionando a opção de programação destacada na figura abaixo. Figura: Ordenando a programação. architecture imp of ckt2 is signal T1, T2, T3, T4, T5, T6, T7: std_logic; begin T1 <= a and b; T2 <= not a; T3 <= T2 and c; T4 <= T1 xor T3; T5 <= T6 and T7; T6 <= c and d; T7 <= d nor e; Y <= T4 and T5; end imp; Note que o código acima, associado com a visão do hardware é de correção muito mais fácil e permite a criação de circuitos de tamanho arbitrariamente grande. Porém iremos ver outro recurso para conectar entidades distintas que irá tornar esse mecanismos ainda mais flexível, permitindo a descrição de um esquemático arbitrário de um circuito digital. Uma observação de EXTREMA importância deriva do fato que o código acima não tem ORDEM de interpretação ou execução. Execução não se aplica, pois o código não será “executado”  de fato, será gerado um circuito físico a partir da representação do código. Todos os princípios aplicáveis a um circuito físico digital também se aplicam, portanto, ao código. Dessa forma, não existe (nesse nível de código) precedência de um comando sobre o outro  TODOS as atribuições estão ocorrendo ao mesmo tempo, independentemente ou concorrentemente umas com as outras. Por essa razão, afirma-se que o código no nível de encapsulamento do arquitetura é um código PARALELO ou CONCORRENTE. De fato, exatamente o mesmo resultado – ou seja, o mesmo circuito – é obtido na forma: architecture imp of ckt2 is signal T1, T2, T3, T4, T5, T6, T7: std_logic; begin Y <= T4 and T5; T4 <= T1 xor T3; T1 <= a and b; T3 <= T2 and c; T5 <= T6 and T7; T6 <= c and d; T7 <= d nor e; T2 <= not a; end imp; ou em qualquer outra ordem de escrita. Ou seja, a ordem dos comandos em VHDL, no nível direto da arquitetura não altera o resultado físico obtido. Isso é necessário para representar efetivamente o comportamento de um circuito lógico combinacional, onde, efetivamente, uma porta não apresenta relação de precedência sobre as demais, sendo que todas operam em conjunto. Lista de palavras reservadas em VHDL 87 e VHDL 93 (com asterisco) Lembrando que esses nomes não são válidos como identificadores: abs access disconnect downto label library package port sll* sra* after alias all and architecture array assert attribute begin block body buffer bus case component configuration constant else elsif end entity exit file for function generate generic group* guarded if impure* in inertial* inout is linkage literal* loop map mod nand new next nor not null of on open or others out postponed* procedure process pure* range record register reject* rem report* return rol* ror* select severity signal shared* sla* srl* subtype then to transport type unaffected* units until use variable wait when while with xnor* xor Resumo Estrutura Sintaxe Exemplo Comentários -- Comentário -- Isso é um comentário de uma linha Entidades entity nome_da_entidade is port( nome1,nome2: modo tipo; nome3: modo tipo); end nome_da_entidade; entity ckt_top is port( A,B,C: in std_logic; Y: out std_logic); end ckt_top; Identificadores Qualquer nome iniciado por letra ou por underline e que não seja uma palavra reservada da linguagem Válido: um_nome Inválido: 3nome Modos de portas IN ou OUT port( A,B,C: in std_logic; Y: out std_logic); Tipos de dados std_logic bit Valor para um único bit: ‘0’ ou ‘1’ Valor para uma sequência de bits “00011” Atribuição simples de sinais identificador <= expressão; Y <= a xor b; Operadores lógicos and, or, not, xor, nand, nor, xnor Y <= (a and b) xor c; Declaração de novos sinais signal nome1, nome2, nome3 : tipo; architecture imp of ckt2 is signal A: std_logic; begin
Docsity logo



Copyright © 2024 Ladybird Srl - Via Leonardo da Vinci 16, 10126, Torino, Italy - VAT 10816460017 - All rights reserved