```vhdl
biblioteca ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entidade square_wave_generator é
porto (
clk:em std_logic;
redefinir:em std_logic;
frequência:em std_logic_vector (7 até 0); -- Frequência de entrada em Hz (0-255)
output_signal:saída std_logic
);
entidade final square_wave_generator;
arquitetura comportamental de square_wave_generator é
contador de sinal:não assinado (7 até 0);
sinal half_period:sem sinal (7 até 0);
começar
- Calcular meio período com base na entrada de frequência
half_period <=10000000 / (2 * sem sinal (frequência)); -- 10000000 =frequência de clock de 10 MHz
processo (clk, redefinir)
começar
se redefinir ='1' então
contador <=(outros => '0');
sinal_saída <='0';
elsif borda_ascendente(clk) então
se contador =half_period - 1 então
contador <=(outros => '0');
output_signal <=não output_signal;
outro
contador <=contador + 1;
terminar se;
terminar se;
processo final;
arquitetura final comportamental;
```
Explicação: 1.
Declaração da Entidade: - Define a entidade `square_wave_generator` com portas para clock, reset, entrada de frequência (8 bits) e sinal de saída.
2.
Arquitetura: - Utiliza a arquitetura `comportamental` para descrever a lógica.
3.
Sinais: - `counter`:Um contador não assinado de 8 bits para gerar a forma de onda.
- `half_period`:Um sinal sem sinal de 8 bits que representa o meio período da onda quadrada (calculado com base na frequência de entrada).
4.
Cálculo do Meio Período: - A linha `half_period <=10000000 / (2 * unsigned(frequency));` calcula o meio período com base na frequência de entrada e uma frequência de clock de 10MHz. Ajuste o valor `10000000` se a frequência do clock for diferente.
5.
Processo: - O processo é sensível aos sinais de relógio e reset.
- Realiza o seguinte:
-
Redefinir lógica: Se `reset` for alto, o contador será zerado e a saída será definida como baixa.
-
Lógica de borda ascendente: Na borda ascendente do relógio, o processo verifica se o contador atingiu o valor `half_period - 1`. Nesse caso, ele alterna o `output_signal` e zera o contador. Caso contrário, incrementa o contador.
Como funciona: - O contador conta de 0 a `half_period - 1`.
- Quando o contador atinge `half_period - 1`, o sinal de saída é alternado e o contador é reiniciado.
- Isso cria uma onda quadrada com um período duas vezes maior que o `meio_período` calculado.
Uso: - Conecte os sinais `clk` e `reset` ao seu relógio e reinicie as entradas.
- Fornece a frequência desejada (0-255 Hz) através da entrada `frequency`.
- O `output_signal` produzirá a onda quadrada gerada.
Observação: Este código assume uma frequência de clock de 10 MHz. Modifique o cálculo `half_period` se a frequência do clock for diferente.