Este trabalho tem como objetivo implementar, simular e analisar o comportamento de uma Máquina de Estados Finitos (FSM) do tipo Moore, responsável por detectar a sequência "100101" em uma entrada paralela de 8 bits, utilizando a linguagem de descrição de hardware VHDL.
A FSM deve ser capaz de:
- Identificar a ocorrência exata da sequência binária
"100101", alinhada corretamente dentro dos 8 bits de entrada. - Ativar uma saída
sequence_detectedapenas quando essa condição for satisfeita. - Ignorar padrões parcialmente semelhantes ou desalinhados.
clk(entrada): sinal de clock.reset(entrada): reinicia a FSM para o estado inicial.sequence_in(entrada): vetor de 8 bits do tipoSTD_LOGIC_VECTOR(7 downto 0).sequence_detected(saída): sinal binário (STD_LOGIC) que indica a presença da sequência.
A FSM possui dois estados:
IDLE: estado inicial e principal, onde a sequência é analisada.MATCHED: indica que a sequência "100101" foi detectada. A saída será ativada neste estado durante 1 ciclo de clock.
Como se trata de uma FSM do tipo Moore, a saída depende exclusivamente do estado atual, e não diretamente da entrada.
A FSM analisa, a cada ciclo de clock, se os bits de posição 7 até 2 (seis bits mais significativos) correspondem exatamente ao padrão "100101". Essa escolha evita interpretações erradas de padrões desalinhados ou ambíguos.
if sequence_in(7 downto 2) = "100101" then
next_state <= MATCHED;
else
next_state <= IDLE;
end if;Esse trecho implementa a comparação exata da sequência de interesse. Ao restringir a verificação a sequence_in(7 downto 2), evitamos identificar falsamente padrões similares deslocados dentro do vetor.
A transição ocorre em dois blocos separados:
if reset = '1' then
current_state <= IDLE;
elsif rising_edge(clk) then
current_state <= next_state;
end if;Esse trecho garante que a FSM retorne ao estado inicial (IDLE) quando o reset for ativado, e que as mudanças de estado ocorram apenas na borda de subida do clock, o que garante estabilidade na transição.
case current_state is
when IDLE =>
if sequence_in(7 downto 2) = "100101" then
next_state <= MATCHED;
else
next_state <= IDLE;
end if;
when MATCHED =>
next_state <= IDLE;Quando a sequência é detectada no estado IDLE, a FSM muda para MATCHED, ativando a saída por um ciclo.
Um testbench foi criado para verificar o comportamento da FSM sob diferentes padrões de entrada.
| Entrada (sequence_in) | Esperado sequence_detected |
Justificativa |
|---|---|---|
"11001010" |
'0' |
Sequência incorreta |
"10010100" |
'1' |
Sequência correta nos bits 7..2 |
"00000000" |
'0' |
Nenhum padrão correspondente |
"10010111" |
'1' |
Sequência correta, bits restantes ignorados |
"00100101" |
'0' |
Sequência deslocada (bits 6..1) |
O testbench usa um clock com período de 10 ns, e aplica um reset inicial de 20 ns antes de iniciar os testes.
É esperado que o sinal sequence_detected sobe para '1' apenas quando a sequência "100101" está presente nos bits 7 a 2 de sequence_in.
A FSM desenvolvida foi capaz de detectar com precisão a sequência binária "100101" em dados de entrada paralela de 8 bits, garantindo:
- Detecção somente quando a sequência aparece de forma alinhada.
- Comportamento estável, com saída ativa por 1 ciclo.
- Robustez contra padrões semelhantes ou desalinhados.
Este projeto mostra a eficácia da abordagem FSM Moore para reconhecimento de padrões binários em entradas paralelas, uma estratégia comum em sistemas embarcados, protocolos e decodificação de dados.