O projeto descrito a seguir é um exemplo de circuito sequencial descrito em VHDL através de uma função do Quartus II, a Megafunção. Ela gera um componente a partir de especificações passadas pelo usuário através de um assistente, parecido com o utilizado para criar um projeto. Uma vez especificado, o assistente gera o componente e um template para a declaração e outro pra instanciação, o que torna possível a realização de um bloco de lógica complexo de forma rápida até mesmo para um usuário pouco experiente.
A lógica descrita neste projeto pode ser utilizada para implementação de projetos maiores.
Componentes utilizados:
Figura 1 - Diagrama de Blocos do projeto.
A memória deve permitir tanto a escrtita quanto a leitura de dados.
Para a escrita de dados, deve-se colocar o dado que se deseja escrever, o endereço no qual será escrito e manter o ESCRITA em nível lógico alto. Com um pulso de CLOCK IN, as entradas serão registradas então a escrita terá sido completa. Se quisermos ver o que foi escrito basta fornecer um pulso de CLOCK OUT.
Para a leitura de dados, o ESCRITA deve estar em nível lógico baixo e deve-se colocar o endereço a ser lido. Um pulso de CLOCK IN fará com que o comando seja registrado. Um pulso de CLOCK OUT fará com que a saída seja atualizada e registrada.
Primeiramente, abrimos o MegaWizard. Abrimos a opção Tools e MegaWizard Plug-In Manager.
Figura 2 - Seleção da ferramenta.
Uma vez aberto, pode-se selecionar a opção de criar uma nova função. Observe que o Megawizard auxilia também na edição de megafunções já criadas e na criação de megafunções a partir de outras.
Figura 3 - Primeira etapa da criação da Mega Função.
Se selecionado para criar uma megafunção a partir do zero, deve-se selecionar o tipo Megafunção que se deseja. Esta etapa irá definir como o componente irá se comportar.
Figura 4 - Seleção do tipo de componente que se deseja.
Após a definição do modelo, podemos definir algumas características do comportamento. Neste caso, escolhemos a opção de registrar as entradas e as saídas da memória.
Figura 5 - Seleção de características.
Por ser uma memória, pode-se optar por dar um valor inicial para ela. Neste caso não será utilizado esta opção, porém em outros projetos cria-se um arquivo .mif ou .hex para gerar a memória com valores iniciais já estabelecidos, como no projeto VGA para FPGA.
Figura 6 - Seleção do valor inicial da memória.
O Megawizard adiciona bibliotecas para uma posterior simulação.
Figura 7 - Bibliotecas a serem adicionadas para a simulação.
Pode-se escolher os arquivos a serem criados pelo Megawizard. Ele possui a opção de gerar um arquivo em AHDL, um .bsf e um template da instanciação do componente criado.
Figura 8 - Arquivos que podem ser criados pelo Megawizard.
Após finalizar, o componente terá sido criado. Para utilizá-lo, basta adicionar ao projeto.
Na entidade, definimos as estradas e saídas do projeto.
Depois, fazemos a declaração do componente. Podemos pegar o template gerado pelo Quartus II e colar diretamente na arquitetura.
Figura 9 - Template da declaração do componente.
Uma vez declarado o componente, vamos associar suas entradas e saídas com os sinais do projeto, de acordo com a lógica desejada. Mais uma vez o Quartus gera um template que pode facilitar bastante o trabalho.
Figura 10 - Template da instanciação do componente.
Para a simulação, foram inseridos e lidos dados da memória seguindo a ordem necessária para tais operações. Foram feitas as seguintes operações:
Escreveu-se o dado "10101010" no endereço "00".
Escreveu-se o dado "11001100" no endereço "01".
Leu-se o dado no endereço "00".
Leu-se o dado no endereço "01".
O código abaixo apresenta a simulação da escrita de um dado.
O código abaixo apresenta a simulação da escrita de um dado.
Os nomes utilizados no testbench foram os mesmos utilizados no projeto, lembrando que isso não é necessário e a atribuição depende da ordem em que aparece no projeto e na declaração de UUT. O resultado da simulação pode ser visto abaixo na janela do ModelSim-Altera:
Figura 11 - Simulação da Mega Memória
Figura 12 - Montagem do projeto.
O projeto implementado utiliza um kit CPLD 7064, onde será gravado o projeto. A placa de LEDs irá com CON1, as duas placas de chaves no CON2 e CON3 e a placa de botões no CON4.
A montagem pode ser feita como na ilustração abaixo, feita no Fritizing:
Figura 13 - Esquema proposto.
Com base na montagem feita e na pinagem da placa, podemos definir a pinagem do componente:
Figura 14 - Pinagem proposta para o projeto.
Para o download do projeto completo, clique aqui.
O arquivo está no formato "zip", e inclui, entre outros:
- O arquivo de projeto do Quartus ".qpf"
- A descrição no formato VHDL ".vhd"
- O Testbench no formato VHDL ".vhd"
- O arquivo para gravação do CPLD, no formato ".pof".