VHDL - Не могу остановить мой таймер обратного отсчета в 00:00:00 - PullRequest
0 голосов
/ 30 мая 2018

Я написал этот код, подключил тактовую частоту 100 Гц, и выходы - это 7-сегментные декодеры.Выходы в этом коде - это время.Время начинается в 10:00:00, потому что это баскетбольный матч.Моя проблема в том, что время должно остановиться в 00:00:00, но продолжается до F9: 59: 99.Что я должен сделать, чтобы остановить его автоматически?

              entity Timer is
                port(clock      :   in std_logic;
                        enable  :   in std_logic;
                      reset     :   in std_logic;
                        UniCent :   out std_logic_vector(3 downto 0);
                     DezCent    :   out std_logic_vector(3 downto 0);
                  UniSeg        :   out std_logic_vector(3 downto 0);
                  DezSeg        :   out std_logic_vector(3 downto 0);
                  UniMin        :   out std_logic_vector(3 downto 0);
                   DezMin       :   out std_logic_vector(3 downto 0));

                end Timer;

                       architecture Behavioral of Timer is
                       signal s_UnidadesCent : unsigned(3 downto 0):="0000";                                                                                  
                     signal s_DezenasCent  : unsigned(3 downto 0) := "0000";
                     signal s_UnidadesSeg  : unsigned(3 downto 0) := "0000";
                     signal s_DezenasSeg   : unsigned(3 downto 0) := "0000";
                     signal s_UnidadesMin  : unsigned(3 downto 0) := "0000";
                     signal s_DezenasMin   : unsigned(3 downto 0) := "0001";

                       begin
                            process(clock)
                            begin 
                               if (rising_edge(clock)) then
                                   if (reset = '1') then
                                        s_UnidadesCent <= "0000";
                                        s_DezenasCent <= "0000";
                                       s_UnidadesSeg <= "0000";
                                        s_DezenasSeg <= "0000";
                                       s_UnidadesMin <= "0000";
                                       s_DezenasMin <= "0001";

                        elsif (enable = '1') then

                        if (s_UnidadesCent = "0000" and s_DezenasCent = "0000" and s_UnidadesSeg = "0000" and s_DezenasSeg = "0000" and s_UnidadesMin = "0000" and s_DezenasMin = "0000") then

                                    s_UnidadesCent <= "0000";
                                    s_DezenasCent <= "0000";
                                    s_UnidadesSeg <= "0000";
                                    s_DezenasSeg <= "0000";
                                    s_UnidadesMin <= "0000";
                                    s_DezenasMin <= "0000"; 

                    else    
                        s_UnidadesCent <= s_UnidadesCent - 1;



                            if (s_UnidadesCent = "0000" and s_DezenasCent /= "0000") then 
                                s_UnidadesCent  <= "1001";
                                s_DezenasCent <= s_DezenasCent - 1; 

                                    if (s_UnidadesSeg = "0000" and s_DezenasSeg /= "0000") then
                                            s_UnidadesSeg <= s_unidadesSeg;
                                            s_DezenasSeg <= s_DezenasSeg;

                                            if (s_UnidadesMin = "0000") then
                                                    s_DezenasMin <= s_DezenasMin;
                                                    s_UnidadesMin <= s_unidadesMin;
                                            end if;

                                    elsif (s_UnidadesSeg = "0000" and s_DezenasSeg = "0000") then
                                            s_UnidadesSeg <= "1001";
                                            s_DezenasSeg <= "0101";
                                            s_UnidadesMin <= s_UnidadesMin - 1;

                                            if (s_UnidadesMin = "0000") then
                                                    s_DezenasMin <= s_DezenasMin - 1;
                                                    s_UnidadesMin <= "1001";
                                            end if;

                                    end if;


                            elsif (s_UnidadesCent = "0000" and s_DezenasCent = "0000") then
                                s_UnidadesSeg <= s_UnidadesSeg - 1;
                                s_UnidadesCent  <= "1001";
                                s_DezenasCent <= "1001";

                                    if (s_UnidadesCent = "0000" and s_DezenasCent = "0000" and s_UnidadesSeg = "0000" and s_DezenasSeg /= "0000") then
                                            s_UnidadesSeg <= "1001";
                                            s_DezenasSeg <= s_DezenasSeg - 1;



                                    elsif (s_UnidadesSeg = "0000" and s_DezenasSeg = "0000" and s_UnidadesCent = "0000" and s_DezenasCent = "0000") then
                                            s_UnidadesSeg <= "1001";
                                            s_DezenasSeg <= "0101";
                                            s_UnidadesMin <= s_UnidadesMin - 1;

                                            if (s_UnidadesMin = "0000") then
                                                    s_DezenasMin <= s_DezenasMin - 1;
                                                    s_UnidadesMin <= "1001";
                                            end if;

                                    end if;


                            end if; 
                    end if;


            else 
                s_UnidadesCent <= s_UnidadesCent;
                s_DezenasCent <= s_DezenasCent;
                s_UnidadesSeg <= s_UnidadesSeg;
                s_DezenasSeg <= s_DezenasSeg;
                s_UnidadesMin <= s_UnidadesMin;
                s_DezenasMin <= s_DezenasMin;

            end if; 

        end if;
end process;


UniCent <= std_logic_vector(s_UnidadesCent);
DezCent <= std_logic_vector(s_DezenasCent);
UniSeg <= std_logic_vector(s_UnidadesSeg);
DezSeg <= std_logic_vector(s_DezenasSeg);
UniMin <= std_logic_vector(s_UnidadesMin);
DezMin <= std_logic_vector(s_DezenasMin);

end Behavioral;

...