Sequencial
Como trabalhar com lógica sequência em VHDL
Process VHDL
Em VHDL quando desejamos fazer algo sequencial é necessário usarmos uma estrutura chamada de process, que possui a declaração a seguir:
process (optional sensitivity list)
    declarations
begin
    sequential statements
end process;
Nesse process possuímos a lista de sensibilidade (sensitivity list) que indica quando o process será executado. Podemos pensar da seguinte maneira, sempre que algum sinal que está listado nessa lista de sensibilidade mudar de valor (0 -> 1, 1 -> 0) o processo será executado. Vamos ver o exemplo a seguir:
process(A)
begin
  Q <= A;
end process;
Entendendo 1
Sempre que o sinal A (sinal ou porta) alterar de valor o sinal Q será atribuído com o seu valor
Agora vamos criar um outro processo (esse estará errado):
process(A)
begin
  Q <= A and B;
end process;
A ideia por traz desse processo seria que o sinal Q receba o sinal A e B sempre que algum dos dois sofram alguma alteração, porém essa implementação não irá funcionar já que B não faz parte da lista de sensibilidade e se B mudar de valor o processo não será chamado, o sinal Q só será atualizado quando A mudar de valor.
Tarefa
Reescreva no codeshare do grupo o módulo anterior corrigido.
- Chame um professor para validar!
 
Clock
Para inserirmos um clock (um sistema síncrono) precisamos necessariamente usar um process, e a arquitetura é a seguinte:
process(clock)
begin
  if(rising_edge(clock)) then
     Q <= D;
  end if;
end process;
Sempre que o clock sofrer variação (0 -> 1, 1 -> 0) o process é chamado e verifica-se se a transição foi de borda de subida (rising_edge) se for, atribui o sinal A ao sinal Q, caso contrário Q mantém seu último valor.
Note
Em FPGA um sinal digital não deve sofrer atualização em ambas as bordas: subida (rising_edge) e de descida (falling_edge) pois não será suportado por hardware. Salvo em registradores DDR (double data rate) especiais, exemplo do que não deve ser feito!:
process(clock)
begin
  if(rising_edge(clock)) then
    Q <= D;
  elsif(falling_edge(clock)) then
    Q <= D;
  end if;
end process;