of 29 /29
Tutorial Xilinx ISE Universidade Federal do Rio de Janeiro Escola Politécnica Departamento de Eletrônica e Computação Autores: Orientador: Artur Lemos Mário Vaz Ioav Lichtenstein Thiago Lobo

Tutorial)*)Xilinx)ISE - del.ufrj.brmario.filho/Tutorial.pdf · 4.)VHDL)Básico ’ VHDL’é’uma’linguagem’de’descrição’de’hardware’que’ foi’inicialmente’utilizada’para’documentarcomponentes’

Embed Size (px)

Text of Tutorial)*)Xilinx)ISE - del.ufrj.brmario.filho/Tutorial.pdf · 4.)VHDL)Básico ’...

Tutorial - Xilinx ISE

Universidade Federal do Rio de JaneiroEscola Politcnica

Departamento de Eletrnica e Computao

Autores: Orientador:Artur Lemos Mrio VazIoav LichtensteinThiago Lobo

ndice:1. Introduo 32. Instalao 43. Criando um novo projeto 54. VHDL Bsico 85. Simulando um projeto 156. Criando um DCM 237. Implementando um projeto na FPGA 268. Exemplos de Cdigo 27

2

1. Introduo O ISE (Integrated Software Environment) um software criado pela Xilinx para sntese e anlise de modelos HDL. O usurio poder escrever, compilar, realizar anlises temporais (utilizando diferentes estmulos como entrada) e/ou configurar FPGAs com o modelo criado. Este tutorial visa fornecer ao usurio uma viso geral do software, mostrando, de forma simples, desde a ativao do programa at a compilao, visualizao de diagramas RTL e configurao da FPGA Spartan 3AN com cdigos VHDL. Desenvolveremos o tutorial baseando-nos num mdulo divisor de freqncia, e forneceremos outros exemplos de cdigo na ltima sesso.

3

2. Instalao Para ativar o ISE, deve-se baixar os arquivos no link https://www.del.ufrj.br/pastas-das-disciplinas/eel480 -sistemas-digitais, garantir que esto na pasta ~/Downloads e executar a seguinte instruo no Terminal: cd ; tar xvf /Downloads/Xilinx.tar ; ./ise.sh Feito isso, o ISE dever estar ativado e para execut-lo, deve-se utilizar o seguinte comando, tambm no Terminal: ise & O que nos leva tela principal do programa:

4

https://www.del.ufrj.br/pastas-das-disciplinas/eel480-sistemas-digitaishttps://www.del.ufrj.br/pastas-das-disciplinas/eel480-sistemas-digitaishttps://www.del.ufrj.br/pastas-das-disciplinas/eel480-sistemas-digitaishttps://www.del.ufrj.br/pastas-das-disciplinas/eel480-sistemas-digitaishttps://www.del.ufrj.br/pastas-das-disciplinas/eel480-sistemas-digitaishttps://www.del.ufrj.br/pastas-das-disciplinas/eel480-sistemas-digitais

3. Criando um novo projeto Na tela principal do ISE, devemos comear pelo menu File > New Project e a janela New Project Wizard ser aberta. Campos:Name - nome do projetoLocation - localizao onde o projeto ser salvo*Description - descrio do projeto

* - utilizaremos a pasta /tmp, pois eventualmente, o ISE pode gerar arquivos de projeto muito grandes, os quais excederiam o limite por usurio da rede. Para garantir que os arquivos sejam guardados, devemos utilizar o comando Archive, como mostraremos posteriormente.

5

Feito isso, clicar em Next. Agora, devemos escolher outros parmetros de projeto:Evaluation Development Board - Spartan 3AN Starter KitSynthesis Tool - XSTPrefered Language - VHDLVHDL Source Analysis Standard - VHDL-93

