Objetivo
O primeiro trabalho consiste em implementar um
circuito contador de moedas restrito às moedas antigas de
R$0,01, R$0,05, R$0,10, R$0,50 e R$1,00.
|
Esquema dos Sensores do Contador de Moedas |
Utilize a entidade abaixo:
entity contador is
generic (nciclos : positive := 7);
port (clk : in std_logic;
resetn : in std_logic;
sensor : in std_logic_vector(0 to 4);
total : out natural
);
end entity contador;
Todos os nomes devem ser idênticos aos descritos acima. Use a seguinte
convenção para os sinais:
nciclos | Número de ciclos para considerar o sinal de
entrada estável (veja detalhes sobre o debounce abaixo) |
clk | Clock ativo em borda de subida |
resetn | Reset do circuito, ativo em zero. Quanto
ocorrer um reset, o valor total deve ser transformado em
zero |
sensor | Vetor dos sinais dos sensores. sensor(i) = '1' significa que existe um objeto bloqueando o i-ésimo sensor. |
total | Valor total até o momento. O valor total deve
ser atualizado sempre que, e apenas quando, a moeda terminar de passar
pelos sensores. |
Seu circuito deve ser síncrono e só efetuar alterações na saída nos pulsos de subida de clk.
Debounce
Todos os sinais provenientes de sensores podem sofrer oscilações
indesejadas durante as transições. Essas oscilações devem ser
removidas através de um circuito especial para efetuar o debounce do
sinal. Para elimina-las, o circuito de debounce deve apenas considerar
estável um sinal que tenha o mesmo valor por n ciclos sucessivos.
Faça seu circuito parametrizável (use generic).
Exemplo
A figura abaixo mostra um exemplo de entradas para o contador de moedas:
Observe os seguintes detalhes:
- O sensor 4 não pode ser considerado se trabalharmos com mais de 3 ciclos de debounce (em azul);
- O sensor 0 não será considerado pela segunda vez se trabalharmos com mais de 2 ciclos de debounce (em amarelo);
- A contagem da moeda só deve ser feita no tempo indicado em
verde (assuma neste caso que o debounce é feito com nciclos=3).
Nesse exemplo, dado que o sensor 3 ficou estável por mais de nciclos=7
ciclos, a moeda contada é de R$0,50 (o caso em verde é apenas um
exemplo e a contagem real deve acontecer mais adiante).
Testbench
Aqui estão dois Testbenches para esse trabalho. Segue uma breve
descrição de cada um juntamente com os arquivos necessários:
Testbench Simples
Esse Testbench é uma versão simplificada, mas suficiente para
muitos módulos de hardware simples como esse. Ele apenas lê de um
arquivo de entrada os valores dos sinais em cada unidade de tempo
e fornece essas entradas para o módulo a ser testado ao mesmo
tempo em que coleta as saídas e grava em outros dois arquivos: um
apenas com o tempo e a saída e o outro também com a entrada.
Arquivos:
tb_contador_base.vhd,
contador.base.input,
contador.base.expected.
O arquivo tb_contador_base.vhd deve ser usado como entidade de
mais alto nível do seu projeto.
Testbench Detalhado
Esse Testbench é capaz de receber comandos do arquivo de
configuração. Observe que, pelo Testbench anterior, a entrada
ficaria extremamente repetitiva, então essa versão permite que
sejam especificados comandos como:
Comando | Descrição |
r | Ativa o sinal de reset por 8 ciclos de
clock |
s nciclos sensor_value | Durante nciclos de clock mantém os
sensores com o valor especificado (sensor_value) |
c nciclos coin | Simula a inserção de uma moeda de
valor coin, fazendo todas as transições necessárias e gastando
nciclos entre cada novo valor |
Embora nessa verao seja mais simples de implementar uma grande
quantidade de testes, é necessário maior tempo de programação para
desenvolver o módulo do Testbench.
Arquivos:
tb_contador.vhd,
contador.input,
contador.expected.
O arquivo tb_contador.vhd deve ser usado como entidade de
mais alto nível do seu projeto.