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

Subversion Repositories fpz8

[/] [fpz8_timer.vhd] - Blame information for rev 3

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 3 fabiop
-- FPz8 simple timer
2
-- By Fabio Pereira
3
 
4
library ieee ;
5
use ieee.std_logic_1164.all ;
6
use ieee.numeric_std.all;
7
use ieee.std_logic_unsigned.all ;
8
 
9
entity fpz8_timer IS
10
        port
11
        (
12
                RAB                     : in std_logic_vector(11 downto 0);
13
                RIDB            : in std_logic_vector(7 downto 0);
14
                RODB            : out std_logic_vector(7 downto 0);
15
                SIDB            : in std_logic_vector(7 downto 0);
16
                REG_SEL         : in std_logic;
17
                WR                      : in std_logic;
18
                CLK_IN          : in std_logic;
19
                STOP            : in std_logic;
20
                INT                     : out std_logic;
21
                TMR_OUT         : out std_logic;
22
                TMR_IN          : in std_logic;
23
                TMR_ID          : in std_logic_vector(1 downto 0);
24
                RESET           : in std_logic
25
        );
26
end fpz8_timer;
27
 
28
architecture timer of fpz8_timer is
29
shared variable TMR_EN          : std_logic;
30
shared variable TMR_CMP         : std_logic_vector(15 downto 0);
31
shared variable TMR_TEMP        : std_logic_vector(7 downto 0);
32
shared variable TMR_PRESEL      : std_logic_vector(2 downto 0);
33
shared variable TMR_CNT         : std_logic_vector(15 downto 0);
34
shared variable TMR_PRE         : std_logic_vector(7 downto 0);
35
shared variable INT_OUT         : std_logic;
36
shared variable BASE_ADDR       : std_logic_vector(11 downto 0);
37
begin
38
        control: process(CLK_IN,REG_SEL,RESET)
39
        begin
40
                INT <= INT_OUT;
41
                case TMR_ID is
42
                        when "00" =>    BASE_ADDR := x"F00";
43
                        when "01" =>    BASE_ADDR := x"F08";
44
                        when "10" =>    BASE_ADDR := x"F10";
45
                        when "11" =>    BASE_ADDR := x"F18";
46
                end case;
47
                if (RESET='1') then
48
                        TMR_EN := '0';
49
                        TMR_CMP := x"0000";
50
                        TMR_TEMP := x"00";
51
                elsif (rising_edge(CLK_IN) and REG_SEL='1') then
52
                        if (WR='0') then -- it is a reading operation
53
                                if (RAB=(BASE_ADDR+7)) then ------ register TMR_CTL
54
                                        RODB<=TMR_EN&'0'&TMR_PRESEL&"000";
55
                                elsif (RAB=BASE_ADDR+2) then    -- register TMR_CMPH
56
                                        RODB<=TMR_CMP(15 downto 8);
57
                                elsif (RAB=BASE_ADDR+3) then    -- register TMR_CMPL
58
                                        RODB<=TMR_CMP(7 downto 0);
59
                                else RODB<=SIDB;
60
                                end if;
61
                        else                            -- it is a writing operation
62
                                if (RAB=BASE_ADDR+7) then ----- register TMR_CTL
63
                                        TMR_EN:=RIDB(7);
64
                                        TMR_PRESEL:=RIDB(5 downto 3);
65
                                elsif (RAB=BASE_ADDR+2) then    -- register TMR_RLH
66
                                        TMR_TEMP := RIDB;
67
                                elsif (RAB=BASE_ADDR+3) then    -- register TMR_RLL
68
                                        TMR_CMP(7 downto 0) := RIDB;
69
                                        TMR_CMP(15 downto 8) := TMR_TEMP;
70
                                end if;
71
                        end if;
72
                end if;
73
        end process control;    -- control process
74
        counter: process(CLK_IN,RESET,STOP)
75
        variable TMR_PRECP      : std_logic_vector(7 downto 0);
76
        begin
77
                if (RESET='1') then
78
                        TMR_CNT := x"0000";
79
                        TMR_PRE := x"00";
80
                        TMR_PRECP := x"00";
81
                        INT_OUT := '0';
82
                elsif (rising_edge(CLK_IN)) then
83
                        if (STOP='0') then
84
                                if (TMR_EN='1') then
85
                                        case TMR_PRESEL is
86
                                                when "000"      => TMR_PRECP:=x"01";    -- prescaler divide by 1
87
                                                when "001"      => TMR_PRECP:=x"02";    -- prescaler divide by 2
88
                                                when "010"      => TMR_PRECP:=x"04";    -- prescaler divide by 4
89
                                                when "011"      => TMR_PRECP:=x"08";    -- prescaler divide by 8
90
                                                when "100"      => TMR_PRECP:=x"10";    -- prescaler divide by 16
91
                                                when "101"      => TMR_PRECP:=x"20";    -- prescaler divide by 32
92
                                                when "110"      => TMR_PRECP:=x"40";    -- prescaler divide by 64
93
                                                when others     => TMR_PRECP:=x"80";    -- prescaler divide by 128
94
                                        end case;
95
                                        TMR_PRE := TMR_PRE + 1;
96
                                        if (TMR_PRE=TMR_PRECP) then
97
                                                TMR_PRE:=x"00";
98
                                                TMR_CNT:=TMR_CNT+1;
99
                                                if (TMR_CNT=TMR_CMP) then
100
                                                        TMR_CNT:=x"0000";
101
                                                        INT_OUT := not INT_OUT;
102
                                                end if;
103
                                        end if;
104
                                else
105
                                        TMR_CNT:=x"0000";
106
                                        TMR_PRE:=x"00";
107
                                end if; -- if TMR_EN=1
108
                        end if; -- if STOP=0
109
                end if; -- rising edge of CLK_IN
110
        end process;    -- counter process
111
end timer;

powered by: WebSVN 2.1.0

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