Geração de Clock
Parte da seção Fundamentos do Journey de Verilog da Coddy — lição 71 de 90.
Um clock é um sinal que alterna continuamente entre 0 e 1 em intervalos regulares. Clocks são essenciais para a lógica sequencial, como flip-flops e contadores.
Por que Gerar um Clock
Em testbenches, você precisa de um clock para testar circuitos sequenciais. O clock define o comportamento de flip-flops, registradores e máquinas de estado.
Métodos para Gerar um Clock
| Método | Descrição |
|---|---|
always com atraso # | Método mais comum |
Loop forever | Método alternativo |
Loop repeat | Para um número fixo de ciclos |
Método 1: Bloco Always com Atraso
reg clk;
initial begin
clk = 0;
end
always #5 clk = ~clk;clk = 0no tempo 0- A cada 5 unidades de tempo,
clkalterna
- Período = 10 unidades de tempo
- Frequência = 1/10 = 0.1 por unidade de tempo
Método 2: Loop Forever
reg clk;
initial begin
clk = 0;
forever begin
#5 clk = ~clk;
end
endMesmo resultado que o método always.
Método 3: Repetir por Ciclos Fixos
reg clk;
initial begin
clk = 0;
repeat (10) begin
#5 clk = ~clk;
end
endGera exatamente 10 bordas de clock (5 ciclos completos) e depois para.
Desafio
Adicione o código que falta para gerar um clock que alterna a cada 4 unidades de tempo (período = 8 unidades de tempo).
O que fazer:
- Inicialize
clkcomo 0 no tempo 0 usando um blocoinitial - Use um bloco
alwayscom um atraso para alternarclka cada 4 unidades de tempo
Folha de consulta
Um clock alterna entre 0 e 1 em intervalos regulares. Período = 2 × atraso.
Método 1: Bloco always (mais comum)
reg clk;
initial begin
clk = 0;
end
always #5 clk = ~clk; // Período = 10Método 2: Loop forever
initial begin
clk = 0;
forever #5 clk = ~clk;
endMétodo 3: Repeat (número fixo de bordas)
initial begin
clk = 0;
repeat(10) #5 clk = ~clk; // 10 bordas = 5 ciclos
endExperimente você mesmo
module clock_challenge;
reg clk;
// TODO: Passo 1 - Adicione um bloco initial para definir clk = 0
// TODO: Passo 2 - Adicione um bloco always para alternar o clk a cada 4 unidades de tempo
initial begin
$monitor("Time %0t: clk = %b", $time, clk);
#20;
$display("Clock generated for 20 time units");
$finish;
end
endmoduleEsta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Fundamentos
1Introdução
O que é VerilogHardware vs SoftwareNíveis de Abstração de ProjetoSeu Primeiro MóduloComentários4Operadores Parte 1
Operadores AritméticosOperador de MóduloOperadores de ComparaçãoRecapitulação - Matemática SimplesOperadores Bitwise7Atribuição e Portas Lógicas
Atribuição ContínuaAtribuição com OperadoresPrimitivas de Portas IntegradasPortas AND, OR e NOTPortas XOR e XNORRecapitulação - Circuito de Portas Lógicas10Tomada de Decisão
Instrução IfIf - ElseRecapitulação - Comparador SimplesInstrução CaseCasex e CasezRecapitulação - Projeto de ALU13Temporização e Atrasos
O que são AtrasosAtrasos de PortaAtrasos de AtribuiçãoDiretiva TimescaleGeração de ClockRecapitulação - Controle de Temporização2Tipos de Dados
Tipo WireTipo RegInteger e RealVetoresArraysParâmetrosRecapitulação - Declarar Sinais5Operadores Parte 2
Operadores LógicosOperadores de ReduçãoOperadores de DeslocamentoOperador de ConcatenaçãoOperador CondicionalRecapitulação - Desafio de Operadores3Sistemas de Numeração
Representação BináriaNúmeros com Tamanho DefinidoNúmeros sem Tamanho DefinidoNúmeros NegativosValores Especiais X e ZRecapitulação - Formatos de Números6Módulos
Estrutura de MóduloPortas de Entrada e SaídaPortas InoutInstanciação de MóduloMapeamento de Portas por NomeMapeamento de Portas por OrdemRecapitulação - Construa um Módulo