Aps clicar, mais uma vez, em Next, uma janela que resume os parmetros do projeto ser exibida. Confira os dados e caso estejam corretos, clique em Finish. Agora, temos um projeto (.xise) pronto, basta adicionar cdigos-fonte VHDL e poderemos trabalhar com os modelos. Para importar um cdigo VHDL j escrito, devemos acessar o menu Project > Add Copy of Source, navegar at o arquivo e selecion-lo. Isso copiar o arquivo para o workspace do projeto e permitir sua edio. Sempre que a edio dos arquivos estiver concluda, devemos utilizar o menu Project > Archive, para salvar o projeto na pasta do

6

usurio em formato .zip. Para utilizar esse projeto posteriormente, basta descompactar o .zip gerado dentro da pasta /tmp e abri-lo na primeira tela do ISE (Open Project).

7

4. VHDL Bsico VHDL uma linguagem de descrio de hardware que foi inicialmente utilizada para documentar componentes digitais e acabou sendo aproveitada para simulaes/implementaes em FPGA desses mesmos componentes. Um arquivo VHDL deve conter, no mnimo, uma entity e uma architecture. A entity consiste na descrio da interface do mdulo como uma caixa preta: especificando apenas as entradas e sadas. A architecture descreve o funcionamento do mdulo, propriamente dito. Costumamos separar architectures em duas classes: comportamentais e estruturais. As comportamentais servem para definir como um mdulo funcionar e as estruturais servem para definir como um mdulo de alta hierarquia interliga diferentes mdulos menores (o que no deixa de ser seu funcionamento). A utilizao de mdulos j prontos dentro de uma architecture se assemelha instanciao de um objeto em uma linguagem Orientada a Objetos: especifica-se o tipo do objeto (sua Entity), escolhe-se um nome e mapeia-se suas entradas e sadas (semelhante ao construtor de classes em Java). Dentro da architecture utilizamos sinais (signals) para intercomunicar mdulos. aplicvel um paralelo com as variveis de um programa em Java. Comentrios so feitos utilizando-se um --, por exemplo: -- Isso um comentrio e no ser utilizado na sntese

8

Segue um exemplo bsico: uma porta lgica AND:1. -- importando std_logic da biblioteca IEEE2. library IEEE;3. use IEEE.std_logic_1164.all;4. 5. -- essa a entidade (entity)6. entity ANDGATE is7. port ( 8. I1 : in std_logic;9. I2 : in std_logic;10. O : out std_logic);11. end entity ANDGATE;12. 13. -- essa a arquitetura comportamental (architecture)14. architecture behavioral of ANDGATE is15. begin16. O

Agora, podemos analisar o divisor de freqncia clk_div:

18. library IEEE;19. use IEEE.STD_LOGIC_1164.ALL;20. use ieee.numeric_std.ALL;21. 22. entity clk_div is23. generic (n : integer := 4);24. port (clk_in : in std_logic; 25. div : out std_logic;26. div2 : out std_logic );27. end clk_div;28. 29. architecture divide of clk_div is30. signal cnt, cnt1 : integer := 0;31. signal div_temp, div_temp2 : std_logic := '0';32. 33. begin34. div = n then48. cnt1

substitudo em todos os lugares que aparece no cdigo por 4. Trata-se de uma constante. Dentro da architecture, vemos um process, que como uma funo em C. Todo processo leva uma lista de sensibilidade, que no caso (clk_in). Isso indica que sempre que clk_in for atualizado, o process ser executado. H, tambm, 4 signals: 2 contadores e 2 temporrios que so mapeados s sadas do bloco, como indicam as linhas:

57. div

Agora, podemos analisar o outro mdulo, base_tempo, que utiliza o mdulo clk_div para dividir a frequncia do sinal de entrada clk. Vale ressaltar o fato de que um DCM (Digital Clock Manager foi necessrio, voltaremos a falar sobre ele na sesso 5):

