Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- library ieee;
- use ieee.std_logic_1164.all;
- entity controle is
- port(
- --Entradas
- clk : in std_logic;
- -- Clock
- clear : in std_logic;
- -- Clear: define o valor inicial da máquina de estados
- b0 : in std_logic; -- Botão B0
- b1 : in std_logic; -- Botão B1
- b2 : in std_logic; -- Botão B2
- b3 : in std_logic; -- Botão B3
- addr : in std_logic_vector(1 downto 0);
- -- Endereço definido pelas chaves
- num : in std_logic_vector(3 downto 0);
- -- Número definido pelas chaves
- num_comp_maior : in std_logic;
- -- Resultado da comparação, entrada para a saída "greater" do comparador
- num_comp_menor : in std_logic;
- -- Resultado da comparação, entrada para a saída "less" do comparador
- --Saidas
- bdr_addr_W : out std_logic_vector(1 downto 0);
- -- Endereço de escrita no BDR (Banco de Registradores)
- bdr_en_W : out std_logic;
- -- Enable para escrita no BDR
- bdr_num_W : out std_logic_vector(3 downto 0);
- -- Valor para escrita no BDR
- bdr_addr_R : out std_logic_vector(1 downto 0);
- -- Endereço para leitura no BDR
- bdr_en_R : out std_logic;
- -- Enable para leitura no BDR
- reg_out_en : out std_logic
- -- Enable para escrita no registrador de saida
- );
- end controle;
- architecture comport of controle is
- --Declaracoes
- type estado is (
- --Inicial
- start,
- --B0
- enableW, zera00, zera01, zera10, zera11,
- zera_reg_out1, zera_reg_out2, zera_reg_out3,
- --B1
- compara_00_G, compara_01_G, compara_10_G, compara_11_G,
- compara_00_P, compara_01_P, compara_10_P, compara_11_P,
- --B2
- salva_00_G, salva_01_G, salva_10_G, salva_11_G,
- salva_00_P, salva_01_P, salva_10_P, salva_11_P,
- --B3
- salva_valor
- );
- signal estado_atual, proximo_estado: estado;
- begin
- process(clear, clk) is
- begin
- if(clear = '1') then
- estado_atual <= start;
- elsif(rising_edge(clk)) then
- estado_atual <= proximo_estado;
- end if;
- end process;
- process(estado_atual, b0, b1, b2, b3, addr, num,
- num_comp_maior, num_comp_menor) is
- begin
- case estado_atual is
- --inicio
- when start =>
- bdr_addr_W <= "00";
- bdr_en_W <= '0';
- bdr_num_W <= "0000";
- bdr_addr_R <= "00";
- bdr_en_R <= '1';
- reg_out_en <= '0';
- --B0
- if(b0 = '1' AND b1 = '0' AND b2 = '0' AND b3 = '0') then
- proximo_estado <= enableW;
- --B1
- elsif(b0 = '0' AND b1 = '1' AND b2 = '0' AND b3 = '0') then
- proximo_estado <= compara_00_G;
- --B2
- elsif(b0 = '0' AND b1 = '0' AND b2 = '1' AND b3 = '0') then
- proximo_estado <= compara_00_P;
- --B3
- elsif(b0 = '0' AND b1 = '0' AND b2 = '0' AND b3 = '1') then
- proximo_estado <= salva_valor;
- else
- proximo_estado <= start;
- end if;
- --B0
- --zera banco
- when enableW =>
- bdr_addr_W <= "00";
- bdr_en_W <= '1';
- bdr_num_W <= "0000";
- bdr_addr_R <= "00";
- bdr_en_R <= '1';
- reg_out_en <= '0';
- proximo_estado <= zera00;
- when zera00 =>
- bdr_addr_W <= "00";
- bdr_en_W <= '1';
- bdr_num_W <= "0000";
- bdr_addr_R <= "00";
- bdr_en_R <= '1';
- reg_out_en <= '0';
- proximo_estado <= zera01;
- when zera01 =>
- bdr_addr_W <= "01";
- bdr_en_W <= '1';
- bdr_num_W <= "0000";
- bdr_addr_R <= "00";
- bdr_en_R <= '1';
- reg_out_en <= '0';
- proximo_estado <= zera10;
- when zera10 =>
- bdr_addr_W <= "10";
- bdr_en_W <= '1';
- bdr_num_W <= "0000";
- bdr_addr_R <= "00";
- bdr_en_R <= '1';
- reg_out_en <= '0';
- proximo_estado <= zera11;
- when zera11 =>
- bdr_addr_W <= "11";
- bdr_en_W <= '1';
- bdr_num_W <= "0000";
- bdr_addr_R <= "00";
- bdr_en_R <= '1';
- reg_out_en <= '0';
- proximo_estado <= zera_reg_out1;
- --zera registro de saida
- when zera_reg_out1 =>
- bdr_addr_W <= "00";
- bdr_en_W <= '0';
- bdr_num_W <= "0000";
- bdr_addr_R <= "00";
- bdr_en_R <= '1';
- reg_out_en <= '1';
- proximo_estado <= zera_reg_out2;
- when zera_reg_out2 =>
- bdr_addr_W <= "00";
- bdr_en_W <= '0';
- bdr_num_W <= "0000";
- bdr_addr_R <= "00";
- bdr_en_R <= '1';
- reg_out_en <= '1';
- proximo_estado <= zera_reg_out3;
- when zera_reg_out3 =>
- bdr_addr_W <= "00";
- bdr_en_W <= '0';
- bdr_num_W <= "0000";
- bdr_addr_R <= "00";
- bdr_en_R <= '1';
- reg_out_en <= '0';
- proximo_estado <= start;
- -------------------------------
- --B1
- --comparacoes
- when compara_00_G =>
- bdr_addr_W <= "00";
- bdr_en_W <= '0';
- bdr_num_W <= "0000";
- bdr_addr_R <= "00";
- bdr_en_R <= '1';
- reg_out_en <= '0';
- proximo_estado <= salva_00_G;
- when compara_01_G =>
- bdr_addr_W <= "00";
- bdr_en_W <= '0';
- bdr_num_W <= "0000";
- bdr_addr_R <= "01";
- bdr_en_R <= '1';
- reg_out_en <= '0';
- if(num_comp_menor = '0') then
- proximo_estado <= compara_10_G;
- else
- proximo_estado <= salva_01_G;
- end if;
- when compara_10_G =>
- bdr_addr_W <= "00";
- bdr_en_W <= '0';
- bdr_num_W <= "0000";
- bdr_addr_R <= "10";
- bdr_en_R <= '1';
- reg_out_en <= '0';
- if(num_comp_menor = '0') then
- proximo_estado <= compara_11_G;
- else
- proximo_estado <= salva_10_G;
- end if;
- when compara_11_G =>
- bdr_addr_W <= "00";
- bdr_en_W <= '0';
- bdr_num_W <= "0000";
- bdr_addr_R <= "11";
- bdr_en_R <= '1';
- reg_out_en <= '0';
- if(num_comp_menor = '0') then
- proximo_estado <= start;
- else
- proximo_estado <= salva_11_G;
- end if;
- --registro de novo valor maior
- when salva_00_G =>
- bdr_addr_W <= "00";
- bdr_en_W <= '0';
- bdr_num_W <= "0000";
- bdr_addr_R <= "00";
- bdr_en_R <= '1';
- reg_out_en <= '1';
- proximo_estado <= compara_01_G;
- when salva_01_G =>
- bdr_addr_W <= "00";
- bdr_en_W <= '0';
- bdr_num_W <= "0000";
- bdr_addr_R <= "01";
- bdr_en_R <= '1';
- reg_out_en <= '1';
- proximo_estado <= compara_10_G;
- when salva_10_G =>
- bdr_addr_W <= "00";
- bdr_en_W <= '0';
- bdr_num_W <= "0000";
- bdr_addr_R <= "10";
- bdr_en_R <= '1';
- reg_out_en <= '1';
- proximo_estado <= compara_11_G;
- when salva_11_G =>
- bdr_addr_W <= "00";
- bdr_en_W <= '0';
- bdr_num_W <= "0000";
- bdr_addr_R <= "11";
- bdr_en_R <= '1';
- reg_out_en <= '1';
- proximo_estado <= start;
- -------------------------------------
- --B2
- --comparacoes
- when compara_00_P =>
- bdr_addr_W <= "00";
- bdr_en_W <= '0';
- bdr_num_W <= "0000";
- bdr_addr_R <= "00";
- bdr_en_R <= '1';
- reg_out_en <= '0';
- proximo_estado <= salva_00_P;
- when compara_01_P =>
- bdr_addr_W <= "00";
- bdr_en_W <= '0';
- bdr_num_W <= "0000";
- bdr_addr_R <= "01";
- bdr_en_R <= '1';
- reg_out_en <= '0';
- if(num_comp_maior = '0') then
- proximo_estado <= compara_10_P;
- else
- proximo_estado <= salva_01_P;
- end if;
- when compara_10_P =>
- bdr_addr_W <= "00";
- bdr_en_W <= '0';
- bdr_num_W <= "0000";
- bdr_addr_R <= "10";
- bdr_en_R <= '1';
- reg_out_en <= '0';
- if(num_comp_maior = '0') then
- proximo_estado <= compara_11_P;
- else
- proximo_estado <= salva_10_P;
- end if;
- when compara_11_P =>
- bdr_addr_W <= "00";
- bdr_en_W <= '0';
- bdr_num_W <= "0000";
- bdr_addr_R <= "11";
- bdr_en_R <= '1';
- reg_out_en <= '0';
- if(num_comp_maior = '0') then
- proximo_estado <= start;
- else
- proximo_estado <= salva_11_P;
- end if;
- --registro de novo valor menor
- when salva_00_P =>
- bdr_addr_W <= "00";
- bdr_en_W <= '0';
- bdr_num_W <= "0000";
- bdr_addr_R <= "00";
- bdr_en_R <= '1';
- reg_out_en <= '1';
- proximo_estado <= compara_01_P;
- when salva_01_P =>
- bdr_addr_W <= "00";
- bdr_en_W <= '0';
- bdr_num_W <= "0000";
- bdr_addr_R <= "01";
- bdr_en_R <= '1';
- reg_out_en <= '1';
- proximo_estado <= compara_10_P;
- when salva_10_P =>
- bdr_addr_W <= "00";
- bdr_en_W <= '0';
- bdr_num_W <= "0000";
- bdr_addr_R <= "10";
- bdr_en_R <= '1';
- reg_out_en <= '1';
- proximo_estado <= compara_11_P;
- when salva_11_P =>
- bdr_addr_W <= "00";
- bdr_en_W <= '0';
- bdr_num_W <= "0000";
- bdr_addr_R <= "11";
- bdr_en_R <= '1';
- reg_out_en <= '1';
- proximo_estado <= start;
- -------------------------------------
- --B3
- --insercao de novo valor
- when salva_valor =>
- bdr_addr_W <= addr;
- bdr_en_W <= '1';
- bdr_num_W <= num;
- bdr_addr_R <= "00";
- bdr_en_R <= '1';
- reg_out_en <= '0';
- proximo_estado <= start;
- -------------------------------------
- end case;
- end process;
- end comport;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement