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

Subversion Repositories rise

[/] [rise/] [trunk/] [vhdl/] [memctrl.vhd] - Blame information for rev 151

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 jlechner
-- File: dmem.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
-- Entity for accessing data memory.
8
-------------------------------------------------------------------------------
9
 
10
library IEEE;
11
use IEEE.STD_LOGIC_1164.all;
12 125 trinklhar
use ieee.numeric_std.all;
13 2 jlechner
 
14
use WORK.RISE_PACK.all;
15 151 jlechner
use WORK.CONF_PACK.all;
16 2 jlechner
 
17 98 cwalter
 
18 151 jlechner
entity memctrl is
19 2 jlechner
 
20
  port (
21 98 cwalter
    clk   : in std_logic;
22
    reset : in std_logic;
23 60 cwalter
    wr_enable : in  std_logic;
24
    addr      : in  MEM_ADDR_T;
25
    data_in   : in  MEM_DATA_T;
26 120 trinklhar
    data_out  : out MEM_DATA_T;
27 128 jlechner
    uart_txd : out std_logic;
28
    uart_rxd : in std_logic);
29 2 jlechner
 
30 151 jlechner
end memctrl;
31 2 jlechner
 
32 151 jlechner
architecture memctrl_rtl of memctrl is
33 98 cwalter
 
34 151 jlechner
  component dmem
35 37 jlechner
    port (
36 151 jlechner
      addr  : in  std_logic_vector(DMEM_ADDR_WIDTH-1 downto 0);
37 60 cwalter
      clk   : in  std_logic;
38 151 jlechner
      data_in   : in  MEM_DATA_T;
39
      data_out  : out MEM_DATA_T;
40
      wr_enable : in  std_logic);
41 37 jlechner
  end component;
42 125 trinklhar
 
43 128 jlechner
  component sc_uart is
44
                      generic (ADDR_BITS : integer;
45
                               CLK_FREQ  : integer;
46
                               BAUD_RATE : integer;
47
                               TXF_DEPTH : integer;
48
                               TXF_THRES : integer;
49
                               RXF_DEPTH : integer;
50
                               RXF_THRES : integer);
51
                    port (CLK     : in  std_logic;
52
                          RESET   : in  std_logic;
53
                          ADDRESS : in  std_logic_vector(addr_bits-1 downto 0);
54
                          WR_DATA : in  std_logic_vector(15 downto 0);
55
                          RD, WR  : in  std_logic;
56
                          RD_DATA : out std_logic_vector(15 downto 0);
57
                          RDY_CNT : out unsigned(1 downto 0);
58
                          TXD     : out std_logic;
59
                          RXD     : in  std_logic;
60
                          NCTS    : in  std_logic;
61
                          NRTS    : out std_logic);
62
  end component;
63 23 ustadler
 
64 120 trinklhar
 
65 128 jlechner
  signal uart_address           : std_logic_vector(1 downto 0);
66
  signal uart_wr_data           :std_logic_vector(15 downto 0);
67
  signal uart_rd                        : std_logic;
68
  signal uart_wr                        : std_logic;
69
  signal uart_rd_data           : std_logic_vector(15 downto 0);
70 120 trinklhar
 
71 128 jlechner
  signal uart_txd_sig           : std_logic;
72
  signal uart_rxd_sig           : std_logic;
73
 
74
  signal mem_addr : std_logic_vector (11 downto 0);
75
  signal mem_data_in :MEM_DATA_T;
76
  signal mem_data_out :MEM_DATA_T;
77
  signal mem_wr_enable:  std_logic;
78
 
79
  signal last_address_int : MEM_ADDR_T;
80
  signal last_address_next : MEM_ADDR_T;
81
 
82
  signal rdy_cnt_sig            : IEEE.NUMERIC_STD.unsigned(1 downto 0);
83 2 jlechner
begin  -- dmem_rtl
84 98 cwalter
 
85 120 trinklhar
  -- Uart modul einbinden
86
  UART : sc_uart generic map (
87
    ADDR_BITS => 2,
88
    CLK_FREQ  => CLK_FREQ,
89
    BAUD_RATE => 115200,
90
    TXF_DEPTH => 2,
91
    TXF_THRES => 1,
92
    RXF_DEPTH => 2,
93
    RXF_THRES => 1
94
    )
95 128 jlechner
    port map(
96 120 trinklhar
      CLK     => clk,
97
      RESET   => reset,
98
      ADDRESS => uart_address(1 downto 0),
99
      WR_DATA => uart_wr_data,
100
      RD      => uart_rd,
101
      WR      => uart_wr,
102
      RD_DATA => uart_rd_data,
103 125 trinklhar
      RDY_CNT => rdy_cnt_sig,
104 120 trinklhar
      TXD     => uart_txd_sig,
105
      RXD     => uart_rxd_sig,
106
      NCTS    => '0',
107
      NRTS    => open
108
      );
109
 
110 151 jlechner
  DATA_MEM : dmem
111 37 jlechner
    port map (
112 120 trinklhar
      addr  => mem_addr,
113 60 cwalter
      clk   => clk,
114 120 trinklhar
      din   => mem_data_in,
115
      dout  => mem_data_out,
116 37 jlechner
      sinit => reset,
117 120 trinklhar
      we    => mem_wr_enable);
118 98 cwalter
 
119
 
120 128 jlechner
  uart_txd              <= uart_txd_sig;
121
  uart_rxd_sig          <= uart_rxd;
122 120 trinklhar
 
123 128 jlechner
  store_address: process (clk, reset)
124
  begin  -- process data_out
125
    if reset='0' then
126
      last_address_int <= (others => '0');
127
    elsif clk'event and clk='1' then
128
      last_address_int <= last_address_next;
129
    end if;
130
  end process store_address;
131 120 trinklhar
 
132 128 jlechner
  process (last_address_int, mem_data_out, uart_rd_data)
133
  begin
134
    if last_address_int = CONST_UART_STATUS_ADDRESS
135
      or last_address_int = CONST_UART_DATA_ADDRESS then
136
      data_out <= uart_rd_data;
137
    else
138
      data_out <= mem_data_out;
139
    end if;
140
  end process;
141 120 trinklhar
 
142 128 jlechner
  process (wr_enable, addr, data_in, uart_rd_data, mem_data_out)
143
  begin
144 120 trinklhar
 
145 128 jlechner
    mem_addr <= (others => '0');
146
    mem_data_in <= (others => '0');
147
    mem_wr_enable <= '0';
148 135 ustadler
         uart_address <= (others => '0');
149 120 trinklhar
 
150 128 jlechner
    uart_wr <= '0';
151
    uart_wr_data <= (others => '0');
152
    uart_rd <= '0';
153 120 trinklhar
 
154 128 jlechner
    last_address_next <= addr;
155
 
156
    if addr = CONST_UART_STATUS_ADDRESS
157
      or addr = CONST_UART_DATA_ADDRESS then
158
      -- accessing UART
159
 
160
      uart_address <= addr (1 downto 0);
161 135 ustadler
 
162
                if wr_enable = '1' then
163 128 jlechner
        uart_wr <= '1';
164
        uart_wr_data <= data_in;
165
      else
166
        uart_rd <= '1';
167
      end if;
168
    else
169
      -- accessing data memory
170
      mem_addr <= addr(11 downto 0);
171
      mem_data_in <= data_in;
172
      mem_wr_enable <= wr_enable;
173
    end if;
174
 
175
  end process;
176
 
177 151 jlechner
end memctrl_rtl;
178 23 ustadler
 
179
 
180
 
181
 
182
 
183
 
184
 
185
 

powered by: WebSVN 2.1.0

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