59. library IEEE;60. use IEEE.STD_LOGIC_1164.ALL;61. use ieee.numeric_std.ALL;62. library UNISIM;63. use UNISIM.Vcomponents.ALL;64. 65. entity base_tempo is66. generic (n: integer := 2);67. port (clk : in std_logic;68. clk_out : out std_logic;69. clk_out_2 : out std_logic;70. locked : out std_logic);71. attribute LOC : string ;72. attribute LOC of clk : signal is "E12";73. attribute LOC of locked : signal is "W21";74. attribute LOC of clk_out : signal is "Y22";75. attribute LOC of clk_out_2 : signal is "Y18";76. end entity;77. 78. 79. architecture estrutural of base_tempo is80. component clk_div81. port (clk_in : in std_logic; 82. div : out std_logic;83. div2 : out std_logic);84. end component;85. 86. COMPONENT dcm187. PORT(CLKIN_IN : IN std_logic;88. CLKFX_OUT : OUT std_logic;89. CLKIN_IBUFG_OUT : OUT std_logic;90. CLK0_OUT : OUT std_logic;91. LOCKED_OUT : OUT std_logic);92. END COMPONENT;93. 94. signal clk_int : std_logic;95. 96.97.98.99.

12

100.begin101.clk_divider : clk_div port map 102. (clk_in => clk_int, 103. div => clk_out, 104. div2 => clk_out_2);105. 106.Inst_dcm1 : dcm1 PORT MAP (107. CLKIN_IN => clk,108. CLKFX_OUT => clk_int,109. CLKIN_IBUFG_OUT => open,110. CLK0_OUT => open,111. LOCKED_OUT => locked);112.end estrutural;

Comearemos a anlise pela entity: como esperado, h uma entrada clk e duas sadas clk_out e clk_out_2. H uma sada extra chamada locked, que simplesmente diz se o DCM est ou no sincronizado. As linhas 113-117 associam sinais da entity a componentes da FPGA na qual o cdigo ser carregado. Exceto por E12, todos os sinais so mapeados a LEDS ou contatos, que podem ser identificados pelos mesmos nomes na placa fsica:113.attribute LOC : string ;114.attribute LOC of clk : signal is "E12";115.attribute LOC of locked : signal is "W21";116.attribute LOC of clk_out : signal is "Y22";117.attribute LOC of clk_out_2 : signal is "Y18";

A achitecture, como de se esperar, estrutural, pois base_tempo trata-se de um mdulo que unifica pequenos mdulos (clk_div e dcm1). Para instanciarmos mdulos, devemos antes fazer uma declarao do tipo COMPONENT nome ... END COMPONENT;. Isso foi feito para o clk_div e o dcm1. Feito isso, podemos finalmente mapear as portas dos componentes (tal como inicializar um objeto em Java atravs de seu construtor) a sinais ou entradas/sadas da entidade.

13

No caso, utilizamos um sinal interno clk_int, que serve como sada do dcm1. No podemos utilizar diretamente o clock da placa (50mHz), pois h problemas como capacitncias parasitas que prejudicariam o funcionamento do circuito. De fato, resolvemos esse problema atravs do dcm1, que coloca uma frequncia menor em clk_int para que essa seja utilizada como entrada para o clk_div. As sadas do clk_div so intuitivamente mapeadas s sadas clk_out e clk_out_2 da base_tempo. Acreditamos que a esse ponto, o leitor j adquiriu certa noo de cdigo VHDL e de seu funcionamento, sendo capaz de continuar por si s utilizando referncias online para funes mais complexas.

14

5. Simulando um projeto Completados os cdigos VHDL, podemos realizar simulaes e visualizar seu diagrama RTL atravs do ISE. Vale lembrar que podemos ver erros de sintaxe em tempo real na aba Errors, basta um CTRL + s para salvar o cdigo e a janela ser atualizada com os erros encontrados:

Para sintetizar os arquivos, devemos selecionar a Implementation View em Design > Hierarchy. Feito isso, devemos clicar uma vez sobre o nome do componente que ser sintetizado:

