OpenCores
URL https://opencores.org/ocsvn/open8_urisc/open8_urisc/trunk

Subversion Repositories open8_urisc

[/] [open8_urisc/] [trunk/] [VHDL/] [o8_epoch_timer.vhd] - Diff between revs 184 and 189

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 184 Rev 189
Line 1... Line 1...
-- Copyright (c)2013 Jeremy Seth Henry
-- Copyright (c)2011, 2019 Jeremy Seth Henry
-- All rights reserved.
-- All rights reserved.
--
--
-- Redistribution and use in source and binary forms, with or without
-- Redistribution and use in source and binary forms, with or without
-- modification, are permitted provided that the following conditions are met:
-- modification, are permitted provided that the following conditions are met:
--     * Redistributions of source code must retain the above copyright
--     * Redistributions of source code must retain the above copyright
Line 31... Line 31...
-- Register Map:
-- Register Map:
-- Offset  Bitfield Description                        Read/Write
-- Offset  Bitfield Description                        Read/Write
--   0x0   AAAAAAAA B0 of Setpoint (W) or Buffered Time(R)
--   0x0   AAAAAAAA B0 of Setpoint (W) or Buffered Time(R)
--   0x1   AAAAAAAA B1 of Setpoint (W) or Buffered Time(R)
--   0x1   AAAAAAAA B1 of Setpoint (W) or Buffered Time(R)
--   0x2   AAAAAAAA B2 of Setpoint (W) or Buffered Time(R)
--   0x2   AAAAAAAA B2 of Setpoint (W) or Buffered Time(R)
--   0x3   DC----BA Control/Status register (RW)
--   0x3   C-----BA Control/Status register (RW)
--                  A = Update Buffered Time from internal timer (W)
--                  A = Update Buffered Time from internal timer (W)
--                  B = Reset Internal Epoch Time (W)
--                  B = Reset Internal Epoch Time (W)
--                  C = Interrupt Enable (RW)
--                  C = Alarm State Flag (RW) (write a 1 to clear)
--                  D = Alarm State Flag (RW) (write a 1 to clear)
--
 
-- Revision History
 
-- Author          Date     Change
 
------------------ -------- ---------------------------------------------------
 
-- Seth Henry      07/28/11 Design Start
 
-- Seth Henry      12/19/19 Renamed to "o8_epoch_timer" to fit "theme"
 
 
library ieee;
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_1164.all;
  use ieee.std_logic_unsigned.all;
  use ieee.std_logic_unsigned.all;
  use ieee.std_logic_arith.all;
  use ieee.std_logic_arith.all;
Line 86... Line 91...
  signal epoch_buffer   : std_logic_vector(23 downto 0);
  signal epoch_buffer   : std_logic_vector(23 downto 0);
  signal epoch_setpt    : std_logic_vector(25 downto 0);
  signal epoch_setpt    : std_logic_vector(25 downto 0);
  signal epoch_alarm    : std_logic;
  signal epoch_alarm    : std_logic;
  signal epoch_alarm_q  : std_logic;
  signal epoch_alarm_q  : std_logic;
 
 
  signal epoch_gie      : std_logic;
 
 
 
begin
begin
 
 
  Addr_Match            <= '1' when Comp_Addr = User_Addr else '0';
  Addr_Match            <= '1' when Comp_Addr = User_Addr else '0';
 
 
  io_reg: process( Clock, Reset )
  io_reg: process( Clock, Reset )
Line 105... Line 108...
      Wr_Data_q         <= (others => '0');
      Wr_Data_q         <= (others => '0');
      Reg_Addr_q        <= (others => '0');
      Reg_Addr_q        <= (others => '0');
      Wr_En             <= '0';
      Wr_En             <= '0';
      Rd_En             <= '0';
      Rd_En             <= '0';
      Rd_Data           <= (others => '0');
      Rd_Data           <= (others => '0');
      epoch_gie         <= '0';
 
      Interrupt         <= '0';
      Interrupt         <= '0';
    elsif( rising_edge( Clock ) )then
    elsif( rising_edge( Clock ) )then
      epoch_tmr         <= epoch_tmr + uSec_Tick;
      epoch_tmr         <= epoch_tmr + uSec_Tick;
    -- Force the lower bits of the setpoint to "11" so that the offset is
    -- Force the lower bits of the setpoint to "11" so that the offset is
    --  reduced to 1uS (reproducing the original behavior). Software should
    --  reduced to 1uS (reproducing the original behavior). Software should
Line 136... Line 138...
              epoch_buffer            <= epoch_tmrcmp;
              epoch_buffer            <= epoch_tmrcmp;
            end if;
            end if;
            if( Wr_Data_q(1) = '1' )then
            if( Wr_Data_q(1) = '1' )then
              epoch_tmr               <= (others => '0');
              epoch_tmr               <= (others => '0');
            end if;
            end if;
            epoch_gie                 <= Wr_Data_q(6);
 
            if( Wr_Data_q(7) = '1' )then
            if( Wr_Data_q(7) = '1' )then
              epoch_alarm             <= '0';
              epoch_alarm             <= '0';
            end if;
            end if;
 
 
          when others => null;
          when others => null;
        end case;
        end case;
      end if;
      end if;
 
 
      -- Set and hold on alarm condition
      -- Set and hold on alarm condition
      if( (epoch_tmr > epoch_setpt) and (epoch_alarm = '0') )then
      if( epoch_tmr > epoch_setpt )then
        epoch_alarm     <= '1';
        epoch_alarm     <= '1';
      end if;
      end if;
 
 
      epoch_alarm_q     <= epoch_alarm;
      epoch_alarm_q     <= epoch_alarm;
      -- Fire on rising edge of epoch_alarm
      -- Fire on rising edge of epoch_alarm
      Interrupt         <= epoch_gie and
      Interrupt         <= epoch_alarm and not epoch_alarm_q;
                           (epoch_alarm and not epoch_alarm_q);
 
 
 
      Rd_Data           <= (others => '0');
      Rd_Data           <= (others => '0');
      Rd_En             <= Addr_Match and Rd_Enable;
      Rd_En             <= Addr_Match and Rd_Enable;
      if( Rd_En = '1' )then
      if( Rd_En = '1' )then
        case( Reg_Addr_q )is
        case( Reg_Addr_q )is
Line 166... Line 166...
          when "01" =>
          when "01" =>
            Rd_Data     <= epoch_buffer(15 downto 8);
            Rd_Data     <= epoch_buffer(15 downto 8);
          when "10" =>
          when "10" =>
            Rd_Data     <= epoch_buffer(23 downto 16);
            Rd_Data     <= epoch_buffer(23 downto 16);
          when "11" =>
          when "11" =>
            Rd_Data     <= epoch_alarm & epoch_gie &
            Rd_Data     <= epoch_alarm & "0000000";
                           "000000";
 
          when others => null;
          when others => null;
        end case;
        end case;
      end if;
      end if;
    end if;
    end if;
  end process;
  end process;

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.