Segundo Trabalho de Sistemas Digitais

Transcrição

Segundo Trabalho de Sistemas Digitais
Segundo Trabalho de Sistemas Digitais
Alunos: Márcio Teixeira, Louise Landi e Tharsus Proux.
Professor: Mário Vaz Filho.
Tutorial de um Divisor de Frequências em VHDL
1 – Introdução
O objetivo deste trabalho é o projeto de um divisor de frequências em linguagem VHDL
comportamental capaz de dividir frequências acima de 50 MHz, com simulação do projeto no
software ISE e implementação em uma FPGA Spartan3AN Starter Kit.
2 – Planejamento
Um divisor de frequências funciona da seguinte maneira: sua entrada é um pulso e sua saída é
também um pulso mas com frequência menor do que o pulso de entrada. Entretanto, para um uso
mais genérico, sua implementação necessita de um gerenciador de clock para poder gerar
frequências acima de 50 MHz.
O projeto em VHDL será composto por 2 módulos. Um módulo será chamado de clk_div e ele é o
nosso divisor de frequências de fato. O outro módulo é chamado de base_tempo e é o módulo de
implementação do clk_div. No base_tempo será incluído o dcm1, um gerenciador de clock e a saída
do dcm1 será um sinal interno que irá à entrada do clk_div. As entradas e saídas de base_tempo
serão dadas, respectivamente, por dmc1 e clk_div. Na Figura 1 foi ilustrado a lógica de
funcionamento do projeto.
Figura 1
A entrada de base_tempo será um pulso de clock denominado de clk. As saídas de base_tempo
serão ligadas a um LED e a um osciloscopio. A entrada e a saída de dcm1 foram denominadas de
CLKIN_IN e CLKFX_OUT respectivamente. A entrada e a saída de clk_div foram denomidas de
clk_in e div_out respectivamente.
3 – Criação dos Códigos Fonte em VHDL
Para criar os códigos fontes foi utilizado o Software ISE da empresa Xilinx. Após iniciado o
software, é necessário criar um novo projeto. A Figura 2 corresponde a primeira janela que abre. Ao
se criar um novo projeto no ISE é necessário escolher uma pasta que será a workspace. Nela, todos
os arquivos necessários para o funcionamento da simulação e implementação do projeto serão
salvos. Foi escolhida a pasta tpm que é a pasta para arquivos temporários utilizada no laboratório e
com isso, o limite de dados que podem ser armazenados não será estourado em nenhuma conta dos
alunos que participaram desde trabalho. Após a escolha da workspace, é necessário dar um nome ao
projeto que será base_tempo, o mesmo nome do módulo principal. Além disso, é escolhido o tipo
do módulo de maior hierarquia (base_tempo) que é do tipo HDL. Na janela seguinte, escolhe-se a
plataforma de desenvolvimento (Evaluation Development Board) que é a Spartan3AN Starter Kit.
Figura 2
Após criado o novo projeto, iremos criar os códigos contes. Para isso iremos na aba Project > New
Source. Na nova janela é escolhido VHDL Module e o nome do módulo é clk_div. Na janela
seguinte, é possível criar as portas do módulo só que essa criação será feita mais adiante. Após
criado o módulo clk_div, serão criadas as suas entradas e saídas, além da sua lógica de
funcionamento. Observações sobre a estrutura de um código VHDL encontram-se no Apêndice 1. A
Figura 3 mostra o início do código que é uma documentação do projeto. É importante a realização
de uma documentação adequada com informações a respeito do projeto e com comentários ao longo
do código para facilitar uma leitura futura de fácil entendimento. Além disso, é mostrado o início do
código de fato. A primeira parte é a respeito de quais bibliotecas VHDL serão usadas e a segunda
parte é a criação da entity clk_div. Na entity serão declaradas as constantes, entradas e saídas do
módulo clk_div.
Figura 3
A Figura 4 mostra a terceira parte do código que será a lógica de funcionamento do divisor de
frequências. Quatro sinais internos são usados como parte da lógica. Dois serão contadores e serão
os responsáveis por informar o momento de mudança dos valores de cada saída, determinando
assim a frequência de saída de acordo com o valor máximo assumido. Os outros dois serão sinais
que sofrerão alteração ao longo do funcionamento do divisor e seus valores serão direcionados às
saídas de clk_div, pois nenhuma saída pode ser diretamente manipulada em VHDL.
A lógica da saída LED é dada pelo “primeiro circuito” e funciona da seguinte maneira: a cada
subida de clk_in (ou seja, a cada subida do clock de entrada) o contador será comparado com um
número, se o contador for menor que esse número, então o sinal interno de saída manterá o seu
valor lógico e o contador será incrementado uma unidade. Se o contador for maior ou igual ao
mesmo número, então o sinal interno de saída receberá seu valor negado e o contador será
redefinido como sendo igual a um. Ou seja, a ideia é ir incrementando o contador de forma a
determinar quantas vezes o clock subiu e a partir daí escolher em quantas vezes se quer dividir sua
frequência ao comparar o valor do contador com um número. Nesse caso o tempo que LED
permenece aceso é igual ao tempo que ele permenace apagado, pois o sinal interno de saída muda
sempre para o seu valor lógico negado.
A lógica da saída OSCILOSCOPIO é dada pelo “segundo circuito” e funciona da mesmo maneira
que o “primeiro circuito”, com a exceção da comparação do contador ser feita na descida do clock.
Além disso, o sinal interno de saída tem o tempo em nível lógico alto diferente do tempo em nível
lógico baixo, entretanto a frequência de saída não será afetada.
Figura 4
Na FPGA que será implementado o projeto, o clock padrão dela é de 50MHz, ou seja, o período é
de 20ns. No circuito do LED foi escolhido o valor máximo do contador como sendo 25 milhões,
pois assim a frequência do LED será de 1 Hz. No circuito do OSCILOSCOPIO o valor máximo do
contador será determinado mais adiante.
Finalizado o módulo clk_div, o módulo base_tempo será criado e será de uma hierarquia superior
ao clk_div e nele iremos colocar o módulo dcm1. O processo de criação é o mesmo do clk_div,
mudando apenas o nome do módulo. A Figura 5 mostra o início do código da mesma forma que a
Figura 4. A primeira parte são os comentários seguida da declaração das bicliotecas utilizadas e da
entity base_tempo e suas constantes, entradas e saídas.
Figura 5
Cada attribute é um sinal que será implementado na FPGA, seja ele um sinal de saída ou entrada do
módulo. LOC é uma palavra e receberá os valores entre aspas em rosa que determinará quais os
pinos da FPGA que serão utilizados. FAST é uma palavra usada para fazer o sinal que vai para o
osciloscopio sair por um driver de alta corrente para operar em alta velocidade pelo pino Y18.
Na Figura 6, é mostrada a lógica de base_tempo. Dentro de architecture foram declarados os
component clk_div e dcm1. Ainda não foi criado o módulo dcm1 com core generator, para isso
será seguido o tutorial do ISE. Por hora será terminado o módulo base_tempo para depois criar o
dcm1. Um sinal interno, clk_int, será usado para conectar o clock de saída do dcm1 com o clock de
entrada do clk_div. A configuração da lógica é bem simples, serão “conectados” os pinos de cada
módulo corretamente.
Figura 6
Cada component foi instanciado e teve seus pinos “conectados” de acordo com o planejamento
feito. As entradas dos dcm1 são as entradas do base_tempo e a saída do dcm1 é a entrada do
clk_div. As saídas do clk_div são as saídas do base_tempo. A saída locked é apenas um indicativo
da sincronia do dcm1. Há um atraso no funcionamento do base_tempo, pois o dcm1 leva um
tempo até sincronizar sua saída com a entrada e sua saída é apenas liberada quando a sincronia está
completa. A saída locked quando vai a nível lógico 1 indica que o sincronismo está completo e o
base_tempo começará a dividir a frequência de entrada. A entrada reset será mantida fixa em nível
lógico 1, pois o foco desse trabalho é apenas o funcionamento da lógica do circuito divisor de
frequência. O valor máximo para o contador do circuito do OSCILOSCOPIO foi escolhido como
quatro nesse trabalho.
Para criar o módulo dcm1 será seguido o tutorial do ISE:
1. Em Project Navigator, selecione Project > New Source.
2. Na nova janela, selecione IP (CoreGen & Architecture Wizard) source e digite dcm1 para o
nome do módulo.
3. Clique em Next.
4. Na janela Select IP, selecione FPGA Features and Design > Clocking > Spartan-3E,
Spartan-3A > Single DCM_SP.
5. Clique em Next, e clique em Finish. O Clocking Wizard está preparado.
6. Na janela Architecture Wizard Setup, selectione OK.
7. Na janela General Setup, verifique que as portas RST, CLK0 e LOCKED estão selecionadas.
8. Selecione a porta CLKFX.
9. Digite 50 e selecione MHz para a Input Clock Frequency.
10. Verifique as seguintes configurações:
• Phase Shift: NONE
• CLKIN Source: External, Single
• Feedback Source: Internal
• Feedback Value: 1X
• Use Duty Cycle Correction: Selecionado
11. Clique no botão Advanced.
12. Selecione Wait for DCM lock before DONE Signal goes high.
13. Clique em OK.
14. Clique em Next, e depois novamente em Next.
15. Selecione Use output frequency e digite 50 no local adequado e selecione MHz.
16. Clique em Next, e depois clique em Finish.
O módulo dcm1 foi criado e seu component já foi declarado e instanciado no código do
base_tempo. O tutorial ensina como conseguir as declarações mas nesse trabalho elas já foram
fornecidas. Todos os códigos já foram criados e seus módulos conectados mas antes de implementar
o projeto na FPGA é necesário simular o projeto para a verificação de possíveis erros na lógica.
4 – Simulação
A simulação do projeto é feita no ISim que é a ferramenta utilizada pelo ISE para simulações.
Instruções de como simular um projeto no ISE encontram-se no Apêndice 2. Para realizar a
simulação será forçado um clock em clk 50 MHz de frequência que começa em nível lógico zero.
No reset será forçado uma constante de valor 0. O tempo total de duração da simulação será de 4
us. A Figura 7 mostra o resultado obtido. Nessa simulação, foi feita uma divisão de frequência por
25 na saída do LED e uma divisão por 5 na saída do OSCILOSCOPIO.
Figura 7
É possível perceber que o período do LED está com o valor de 1000 ns, ou seja, para se conseguir
uma período de 1 segundo (frequência de 1 Hz) é só multiplicar o número máximo do contador do
“primeiro circuito” do clk_div por 1000000 (e assim será igual a 25000000). Essa simulação mostra
a eficiência dos “circuitos” do clk_div e nos dá garantia de funcionamento da lógica desenvolvida.
Após simulado o projeto e com um resultado positivo, será feita a implementação do projeto na
FPGA.
5 – Implementação na FPGA
A implementação do projeto será feita usando a ferramenta Impact do ISE. Após feita a síntese e
gerado o bitstream, o Impact será aberto com um duplo clique em cima de Configure Target
Device. Após aberta a janela do Impact as seguintes instruções foram realizadas:
1. Duplo clique em Boundary Scan
2. Clique com o botão direito na área branca aberta e selecione Initialize Chain
3. Abra/selecione o arquivo base_tempo.bit
4. Na próxima janela clique em Byspass
5. Clique com o botão direito em cima do “chip” que ficou verde e selecione Configure FPG only
A configuração da FPGA está completa e o projeto funciona de acordo com o planejado. O LED
pisca numa frequência de 1 Hz (meio segundo aceso e meio segundo apagado) e a saída para teste
com um OSCILOSCOPIO está funcionando.
6 – Conclusões
A utilização do VHDL comportamental para a implementação de um circuito divisor de frequências
foi de fácil implementação e gerou o resultado esperado. Seu entendimento e sua lógica de
utilização são simples e demandam pouco tempo para conseguir entender seu mecanismo de
funcionamento.
Apêndice 1
Um codigo em VHDL pode ser estruturado de várias maneiras e há inúmeras funções disponíveis.
Nesse trabalho o conhecimento necessário de VHDL é básico e será feito um panorama geral e
simplificado.
As primeiras declarações do código VHDL são library e use. Elas permitem a utilização de um
package. Um package de VHDL contém subprogramas, definições de constantes, e/ou definições de
tipo para ser usado através de um ou mais sistemas. Cada package contém uma “seção de
declaração”, na qual o subprograma disponível (i.e. exportável), constantes e tipos são declarados,
e um “corpo do package”, no qual as implementações do subprograma são definidas, juntas com
qualquer constante ou tipos usados internamente. A seção de declaração representa a porção do
package que é “visível” ao usuário do package. A implementações de fato das subrotinas no
package não são tipicamente do interesse do usuário.
A segunda declaração é a entity. Essa é a parte principal do projeto, é a interface do Sistema que
descreve as entradas e saídas. Composta de duas partes: parameters e connections. Parameters
refere-se aos parâmetros, exemplo largura de barramento, são declarados como generics.
Connections por sua vez, refere-se como ocorre a transferência de informações, são declarados
como ports. O nome de uma entity deve identificar o sistema, podendo usar letras e números, porém
deve iniciar por uma letra.
A terceira declaração é a architecture.
A quarta declaração é process. Um process sequencial e independente representa o comportamento
de uma parte do sistema. O corpo do process é uma lista sequencial de declarações. A sequência de
declarações no process é executada em ordem, começando pela primeira. Depois da última
declaração do process ser executada, o process é repetido desde a primeira declaração e continua a
se repetir até ser suspenso. Se a lista de sensibilidade opcional é dada, uma wait on … declaração é
inserida depois da última declaração sequencial, causando a suspenção do processo naquele ponto
até que ocorra um evento em algum dos sinais na lista, nessa hora o process é reexecutado com a
primeira declação no process.
Uma função da library usada é a if/else. E como o próprio nome sugere é utilizada para realizar
comparações.
Um módulo VHDL é um arquivo com contém o código VHDL como um todo.
Com prática a organização de um código VHDL se mostrará de fácil estruturação, pois seu
mecanismo de funcionamento é simples, porém muito poderoso e abrangente.
Apêndice 2
Para se realizar uma simulação no ISE é utilizada a ferramenta do ISE chamada ISim. Para isso é
necessário mudar o modo view (que está localizado na barra de ferramentas logo acima do
esquemático de hierarquia) de implementation para simulation. Depois dê um clique em cima de
do processo de maior hierarquia (base_tempo) e em process dê um duplo clique em Behavioral
Check Syntax. Se não ocorrem erros e a sintaxe estiver correta, dê um duplo clique em Simulate
Behavioral Model e o ISim será aberto em uma nova janela. Na Figura 8 estão localizados os
botões citados.
Figura 8
Toda vez que uma nova simulação for ser executada, é necessário reiniciar o status do simulador.
Isso é feito clicando no botão restart (seta mais a esquerda das três). O tempo de execução da
simulação é determinado numa caixa do lado direito do botão restart. O botão com uma seta e uma
ampulheta inicia a simulação e essa terá a duração do tempo determinado pelo usuário. Para forçar
um clock ou um valor constante em uma entrada clique com o botão direito em cima da entrada
desejada (i.e. reset ou clk) e selecione o opção de interesse. Uma janela de configuração abrirá e ao
término da configuração clique em OK. A Figura 9 mostra a tela inicial do ISim e nela estão
localizados os itens citados anteriormente.
Figura 9

Documentos relacionados

Primeiro Trabalho de Sistemas Digitais

Primeiro Trabalho de Sistemas Digitais necessário escolher uma pasta que será a workspace. Nela, todos os arquivos necessários para o funcionamento da simulação e implementação do projeto serão salvos. Como cada conta possui um limite d...

Leia mais

Anotações relatório 1 O código cedido pelo professor

Anotações relatório 1 O código cedido pelo professor Para abrir o DCM, ao clicar em new sorce, selecionar o tipo IP CORE GENERATOR, colocar um nome que não seja simplesmente "DCM", por exemplo, DCMmeuNome. Na hora de dar os parâmetros ao DCM, desmarc...

Leia mais

Tutorial -‐ Xilinx ISE

Tutorial -‐ Xilinx ISE  Agora,  temos  um  projeto  (.xise)  pronto,  basta  adicionar     códigos-­‐fonte  VHDL  e  poderemos  trabalhar  com  os   modelos.  Para  importar  um ...

Leia mais