Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- library IEEE;
- use IEEE.STD_LOGIC_1164.ALL;
- use IEEE.NUMERIC_STD.ALL;
- use IEEE.STD_LOGIC_UNSIGNED.ALL;
- entity Digital_Clock is
- Port (
- clock_1s : in STD_LOGIC;
- clock_ns : in STD_LOGIC;
- clock : in STD_LOGIC;
- buttons : in STD_LOGIC_VECTOR (3 downto 0);
- disp_1 : out STD_LOGIC_VECTOR (3 downto 0);
- disp_2 : out STD_LOGIC_VECTOR (3 downto 0);
- disp_3 : out STD_LOGIC_VECTOR (3 downto 0);
- disp_4 : out STD_LOGIC_VECTOR (3 downto 0);
- LEDs : out STD_LOGIC_VECTOR (7 downto 0)
- );
- end Digital_Clock;
- architecture Behavioral of Digital_Clock is
- type statetype is
- (S_Digital_Clock, S_Stop_Watch, S_Alarm_Set);
- signal Current_State, Next_State : statetype;
- signal seconds : integer range 0 to 60;
- signal minutes_one : std_logic_vector(3 downto 0) := "0000";
- signal minutes_ten : std_logic_vector(3 downto 0) := "0000";
- signal hours_one : std_logic_vector(3 downto 0) := "0000";
- signal hours_ten : std_logic_vector(3 downto 0) := "0000";
- signal alarm_minutes_one : std_logic_vector(3 downto 0) := "0000";
- signal alarm_minutes_ten : std_logic_vector(3 downto 0) := "0000";
- signal alarm_hours_one : std_logic_vector(3 downto 0) := "0010";
- signal alarm_hours_ten : std_logic_vector(3 downto 0) := "0001";
- signal sw_seconds_one : std_logic_vector(3 downto 0) := "0000";
- signal sw_seconds_ten : std_logic_vector(3 downto 0) := "0000";
- signal sw_nanos_one : std_logic_vector(3 downto 0) := "0000";
- signal sw_nanos_ten : std_logic_vector(3 downto 0) := "0000";
- signal stop : std_logic := '0';
- signal addOne : std_logic := '1';
- signal addHour : std_logic := '0';
- signal reset : std_logic := '0';
- begin
- process(clock_1s,addOne,addHour)
- begin
- if (addOne = '1') then
- seconds <= 0;
- minutes_one <= minutes_one + 1;
- elsif(addHour = '1') then
- seconds <= 0;
- hours_one <= hours_one + 1;
- elsif rising_edge(clock_1s) then
- seconds <= seconds + 1;
- if(seconds = 60) then
- seconds <= 0;
- minutes_one <= minutes_one + 1;
- if(minutes_one = "1010") then
- minutes_ten <= minutes_ten + 1;
- minutes_one <= "0000";
- if(minutes_ten = "0110") then
- hours_one <= hours_one + 1;
- minutes_ten <= "0000";
- if(hours_one = "1010") then
- hours_ten <= hours_ten + 1;
- hours_one <= "0000";
- if(hours_ten = "0010" and hours_one = "0100") then
- hours_ten <= "0000";
- hours_one <= "0000";
- end if;end if;end if;end if;end if;
- end if;
- end process;
- process(clock_ns,reset,stop)
- begin
- if(reset = '1') then
- sw_nanos_one <= "0000";
- sw_nanos_ten <= "0000";
- sw_seconds_one <= "0000";
- sw_seconds_ten <= "0000";
- else
- if(stop = '0') then
- if rising_edge(clock_ns) then
- sw_nanos_one <= sw_nanos_one + 1;
- if(sw_nanos_one = "1010") then
- sw_nanos_one <= "0000";
- sw_nanos_ten <= sw_nanos_ten + 1;
- if(sw_nanos_ten = "1010") then
- sw_nanos_ten <= "0000";
- sw_seconds_one <= sw_seconds_one + 1;
- if(sw_seconds_one = "1010") then
- sw_seconds_one <= "0000";
- sw_seconds_ten <= sw_seconds_ten + 1;
- if(sw_seconds_ten = "0110") then
- sw_seconds_ten <= "0000";
- end if;end if;end if;end if;end if;
- else
- sw_nanos_one <= sw_nanos_one;
- sw_nanos_ten <= sw_nanos_ten;
- sw_seconds_one <= sw_seconds_one;
- sw_seconds_ten <= sw_seconds_ten;
- end if;
- end if;
- end process;
- process(Current_State,buttons,hours_ten,hours_one,minutes_ten,minutes_one,alarm_hours_ten,alarm_hours_one,alarm_minutes_one,alarm_minutes_ten,sw_seconds_ten,sw_seconds_one,sw_nanos_ten,sw_nanos_one)
- begin
- case Current_State is
- when S_Digital_Clock =>
- disp_1 <= hours_ten;
- disp_2 <= hours_one;
- disp_3 <= minutes_ten;
- disp_4 <= minutes_one;
- if (buttons(3) = '1') then
- disp_1 <= alarm_hours_ten;
- disp_2 <= alarm_hours_one;
- disp_3 <= alarm_minutes_ten;
- disp_4 <= alarm_minutes_one;
- else
- disp_1 <= hours_ten;
- disp_2 <= hours_one;
- disp_3 <= minutes_ten;
- disp_4 <= minutes_one;
- end if;
- if(buttons(1) = '1') then
- addOne <= '1';
- else
- addOne <= '0';
- end if;
- if(buttons(2) = '1') then
- addHour <= '1';
- else
- addHour <= '0';
- end if;
- if(buttons(0) = '1') then
- Next_State <= S_Stop_Watch;
- else
- Next_State <= S_Digital_Clock;
- end if;
- when S_Stop_Watch =>
- disp_1 <= sw_seconds_ten;
- disp_2 <= sw_seconds_one;
- disp_3 <= sw_nanos_ten;
- disp_4 <= sw_nanos_one;
- if(buttons(3) = '1') then
- reset <= '1';
- else
- reset <= '0';
- end if;
- if(buttons(2) = '1') then
- stop <= NOT stop;
- else
- stop <= stop;
- end if;
- if(buttons(1) = '1') then
- Next_State <= S_Digital_Clock;
- else
- Next_State <= S_Stop_Watch;
- end if;
- if(buttons(0) = '1') then
- Next_State <= S_Alarm_Set;
- else
- Next_State <= S_Stop_Watch;
- end if;
- when S_Alarm_Set =>
- disp_1 <= alarm_hours_ten;
- disp_2 <= alarm_hours_one;
- disp_3 <= alarm_minutes_ten;
- disp_4 <= alarm_minutes_one;
- if(buttons(3) = '1') then
- Next_State <= S_Stop_Watch;
- else
- Next_State <= S_Alarm_Set;
- end if;
- if(buttons(2) = '1') then
- alarm_hours_one <= alarm_hours_one + 1;
- alarm_minutes_ten <= "0000";
- if(alarm_hours_one = "1010") then
- alarm_hours_one <= "0000";
- alarm_hours_ten <= alarm_hours_ten + 1;
- if(alarm_hours_ten = "0010" and hours_one = "0100") then
- alarm_hours_ten <= "0000";
- alarm_hours_one <= "0000";
- end if;end if;
- else
- alarm_minutes_one <= alarm_minutes_one;
- alarm_minutes_ten <= alarm_minutes_ten;
- alarm_hours_one <= alarm_hours_one;
- alarm_hours_ten <= alarm_hours_ten;
- end if;
- if(buttons(1) = '1') then
- alarm_minutes_one <= alarm_minutes_one + 1;
- if(alarm_minutes_one = "1010") then
- alarm_minutes_ten <= alarm_minutes_ten + 1;
- alarm_minutes_one <= "0000";
- if(alarm_minutes_ten = "1010") then
- alarm_hours_one <= alarm_hours_one + 1;
- alarm_minutes_ten <= "0000";
- if(alarm_hours_one = "1010") then
- alarm_hours_one <= "0000";
- alarm_hours_ten <= alarm_hours_ten + 1;
- if(alarm_hours_ten = "0010" and hours_one = "0100") then
- alarm_hours_ten <= "0000";
- alarm_hours_one <= "0000";
- end if;end if;end if;end if;
- else
- alarm_minutes_one <= alarm_minutes_one;
- alarm_minutes_ten <= alarm_minutes_ten;
- alarm_hours_one <= alarm_hours_one;
- alarm_hours_ten <= alarm_hours_ten;
- end if;
- if(buttons(0) = '1') then
- Next_State <= S_Digital_Clock;
- else
- Next_State <= S_Alarm_Set;
- end if;
- end case;
- end process;
- StateReg : process(clock)
- begin
- if rising_edge(clock)then
- Current_State <= Next_State;
- end if;
- end process StateReg;
- end Behavioral;
Advertisement
Add Comment
Please, Sign In to add comment