Roteiro para Simulação em VHDL - Parte II
Descrição de uma tabela verdade para circuitos combinacionais no testbench
Atenção: Este roteiro utiliza a ferramenta ISE 14.7 da Xilinx e o respectivo simulador ISim. Porém, quanto ao código usado para a simulação deve funcionar em qualquer ferramenta.
Preparação
Crie um projeto e insira um arquivo VHDL com a descrição de um circuito combinacional qualquer ou uma simples porta lógica.
Obs: Nos exemplos a seguir os sinais de entrada são "ENT_A" e "ENT_B" e o sinal de saída é "saida"
Insira um VHDL Test Bench.
Neste exemplo não iremos utilizar clock, então pode-se comentar, ou remover, as linhas geradas referentes a esse sinal:
-- constant <clock>_period : time := 10 ns;
-- Clock process definitions
-- <clock>_process :process
-- begin
-- <clock> <= '0';
-- wait for <clock>_period/2;
-- <clock> <= '1';
-- wait for <clock>_period/2;
-- end process;
-- wait for <clock>_period*10;
Remova também o sitm_proc, pois iremos criar um processo novo a seguir.
-- Stimulus process
-- stim_proc: process
-- begin
-- -- hold reset state for 100 ns.
-- wait for 100 ns;
--
-- wait for <clock>_period*10;
--
-- -- insert stimulus here
--
-- wait;
-- end process;
Construção usando Wait em um Process
Crie um novo processo (tabela_proc, por exemplo) e defina-o como a seguir:
tabela_proc: process
begin
ENT_A <= '0';
ENT_B <= '0';
wait for 100 ns;
ENT_A <= '0';
ENT_B <= '1';
wait for 100 ns;
ENT_A <= '1';
ENT_B <= '0';
wait for 100 ns;
ENT_A <= '1';
ENT_B <= '1';
wait for 100 ns;
end process;
Simule:
Altere o código modificando a última linha do process de “wait for 100 ns;” para apenas “wait;” e repare na diferença. Dica, clique "Re-launch" em na janela do simulador.
Para simularmos os sinais de forma independente, basta criarmos “processes” independentes.
Importante: O que acontece dentro de um process é sequencial, porém, se houver mais de um process em seu vhdl, eles serão concorrentes!
Simule o seguinte exemplo:
tabela_A_proc: process
begin
ENT_A <= '0';
wait for 100 ns;
ENT_A <= '0';
wait for 100 ns;
ENT_A <= '1';
wait for 100 ns;
ENT_A <= '1';
wait for 100 ns;
end process;
tabela_B_proc: process
begin
ENT_B <= '0';
wait for 50 ns;
ENT_B <= '1';
wait for 150 ns;
ENT_B <= '0';
wait for 50 ns;
ENT_B <= '1';
wait for 150 ns;
end process;
O resultado deve ser:
Construção usando After
Apague os processos dos exemplos anteriores e insira os seguintes estímulos:
ENT_A <= ‘0’, ‘1’ after 100 ns, ‘0’ after 200 ns, ‘1’ after 300 ns;
ENT_B <= ‘0’, ‘0’ after 100 ns, ‘1’ after 200 ns, ‘1’ after 300 ns;
a repetição dos estados é apenas para facilitar a visualização da sequência.
Varie os tempos e observe o que ocorre!
Lembrete:
As construções usando “wait” usam como referências intervalos de tempo fixos.
É uma ótima opção para simular toda as possibilidades de uma tabela-verdade para validar um projeto combinacional, ou um circuito com uma sequência padrão de entradas.
As construções usando after usam como referência o instante inicial (t = 0).
É uma ótima opção para simular as entradas livremente.
Retornar para Sistemas Digitais.