Considere uma máquina de estados algorítmica com o seguinte diagrama de transições em alto nível:
O seguinte código em VHDL descreve essa máquinas de estados em alto nível (ou seja, sem a necessidade de separar em controlador e datapath):
--fsmd.vhd --Maquina de estado algoritmica implementada em VHDL --Autor: Pedro Thiago V. de Souza --Biblioteca library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; --Realizar operacoes aritmeticas --Entidade entity fsmd is port( clk, rst, x : in std_logic; value : in std_logic_vector (7 downto 0); --8 bits tot : out std_logic_vector (7 downto 0) --Ultima linha do port nao tem ; ); end fsmd; --Arquitetura architecture comportamento of fsmd is --Pre-ambulo type estado is (inicio, esperar, somar, esperar2); signal estadoatual, estadoproximo : estado; --Registrador referente ao tot signal tot_reg : std_logic_vector (7 downto 0); begin --Process 1: Registrador de Estado - Sensibilidade: clk, rst registadorestado : process (clk, rst) begin --Reset --> Estado inicial = inicio if (rst='1') then estadoatual <= inicio; --Borda de subida do clock elsif (rising_edge(clk)) then estadoatual <= estadoproximo; end if; end process; --Process 2: Logica Combinacional - Sensibilidade: estadoatual, x, value logicacombinacional : process (estadoatual, x, value) begin case estadoatual is --inicio when inicio => --Ações tot_reg <= (others => '0'); --Inicializa o tot_reg em zero --Estado proximo estadoproximo <= esperar; --esperar when esperar => --O estado nao faz nenhuma ação --Estado proximo if (x='0') then estadoproximo <= somar; else estadoproximo <= esperar; end if; --somar when somar => --Ações tot_reg <= std_logic_vector(unsigned(tot_reg) + unsigned(value)); --Estado proximo estadoproximo <= esperar2; --esperar2 when esperar2 => --O estado nao faz nenhuma ação --Estado proximo if (x = '0') then estadoproximo <= esperar2; else estadoproximo <= esperar; end if; end case; end process; --A minha saida tot receba o valor tot_reg tot <= tot_reg; end comportamento;