Você está na página 1de 7

Departamento de Ciência da Computação

GCC113 – Circuitos Digitais


Circuitos Contadores

1. Usando o software Quartus II 9.0sp2 Web Edition, projete e implemente


no kit UP1 um circuito capaz de contar os segundos de 00 a 99, exibindo
os valores nos displays de sete segmentos. Após chegar ao segundo 99, o
circuito volta para o 00. Além disso, haverá um botão responsável por
resetar a contagem dos segundos em qualquer momento. A Figura 1
apresenta a visão geral do circuito.

Figura 1: Visão geral do circuito.

O circuito deverá ser feito usando a linguagem Verilog.

2. Passo-a-passo

Inicialmente, deverá ser criada uma nova pasta em seu pendrive ou na


área de trabalho. Em seguida, usando o New Project Wizard do Quartus II, crie
um novo projeto alterando o diretório de destino para dentro dessa nova pasta.
Após criar o projeto, crie um novo arquivo em verilog, que deve ser salvo
com o mesmo nome do projeto. Este arquivo será o arquivo principal do projeto.
Como esse arquivo será o arquivo do topo da hierarquia, ele deverá declarar as
entradas e saídas do circuito. O código a seguir ilustra a declaração do módulo
principal.
// no me_ do_ proj eto .v
modul e n ome _do_ pro jeto (PB2, CL K, DISP LAY 1, D ISPLA Y2) ;
input PB 2, CL K ;
out put [6: 0 ] D ISPLA Y1 , DI SPLA Y2 ;

// Aq ui dev erá ser fei ta a dec lar ação de wir es ne ces sár ios

// Aq ui dev erá ser fei ta a ins tan ciaç ão e li gação do s s ubmó dul os d o
circu ito

endmo dul e

Depois de escrever este código inicial, o projeto já pode ser compilado.


Tendo compilado com sucesso, podemos antecipar a etapa de definição dos
pinos no Pin Planner. Os pinos devem ser definidos de acordo com a tabela
abaixo.

Node name Location Node name Location


CLK PIN_91 PB2 PIN_29
DISPLAY1[6] PIN_6 DISPLAY2[6] PIN_17
DISPLAY1[5] PIN_7 DISPLAY2[5] PIN_18
DISPLAY1[4] PIN_8 DISPLAY2[4] PIN_19
DISPLAY1[3] PIN_9 DISPLAY2[3] PIN_20
DISPLAY1[2] PIN_11 DISPLAY2[2] PIN_21
DISPLAY1[1] PIN_12 DISPLAY2[1] PIN_23
DISPLAY1[0] PIN_13 DISPLAY2[0] PIN_24

É importante mencionar que o pino 91 é o pino de clock disponível na


placa, com frequência de 25,175 MHz. E o pino 29 é um dos botões (push
buttons) existentes no kit.
Agora que as entradas e saídas do circuito estão definidas na declaração
do módulo e os pinos estão devidamente configurados, podemos desenvolver a
estrutura interna do circuito. A estrutura interna pode ser vista na Figura 2.
Para fazer um circuito contador de segundos de 00 até 99, podemos
pensar no funcionamento do circuito da seguinte maneira: precisaremos de um
contador de 0 a 9 para as unidades (units) e outro contador de 0 a 9 para as
dezenas (tens). O contador de unidades deve gerar um sinal para o contador de
dezenas sempre que ele finalizar um ciclo (max), ou seja, quando chegar no 9 e
estiver prestes a retornar para o 0. O contador de dezenas, por sua vez, deve
incrementar o valor de sua contagem quando receber esse sinal do contador de
unidades. Quando o contador de dezenas chegar ao 9, voltará para o 0 no
próximo incremento. Portanto, são dois contadores módulo 10. Além disso, os
dois contadores possuirão uma entrada de reset para permitir zerar o valor da
contagem em qualquer momento e uma saída q de 4 bits correspondente ao
valor da contagem em binário. Os dois valores da contagem, as unidades e as
dezenas, devem ser enviados para dois decodificadores de BCD para sete
segmentos (BCD_to_sseg). Os decodificadores enviam então a saída sseg
diretamente para as saídas DISPLAY1 e DISPLAY2.

Figura 2: Estrutura interna do circuito.

Resta falar sobre o circuito que irá ativar o incremento do contador de


unidades. Na Figura 2, esse componente está nomeado como tick_1hz. Esse
componente nada mais é do que outro contador que recebe como entrada o
clock de 25,175MHz e produz um sinal de saída (max) que fica ativado uma vez
a cada 25.175.000 ciclos de clock. Ou seja, o sinal de saída max, ficara ativo
uma vez a cada segundo. Dessa forma, o sinal max possui uma frequência de
ativação de 1Hz, gerando o sinal que necessitamos para ativar o incremento do
contador de unidades. Esse contador é um contador módulo 25.175.000.
Observe que todos os componentes possuem o mesmo clock, sendo,
portanto, um sistema síncrono. Quem controla quando cada contador irá
incrementar é a sua entrada enable.
Note que, em nosso circuito representado na Figura 2, temos apenas dois
componentes diferentes que se repetem: o contador e o decodificador de BCD
para sete segmentos. Isso significa que precisaremos de mais dois arquivos em
Verilog.
O decodificador de BCD para sete segmentos é muito parecido com o que
já foi usado em outras práticas, que foi o decodificador de hexadecimal para sete
segmentos. A diferença para o BCD é que os números podem ir somente de 0
até 9. O código está disponível a seguir. Crie um novo arquivo no projeto
chamado BCD_to_sseg.v com esse código.
// BC D_t o_s seg. v
modul e B CD_ to_s seg (bcd , dis pla y);