15

Feito isso, basta um duplo-clique em Synthesize - XST. Espere alguns instantes e verifique o log de erros para saber se a sintetizao foi feita com sucesso. Para visualizar o esquemtico RTL, basta expandir Synthesize - XST, um dupo-clique em View RTL Schematic e selecionar Start with a schematic of the top-level block no dilogo que ser aberto.

Com o Top-level schematic aberto, podemos dar duplos-cliques de forma a expandir as caixas-pretas que compoem o circuito. Podemos, finalmente, simular o cdigo. Selecione a Simulation View em Design > Hierarchy e clique uma vez sobre o nome do componente que ser simulado. Feito isso, expanda iSIM simulator e d duplos-cliques, na sequncia, em: Behavioral Check Sintax (um ltimo teste de sintaxe) e

16

Simulate Behavioral Model (a simulao propriamente dita).

Caso tudo corra bem, a janela do simulador (iSim) ser aberta:

17

Agora, podemos forar um valor no clock de forma a observar a sada do circuito (que se trata de um clk_div). Devemos clicar com o boto direito na varivel desejada e selecionar Force clock. Isso abrir uma janela com diversas caixas a serem preenchidas:

Value Radix - Tipo de clock: binrio, ASCII, Decimal etcLeading Edge Value - Valor inicial de clockTrailing Edge Value - Valor final de clockStarting at Time Offset - Quando o clock comeaCancel After Time Offset - Quando o clock terminaDuty Cycle (%) - Razo entre Leading Edge e Trailing EdgePeriod - Auto-explicativo

Preenchendo da seguinte forma, obtemos um perodo de

50mHz.

18

Agora, devemos programar por quanto tempo a simulao ser executada. Basta preencher a caixa de texto na barra de cones e ento clicar na set para a esquerda (apagando a ltima simulao). Feito isso, devemos clicar no boto de play com uma ampulheta e na terceira lupa (com um X) para ajustar a escala dos grficos ao tamanho da janela.

Esse o resultado final. Como podemos ver, o clock foi devidamente dividido.

19

Outra forma de impor valores de clock e de certas entradas utilizar um TestBench. Para tanto, devemos selecionar a Implementation View em Design > Hierarchy, clicar com o boto direito sobre o mdulo principal, ir em New > Source > TestBench. Devemos dar um nome ao TestBench (normalmente adicionando-se o sufixo _tb ao nome do componente original) e ao confirmar seremos levado janela de seu cdigo fonte (o cdigo exemplo foi usado em um debouncer, que ser descrito na ltima sesso):

118.LIBRARY ieee;119.USE ieee.std_logic_1164.ALL;120. 121.ENTITY debouncer2_tb IS122.END debouncer2_tb;123. 124.ARCHITECTURE behavior OF debouncer2_tb IS 125. 126. COMPONENT debouncer2127. PORT(128. Clk : IN std_logic;129. Key : IN std_logic;130. pulse : OUT std_logic131. );132. END COMPONENT;133. 134. 135. --Inputs136. signal Clk : std_logic := '0';137. signal Key : std_logic := '0';138. 139. --Outputs140. signal pulse : std_logic;141. 142. -- Clock period definitions143. constant Clk_period : time := 10 ms;144. 145.BEGIN146. 147. -- Instantiate the Unit Under Test (UUT)148. uut: debouncer2 PORT MAP (149. Clk => Clk,

20

150. Key => Key,151. pulse => pulse152. );153. 154. -- Clock process definitions155. Clk_process :process156. begin157. Clk

palavra reservada wait para definir os atrasos entre as mudanas de valores (que tambm podem ser definidas). Com o TestBench feito, basta simul-lo no lugar do componente original e teremos o processo automatizado, sem necessidade de forar clocks ou coisas do tipo.

22

