Este repositório contém a implementação de um cronômetro digital com memória, desenvolvido em Verilog para a disciplina de Tecnologia e Hardware Reprogramável. O projeto foi projetado para ser sintetizado e executado em uma placa FPGA Altera Cyclone II.
O sistema realiza uma contagem de 0 a 59 segundos e 0 a 99 centésimos de segundo , com funcionalidades de início, parada, reinicialização e armazenamento de até 4 marcações de tempo em uma memória interna.
O sistema é controlado pelos seguintes botões e chaves da placa:
KEY0(KEY_RESET): Quando pressionada, reinicia a contagem do cronômetro para00:00.SW0(SW_RUN): Atua como um controle de contagem.1: Inicia ou continua a contagem.0: Suspende a contagem.
KEY1(KEY_WRITE): Armazena o tempo atual do cronômetro em uma das 4 posições da memória interna, de forma sequencial (0 -> 1 -> 2 -> 3 -> 0).KEY2(KEY_READ): Exibe no display o tempo armazenado na memória, avançando sequencialmente pelas posições a cada pressionamento.SW1(SW_DISPLAY_MODE): Chave seletora para o que é exibido nos displays.1: Mostra a contagem corrente do cronômetro.0: Mostra o valor lido da memória.
O desenvolvimento do projeto foi concluído. Todos os módulos foram implementados, integrados e validados através de simulação funcional. O sistema está pronto para ser sintetizado e programado na placa FPGA Altera Cyclone II.
-  Módulo 1: Divisor de Frequência
- Código Verilog implementado e comentado.
 - Módulo validado via simulação funcional.
 
 -  Módulo 2: Detector de Transição
- Código Verilog implementado e comentado.
 - Módulo validado via simulação funcional.
 
 -  Módulo 3: Contador do Cronômetro
- Código Verilog para contagem BCD de segundos e centésimos implementado.
 
 -  Módulo 4: Memória Interna
- Código Verilog para armazenamento de 4 tempos implementado.
 - Módulo validado via simulação funcional.
 
 -  Módulo 5: Integração Top-Level
-  Todos os submódulos foram integrados no módulo 
cronometro.v. - Lógica de controle e seleção de display implementada.
 
 -  Todos os submódulos foram integrados no módulo 
 -  Finalização e Verificação
- Atribuição final de todos os pinos de I/O no Pin Planner.
 -  Criação do arquivo de simulação para o sistema completo (
sim_cronometro.vwf). 
 
/projeto-cronometro-fpga/
├── doc/         # Contém a documentação (roteiros, manuais, etc.)
├── quartus/     # Arquivos do projeto Quartus II (.qpf, .qsf)
├── rtl/         # Código-fonte em Verilog (.v)
├── sim/         # Arquivos de simulação (.vwf)
└── README.md
O código-fonte do projeto é modular e está dividido nos seguintes arquivos:
cronometro.v: Módulo Top-Level que integra todos os outros componentes e conecta a lógica aos pinos físicos da FPGA.divisor_clock.v: Gera um sinal de clock de 100 Hz a partir do oscilador de 50 MHz da placa, usado como base para a contagem de centésimos de segundo.contador_cronometro.v: Implementa a lógica de contagem de 0 a 59 segundos e 0 a 99 centésimos no formato BCD.detector_transicao.v: Cria um pulso de clock único para cada pressionamento de botão (KEY_WRITE,KEY_READ), evitando múltiplas ativações indesejadas (debouncing).memoria.v: Armazena até 4 marcações de tempo (16 bits cada) em um banco de registradores.decodificador_7seg.v: Converte os valores BCD de 4 bits de cada dígito para o formato de 7 segmentos a ser exibido nos displays.
- Software de Síntese: Intel Quartus II (Versão 9.1 SP2 Web Edition)
 - Linguagem: Verilog HDL
 - Dispositivo Alvo:
- Família: Cyclone II
 - Dispositivo: EP2C20F484C7
 
 
