MO801/MC912 - Trabalho 1: Contador de Moedas

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.
Diagrama do Contador de
       Moedas
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:
nciclosNúmero de ciclos para considerar o sinal de entrada estável (veja detalhes sobre o debounce abaixo)
clkClock ativo em borda de subida
resetnReset do circuito, ativo em zero. Quanto ocorrer um reset, o valor total deve ser transformado em zero
sensorVetor dos sinais dos sensores. sensor(i) = '1' significa que existe um objeto bloqueando o i-ésimo sensor.
totalValor 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: Exemplo do Contador de Moedas Observe os seguintes detalhes: 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:
ComandoDescrição
rAtiva o sinal de reset por 8 ciclos de clock
s nciclos sensor_valueDurante nciclos de clock mantém os sensores com o valor especificado (sensor_value)
c nciclos coinSimula 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.