6. Criando um DCM A criao de um DCM consiste nos seguintes passos: - Selecionar o Implementation View em Design > Hierarchy- Clicar com o boto direito no projeto e selecionar New Source- Busque por DCM na barra de pesquisa e selecione Single DCM_SP conforme a seguinte imagem:

-D um nome diferente de dcm, tal como dcm1 ou dcm2, e clique em Finish- Feito isso, voc ser levado janela Xilinx Clocking Window-Nessa janela possvel selecionar os mais variados parmetros para o clock que o DCM transformar.

23

Selecione conforme as exigncias de seu projeto (como multiplicar/dividir o clock)

- Clique em Next, selecione Use Global Buffers for all Selected Clock Outputs- Clique em Next, selecione Show all Modifiable Outputs e clique em Finish

24

-O DCM est criado, agora basta utilizar o cdigo para o componente de DCM como mostrado na sesso 4.

25

7. Implementando um projeto na FPGA Caso os sinais da entity do componente j estejam mapeados para partes da FPGA, como mostrado na sesso 4, voc est pronto para implementar o cdigo na placa. importante, obviamente, que a placa esteja ligada ao PC pela interface USB e esteja devidamente alimentada. Em primeiro lugar, devemos escolher a Implementation View em Design > Hierarchy, feito isso, clique uma vez sobre o mdulo principal do seu projeto e clique duas vezes sobre Configure Target Device. A janela do iMPACT ser aberta. Clique duas vezes em Boundary Scan e clique com o boto direito no espao em branco e selecione Initialize Chain. Na primeira miniatura da FPGA, carregue o arquivo .bit que correponde ao seu projeto. Deixei a segunda em bypass. Clique com o boto direito sobre a primeira miniatura e clique em Program FPGA Only. O programa deve estar carregado na placa. Observe as partes para as quais os sinais foram mapeados.

26

8. Exemplos de cdigoDebouncer:

180.LIBRARY ieee;181.USE ieee.STD_LOGIC_1164.all;182.USE ieee.STD_LOGIC_UNSIGNED.all;183. 184.ENTITY debouncer2 IS185. PORT (Clk : IN STD_LOGIC;186. Key : IN STD_LOGIC;187. pulse : OUT STD_LOGIC);188.END debouncer2;189. 190.ARCHITECTURE shift_register OF debouncer2 IS191.SIGNAL SHIFT_KEY : STD_LOGIC_VECTOR(3 DOWNTO 0) := "1111";192. 193.BEGIN194.PROCESS195. BEGIN196. 197. WAIT UNTIL Clk'EVENT AND Clk = '1';198. 199. SHIFT_KEY(2 DOWNTO 0)

A forma de atualizar o valor do registrador ir colocando not key no lado direito do vetor de bits do registrador. Se por 4 clocks seguidos, o valor de key amostrado estiver em 1, o registrador estar no estado 0000 e pulse valer 1, caso contrrio pulse valer 0. Isso faz sentido pois evita que a sada seja atualizada durante o transiente da vibrao da chave, fazendo com que ela s seja ativada algum tempo depois (o suficiente para que a trepidao termine). Logo, haver um atraso muito pequeno (porm detectvel em osciloscpio) na resposta da chave.

A seguinte imagem, adquirida em um osciloscpio ligado FPGA com o programa do Debouncer carregado demonstra tal atraso e comprova o funcionamento do circuito:

28

A curva mais baixa key e a mais alta not pulse, vemos, portanto, que pulse s vai a 1 algum tempo depois de key ter ido a 1. Esse o tempo do transiente de vibrao.

Referncias:An ISE Tutorial - Luiz RennProjeto Debouncer - Camila Simes da Costa Cunha Vasconcellos, Henrique Duarte Faria, Patrick Svaiter, Paulo Roberto Yamasaki CatundaRelatrio de Sistemas Digitais: Projeto Base de Tempo - Michael D. Barreto e Silva, Luiz Carlos, Gabriela Dantas

29