A tabela a seguir detalha a conexão entre as portas do módulo Verilog de nível superior (cronometro.v) e os pinos físicos da placa FPGA DE1.
| Sinal (Porta no Top-Level) | Componente na Placa | Pino no FPGA | 
|---|---|---|
CLOCK_50 | 
50MHz Oscillator | PIN_L1 | 
KEY_RESET | 
Push-button KEY0 | 
PIN_R22 | 
SW_RUN | 
Toggle Switch SW0 | 
PIN_L22 | 
KEY_WRITE | 
Push-button KEY1 | 
PIN_R21 | 
KEY_READ | 
Push-button KEY2 | 
PIN_T22 | 
SW_DISPLAY_MODE | 
Toggle Switch SW1 | 
PIN_L21 | 
| Sinal (Porta no Top-Level) | Componente na Placa | Pino no FPGA | 
|---|---|---|
HEX0[6:0] (Centésimos, LSB) | 
Display HEX0 | 
|
HEX0[0] | 
HEX0 - Segmento 0 | PIN_J2 | 
HEX0[1] | 
HEX0 - Segmento 1 | PIN_J1 | 
HEX0[2] | 
HEX0 - Segmento 2 | PIN_H2 | 
HEX0[3] | 
HEX0 - Segmento 3 | PIN_H1 | 
HEX0[4] | 
HEX0 - Segmento 4 | PIN_F2 | 
HEX0[5] | 
HEX0 - Segmento 5 | PIN_F1 | 
HEX0[6] | 
HEX0 - Segmento 6 | PIN_E2 | 
HEX1[6:0] | 
Display HEX1 | 
|
HEX1[0] | 
HEX1 - Segmento 0 | PIN_E1 | 
HEX1[1] | 
HEX1 - Segmento 1 | PIN_H6 | 
HEX1[2] | 
HEX1 - Segmento 2 | PIN_H5 | 
HEX1[3] | 
HEX1 - Segmento 3 | PIN_H4 | 
HEX1[4] | 
HEX1 - Segmento 4 | PIN_G3 | 
HEX1[5] | 
HEX1 - Segmento 5 | PIN_D2 | 
HEX1[6] | 
HEX1 - Segmento 6 | PIN_D1 | 
HEX2[6:0] (Segundos, LSB) | 
Display HEX2 | 
|
HEX2[0] | 
HEX2 - Segmento 0 | PIN_G5 | 
HEX2[1] | 
HEX2 - Segmento 1 | PIN_G6 | 
HEX2[2] | 
HEX2 - Segmento 2 | PIN_C2 | 
HEX2[3] | 
HEX2 - Segmento 3 | PIN_C1 | 
HEX2[4] | 
HEX2 - Segmento 4 | PIN_E3 | 
HEX2[5] | 
HEX2 - Segmento 5 | PIN_E4 | 
HEX2[6] | 
HEX2 - Segmento 6 | PIN_D3 | 
HEX3[6:0] (Segundos, MSB) | 
Display HEX3 | 
|
HEX3[0] | 
HEX3 - Segmento 0 | PIN_F4 | 
HEX3[1] | 
HEX3 - Segmento 1 | PIN_D5 | 
HEX3[2] | 
HEX3 - Segmento 2 | PIN_D6 | 
HEX3[3] | 
HEX3 - Segmento 3 | PIN_J4 | 
HEX3[4] | 
HEX3 - Segmento 4 | PIN_L8 | 
HEX3[5] | 
HEX3 - Segmento 5 | PIN_F3 | 
HEX3[6] | 
HEX3 - Segmento 6 | PIN_D4 | 
- Higor Cavalcante (@WigoWigo10)
 - Ricardo Lucca (@ricohd22)
 - Luis Guilherme (@Asteeeeee)
 - Lucas Kramer
 - Schaidson Souza
 
- Clone este repositório.
 - Abra o arquivo 
quartus/cronometro.qpfno Quartus II. - Para testar um módulo individualmente, defina-o como "Top-Level Entity" no menu de arquivos do projeto.
 - Inicie a compilação (
Processing > Start Compilation). - Para simular, abra o arquivo 
.vwfcorrespondente ao módulo na pastasim/, configure os estímulos de entrada e execute o simulador (Processing > Simulator Tool).