0% acharam este documento útil (0 voto)
7 visualizações9 páginas

Cronômetro Digital em Verilog FPGA

Enviado por

Ives Lima
Direitos autorais
© All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
0% acharam este documento útil (0 voto)
7 visualizações9 páginas

Cronômetro Digital em Verilog FPGA

Enviado por

Ives Lima
Direitos autorais
© All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd

Experimento 9

CRONÔMETRO DE TEMPO-REAL
Guilherme Costa Pimenta, 23/1036793
Ives Lima Franco, 23/1025987
Wallas Borges de Moura, 22/1016966
Grupo C2
1
Dep. Ciência da Computação – Universidade de Brası́lia (UnB)
CIC0231 - Laboratório de Circuitos Lógicos
231036793@[Link], 231025987@[Link], 221016966@[Link]

Abstract. The experiment consisted of designing and implementing a precision


real-time chronometer using the Verilog hardware description language. The
system was developed to operate on the Altera DE2 FPGA development kit,
utilizing the native 50MHz clock signal. A frequency divider was implemented
to achieve a time base with 1ms precision. The final circuit includes control
logic for start, stop, and reset functions, displaying the elapsed time up to 2
minutes on 7-segment displays. The results validated the synchronous design
concepts and the accuracy of the frequency division calculations.

Resumo. O experimento teve como objetivo projetar e implementar um


cronômetro de precisão capaz de operar em tempo real, utilizando a lingua-
gem de descrição de hardware Verilog. O sistema foi desenvolvido para o kit
de desenvolvimento FPGA Altera DE2, fazendo uso do sinal de clock nativo
de 50MHz. Foi implementado um divisor de frequência para obter uma base
de tempo com precisão de 1ms. O circuito final engloba lógicas de controle
para iniciar, parar e reiniciar a contagem, exibindo o tempo decorrido até o
limite de 2 minutos nos displays de 7 segmentos. Os resultados práticos valida-
ram os conceitos de projetos sı́ncronos e a exatidão dos cálculos de divisão de
frequência.

1. Introdução
A medição do tempo é uma necessidade humana que remonta à antiguidade, evoluindo de
observações astronômicas para dispositivos de alta precisão. Atualmente, o ”segundo”é
a unidade base de tempo no Sistema Internacional (SI), definido formalmente através de
transições atômicas do césio-133. No contexto da eletrônica digital, a precisão temporal
é garantida por sinais de clock estáveis.
Nos sistemas digitais modernos, como o kit FPGA DE2 utilizado neste labo-
ratório, todas as operações sı́ncronas são regidas por um oscilador mestre, que neste caso
opera a 50MHz. No entanto, para aplicações que interagem com a percepção humana
— como um cronômetro — essa frequência é elevada demais. Portanto, um dos desafios
fundamentais no design de temporizadores digitais é a criação de divisores de frequência
eficientes, que permitam converter oscilações de alta velocidade em unidades de tempo
compreensı́veis, como segundos ou milésimos de segundo.
Neste experimento, exploramos esses conceitos para construir um cronômetro fun-
cional, abordando desde a manipulação do sinal de clock até a interface visual com o
usuário.

2. Objetivos
O objetivo geral do experimento foi projetar, simular e montar um cronômetro digital. Os
objetivos especı́ficos incluı́ram:

• Desenvolver um divisor de frequência capaz de gerar uma base de tempo de 1ms


a partir do clock de 50MHz.
• Implementar a lógica de contagem hierárquica (milésimos, segundos e minutos)
até o limite de 2 minutos.
• Utilizar os displays de 7 segmentos para visualizar o tempo decorrido em tempo
real.
• Programar a interação com os botões da placa (KEY) para controlar o cronômetro:
– Start (KEY[1]): Inicia a contagem progressiva.
– Stop (KEY[2]): Pausa a contagem, mantendo o valor atual visı́vel.
– Reset (KEY[0]): Zera todos os contadores e reinicia o sistema.
• Validar o funcionamento lógico via simulação (Quartus-II) e o funcionamento
fı́sico na placa DE2.

3. Materiais
• Kit de desenvolvimento FPGA DE2 ou DE2-70.
• Software Quartus II v13.0.

4. Metodologia
Para o desenvolvimento do cronômetro, foi utilizado contadores em cascata, onde o pri-
meiro contador realiza a contagem com base na frequência do clock, enquanto os demais
são incrementados a partir do carry-out do contador anterior.

4.1. Divisão da frequência do clock de 50MHz


