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

Subversion Repositories rise

[/] [rise/] [trunk/] [vhdl/] [rlu.vhd] - Blame information for rev 148

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 jlechner
-- File: rlu.vhd
2
-- Author: Jakob Lechner, Urban Stadler, Harald Trinkl, Christian Walter
3
-- Created: 2006-11-29
4
-- Last updated: 2006-11-29
5
 
6
-- Description:
7
-- Register Lock Unit (Provides flags for locking access to registers).
8
-------------------------------------------------------------------------------
9
 
10
library IEEE;
11
use IEEE.STD_LOGIC_1164.all;
12 77 cwalter
use IEEE.NUMERIC_STD.all;
13 2 jlechner
use WORK.RISE_PACK.all;
14 77 cwalter
use WORK.RISE_PACK_SPECIFIC.all;
15 2 jlechner
 
16
entity rlu is
17
 
18
  port (
19 14 cwalter
    clk   : in std_logic;
20
    reset : in std_logic;
21 89 jlechner
    clear_locks : in std_logic;
22
 
23 41 jlechner
    lock_register       : out LOCK_REGISTER_T;
24 2 jlechner
 
25 41 jlechner
    set_lock0           : in std_logic;
26
    set_lock_addr0      : in REGISTER_ADDR_T;
27 2 jlechner
 
28 41 jlechner
    set_lock1           : in std_logic;
29
    set_lock_addr1      : in REGISTER_ADDR_T;
30
 
31
    clear_lock0         : in std_logic;
32
    clear_lock_addr0    : in REGISTER_ADDR_T;
33
 
34
    clear_lock1         : in std_logic;
35
    clear_lock_addr1    : in REGISTER_ADDR_T);
36 14 cwalter
 
37 2 jlechner
end rlu;
38
 
39
 
40
architecture rlu_rtl of rlu is
41
 
42 14 cwalter
  signal lock_register_int  : LOCK_REGISTER_T;
43
  signal lock_register_next : LOCK_REGISTER_T;
44 8 jlechner
 
45 2 jlechner
begin  -- rlu_rtl
46
 
47 8 jlechner
  lock_register <= lock_register_int;
48 14 cwalter
 
49
  sync : process (clk, reset)
50 8 jlechner
  begin  -- process
51
    if reset = '0' then                 -- asynchronous reset (active low)
52
      lock_register_int <= (others => '0');
53
    elsif clk'event and clk = '1' then  -- rising clock edge
54 89 jlechner
      if clear_locks = '1' then
55
        lock_register_int <= (others => '0');
56
      else
57
        lock_register_int <= lock_register_next;
58
      end if;
59 8 jlechner
    end if;
60
  end process;
61 2 jlechner
 
62 14 cwalter
  async : process (lock_register_int,
63 41 jlechner
                   clear_lock0, set_lock0,
64
                   clear_lock1, set_lock1,
65
                   clear_lock_addr0, set_lock_addr0,
66
                   clear_lock_addr1, set_lock_addr1)
67 8 jlechner
  begin  -- process async
68
    lock_register_next <= lock_register_int;
69
 
70 14 cwalter
    -- first unlock all possible registers and then lock them. because
71
    -- the last assignment counts this also works correct if reg_addr0
72
    -- and reg_addr1 are the same and one unlocks and one locks the
73
    -- register (correct behaviour is that the register is locked).
74 41 jlechner
 
75
    -- clear register0 lock
76
    if clear_lock0 = '1' then
77
      lock_register_next(to_integer(unsigned(clear_lock_addr0))) <= '0';
78 8 jlechner
    end if;
79 41 jlechner
    -- clear register1 lock
80
    if clear_lock1 = '1' then
81
      lock_register_next(to_integer(unsigned(clear_lock_addr1))) <= '0';
82 8 jlechner
    end if;
83 41 jlechner
    -- set register0 lock
84
    if set_lock0 = '1' then
85
      lock_register_next(to_integer(unsigned(set_lock_addr0))) <= '1';
86 14 cwalter
    end if;
87 41 jlechner
    -- set register1 lock
88
    if set_lock1 = '1' then
89
      lock_register_next(to_integer(unsigned(set_lock_addr1))) <= '1';
90 14 cwalter
    end if;
91
 
92 8 jlechner
  end process async;
93
 
94 2 jlechner
end rlu_rtl;

powered by: WebSVN 2.1.0

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