input [3 :0] bcd ;


outpu t r eg [6:0 ] d ispl ay;

alway s @( bcd )
begin
case ( bcd )
4'h0: di spl ay < = 7 'b00 00001 ;
4'h1: di spl ay < = 7 'b10 01111 ;
4'h2: di spl ay < = 7 'b00 10010 ;
4'h3: di spl ay < = 7 'b00 00110 ;
4'h4: di spl ay < = 7 'b10 01100 ;
4'h5: di spl ay < = 7 'b01 00100 ;
4'h6: di spl ay < = 7 'b01 00000 ;
4'h7: di spl ay < = 7 'b00 01111 ;
4'h8: di spl ay < = 7 'b00 00000 ;
4'h9: di spl ay < = 7 'b00 00100 ;
defau lt : di spla y < = 7' b0000 001 ;
endca se
end
endmo dul e

Para implementar o contador, podemos criar um novo arquivo verilog,


counter.v. Esse contador será por padrão com capacidade para 4 bits e será
módulo 10. Porém, ao definirmos isso como parameter, poderemos depois
alterar esses valores na criação do componente no arquivo principal, como será
mostrado mais adiante.
O código para o contador está logo abaixo.
modul e c oun ter
#(
param ete r N = 4 ;
param ete r M OD = 10
)

(
input wi re cloc k, rese t, en abl e,
outpu t w ire [N - 1:0 ] q,
outpu t m ax_ tick
);

reg [ N -1 :0] q_r eg;


wire [N - 1:0 ] q_ nex t;
alway s @( pos edge cl ock, nege dge re set)
begin
if (re set == 1'b 0)
q_reg <= 0;
else if ( ena ble == 1'b1 )
q_reg <= q_ next ;
end

assig n q _ne xt = (q _reg == M OD - 1)? 1'b 0 : q_r eg + 1'b 1;


assig n m ax_ tick = (q_r eg == MO D -1 )? 1 'b1 : 1 'b0;
assig n q = q_re g;

endmo dul e

Finalmente, podemos concluir a implementação do arquivo principal.


Observe a Figura 2 novamente e veja quais sinais intermediários (wires) deverão
ser declarados e esteja atento se eles são de apenas 1 bit ou se são vetores de
bits. Faça as declarações necessárias.
Após declarar os wires, é hora de criar os componentes. Faça da mesma
forma que fizemos em outras aulas, semelhante ao exemplo a seguir:
counter units_counter (CLK, PB2, en_units, units, en_tens);
Observe que o enable para o contador de dezenas recebe o resultado de
uma operação and entre en_tens e en_units.
Ao criar o componente tick_1hz, podemos alterar o valor padrão dos
parâmetros N e MOD. Como será um contador módulo 25.175.000, são
necessários 28 bits. A declaração deve ser feita da seguinte forma:
counter #(28, 25_175_000) tick_1hz (CLK, PB2, 1'b1, null, en_units);
Assim, o contador tick_1hz não possuirá os valores padrão para N e MOD,
mas sim os valores passados na linha de código acima: N = 28 e MOD =
25.175.000.
Declare também os decodificadores BCD para sete segmentos e faça a
ligação entre todos os componentes conforme a Figura 2.
Avise o Quartus II que este projeto possui um clock de 25.175 MHz para
que ele verifique se o circuito gerado atende aos requisitos temporais
necessários para executar corretamente. Para isso, acesse Assignments-
>Settings e selecione a categoria Classic Timing Analyzer Settings.
Clique em Individual Clocks... conforme a Figura 3. Na janela que abrir,
clique em New. A janela que abrirá após clicar em New deverá ser preenchida
com as informações sobre o clock do circuito, conforme a Figura 4. Após
preencher, clique em OK até retornar para a tela principal do Quartus II.
Figura 3: Classic Timing Analyzer Settings.

Figura 4: Inserindo as informações sobre o CLK.


Compile o seu projeto e verifique, por meio do RTL Viewer, se o seu
projeto está de acordo com a Figura 2.
Além disso, acesse o Compilation Report (janela que se abre após a
compilação) e veja o relatório sobre as informações temporais do projeto,
conforme a Figura 5. Caso não haja nenhuma informação na cor vermelha é
porque os requisitos de tempo foram atendidos para o clock do circuito.

Figura 5: Compilation Report - Timing Analyzer Summary.

Programe o kit.

Após concluir, apresente o circuito funcionando no kit UP1 ao Professor.

Você também pode gostar