Antes de apresentar o esquema do cronômetro, é necessário compreender como o clock
padrão da placa foi utilizado para a atualização do contador base. A proposta central do
cronômetro é a implementação de um contador base décimos, centésimos e milésimos
de segundo, variando de 0 a 999, entretanto, o clock da placa opera a uma frequência de
50MHz, ou seja, gera 50 milhões de ciclos por segundo.
Logo foi necessário utilizar um divisor de frequência escrito em Verilog, dis-
ponı́vel na plataforma Aprender3 (COLOCAR REFERÊNCIA), esse código contém um
contador interno (count), inicializado em zero, que é incrementado a cada borda de su-
bida do clock, quando o contador atinge o valor de 25x 106 , a saı́da (clockout) inverte
sinal. Dessa forma, a saı́da permanece em um certo nı́vel lógico durante 25x106 ciclos de
clock e outros 25x106 ciclos no nı́vel lógico inverso, completando assim um perı́odo de
50 milhões ciclos do clock de entrada. Com isso, a frequência é dividida por 50 milhões,
resultando em um frequência de 1 Hz, ou seja, um ciclo por segundo.
Para que esse divisor de frequência gerasse pulsos na escala de milésimos de se-
gundos (10−3 ), foi necessário reduzir o valor de comparação do contador em três ordens
de grandeza, alterando a linha “if (count==25000000)” para “if (count==25000)”, ob-
tendo o código da Figura 1, e dessa forma, a frequência de saı́da passou a ser 1kHz,
resultando em mil ciclos de clock por segundo.

fdiv mili .v 
module fdiv_mili (clkin,clkout);
input clkin;
output reg clkout;

integer cont;

initial
cont=0;

always @(posedge clkin)


begin
if (cont==25000)
begin
cont<=0;
clkout<=˜clkout;
end
else
begin
cont<=cont+1;
clkout<=clkout;
end
end
endmodule

Figura 1. Código em Verilog divisor de frequência.

4.2. Implementação de um cronômetro de 2 minutos com precisão de 1 ms


Com a frequência adequada, é possı́vel compreender o funcionamento do cronômetro,
foram utilizados três contadores em cascata, o primeiro realiza a contagem de 0 a 999,
representando os milésimos de segundo; o segundo realiza a contagem de 0 a 59, repre-
sentando os segundos; e o terceiro realiza a contagem de 0 a 2, representando os minutos.
Todos os contadores possuem uma estrutura semelhante, foram escritos em Sys-
tem Verilog e apresentam como entradas os sinais de clock e reset, e como saı́da, é gerado
o sinal de incremento (inc), responsável por habilitar o avanço do próximo contador na
cascata. Além disso, são geradas as saı́das c, d e u, de 4 bits, correspondentes, respec-
tivamente, às centenas, dezenas e unidades do valor contado, uma vez que o primeiro
contador opera até 999, permitindo a conexão com display de 7 segmentos.
O funcionamento do contador base ocorre da seguinte forma: a cada borda de
subida de clock, a variável interna q, de 10 bits (suficiente para armazenar valores até
999), inicialmente igual a zero, é incrementada de uma unidade. Quando q atinge 999, o
sinal inc é ativado, indicando que o próximo contador deve ser incrementado, e a variável
q é reiniciada para zero. Para exibição em displays de 7 segmentos, o valor armazenado
em q é decomposto em seus respectivos dı́gitos, a centena (c) é obtida pela divisão inteira
de q por 100. Em seguida, a dezena (d) é calculada a partir do resto dessa divisão, dividido
por 10. Por fim, a unidade (u) é obtida pelo resto da divisão de q por 10.
Os outros dois contadores seguem a mesma lógica, com a diferença de apresen-
tarem limites inferiores de contagem e, portanto, menor número de dı́gitos associados
às saı́das. No contador de 0 a 59, o registrador q possui a quantidade de bits necessária
para representar esse intervalo. Já no contador de 0 a 2 o q representa a saı́da, portanto,
foi adotado um registrador de 4 bits, de modo a manter compatibilidade com o decodi-
ficador do display de sete segmentos, mesmo que apenas 2 bits sejam suficientes para a
representação. O contador de minutos não possui sinal de incremento, uma vez que não
há nenhum contador subsequente.
Por fim, todos os contadores dispõem de uma entrada de reset, que, quando acio-
nada, força o valor de q para zero, reiniciando a contagem.

Figura 2. Contador de 0 a 999. Figura 3. Contador de 0 a 59.

Figura 4. Contador de 0 a 2.
Para o funcionamento correto do cronômetro por meio dos botões start, pause
e reset, foi implementado um flip-flop de tratamento em System Verilog, possui como
entradas o clock, start, pause e reset, e como saı́das um sinal de enable e um sinal de reset
para os contadores. A cada borda de subida do clock (ou do próprio reset), o circuito
verifica qual dos botões está ativo naquele instante. Se o botão pause for acionado, tanto
enable quanto reset assumem nı́vel lógico baixo. Já quando o botão reset é pressionado, a
saı́da enable é desativada e a saı́da reset assume nı́vel lógico alto.
A saı́da reset deste flip-flop de tratamento é conectado às entradas de reset dos
três contadores. A saı́da enable é aplicado, em conjunto com o clock de 1 kHz, a uma
porta lógica AND de duas entradas, cujo resultado é utilizado como clock do contador de
milissegundos (0 a 999).
Dessa forma, ao pressionar o botão KEY1 (start), as saı́das do flip-flop de trata-
mento tornam-se enable = 1 e reset= 0, logo, a porta AND repassa os pulsos do clock de 1
kHz para o contador de milissegundos, que passa a contar normalmente. Ao atingir 999,
esse contador gera o sinal inc, o qual está conectado ao clock do contador de segundos.
Da mesma forma, quando o contador de segundos atinge 59, ele incrementa o contador
de minutos.
Ao pressionar o botão KEY0 (reset), as saı́das do flip-flop de tratamento passam
a enable = 0 e reset = 1, nessas condições, o contador de milissegundos deixa de receber
pulsos de clock e todos os contadores são resetados, retornando ao valor zero em suas
saı́das. Quando o botão KEY2 (pause) é acionado, as saı́das tornam-se enable = 0 e reset =
0, assim, a contagem é interrompida, porém sem reiniciar os contadores, que permanecem
armazenando o último valor contado.

Figura 5. Detector de 1001. Figura 6. Detector de 0101.

Figura 7. Detector de 0001.

Para que a contagem seja interrompida automaticamente ao atingir 2 minutos, foi


implementado um sistema de detecção de valores nas saı́das dos contadores. No contador
de milissegundos (0 a 999), foi utilizado um detector de valor 9 para cada um dos três
dı́gitos (centena, dezena e unidade). No contador de segundos (0 a 59), foram utilizados
detectores para os valores 5 e 9. Já no contador de minutos (0 a 2), foi utilizado um
detector para o valor 1.
As saı́das desses detectores foram conectadas a uma porta AND de seis entra-
das, cuja saı́da foi ligada a uma porta OR de duas entradas junto ao sinal do botão
KEY2(pause). A saı́da dessa porta foi conectada à entrada pause do flip-flop de trata-
mento, dessa forma, o cronômetro é pausado tanto manualmente (através do botão pause)
quanto automaticamente quando atinge 1:59:999.

Figura 8. Circuito cronômetro.

Durante a implementação, tentou-se inicialmente pausar a contagem em 2:00:000,


entretanto, observou-se que o display apresentava 2:00:00’,. assim, adotou-se a estratégia
de interromper a contagem 1 ms antes do valor final, garantindo que o display exiba
corretamente 2:00:000 como valor final.
Por fim, para a exibição do cronômetro, as saı́das dos contadores foram conecta-
das a decodificadores para display de 7 segmentos, cujas saı́das foram ligadas aos displays
HEX correspondentes da placa. Os displays HEX0 e HEX7 não foram desligados e per-
maneceram exibindo o valor “8” durante todo o funcionamento do cronômetro.
5. Resultados Obtidos

Figura 9. Simulação funcional.

Figura 10. Simulação temporal.

6. Conclusão
A realização deste experimento consolidou o entendimento sobre o funcionamento de
circuitos sequenciais e a importância do gerenciamento de tempo em sistemas digitais.
A construção do cronômetro demonstrou que, embora a contagem de tempo possa pa-
recer uma tarefa trivial com a tecnologia atual, ela exige um planejamento rigoroso das
máquinas de estado e dos divisores de clock para garantir precisão.
O uso da linguagem Verilog, System Verilog facilitou a descrição do hardware,
permitindo criar uma estrutura modular e escalável. Conclui-se que o projeto foi bem-
sucedido, pois todos os requisitos de funcionalidade e precisão foram atendidos, resul-
tando em um dispositivo confiável e capaz de operar conforme as especificações de um
cronômetro de tempo real.
5. Teste de Autoavaliação
1. Qual a frequência de saı́da de um divisor de frequências que possua Fator=18 e
uma frequência de clock de entrada de 10MHz? (Letra: A)
2. Qual o valor do Fator de um divisor de frequência precisa ter para obter uma
frequência de 6MHz a partir de uma frequência de 40MHz? (Letra: D)
3. Qual deve ser a frequência de entrada de um divisor de frequências com Fator=25
de modo que a frequência de saı́da seja 20MHz? (Letra: C)
Referências

UNIVERSIDADE DE BRASÍLIA (UnB). Roteiro Prático: CRONÔMETRO DE


TEMPO-REAL. Disponı́vel em: [Link]
php/3207085/mod_resource/content/10/[Link]. Acesso em:
28 nov. 2025.
UNIVERSIDADE DE BRASÍLIA (UnB). Alocação de pinos DE2. Dis-
ponı́vel em: [Link]
mod_page/content/16/DE2_pin_assignments.csv. Acesso em: 24 out.
2025.
YOUTUBE. Grupo C2 - Experimento Oito: CONTADORES ASSÍNCRONOS
E SÍNCRONOS. Disponı́vel em: [Link]
HPSnVteRZrxHDBqZ. Acesso em: 25 nov. 2025.

Você também pode gostar