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

Subversion Repositories w11

[/] [w11/] [tags/] [w11a_V0.5/] [rtl/] [w11a/] [pdp11_bram.vhd] - Blame information for rev 7

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 wfjm
-- $Id: pdp11_bram.vhd 314 2010-07-09 17:38:41Z mueller $
2
--
3
-- Copyright 2008- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
4
--
5
-- This program is free software; you may redistribute and/or modify it under
6
-- the terms of the GNU General Public License as published by the Free
7
-- Software Foundation, either version 2, or at your option any later version.
8
--
9
-- This program is distributed in the hope that it will be useful, but
10
-- WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
11
-- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12
-- for complete details.
13
-- 
14
------------------------------------------------------------------------------
15
-- Module Name:    pdp11_bram - syn
16
-- Description:    pdp11: BRAM based ext. memory dummy
17
--
18
-- Dependencies:   memlib/ram_2swsr_rfirst_gen
19
-- Test bench:     -
20
-- Target Devices: generic
21
-- Tool versions:  xst 8.1, 8.2, 9.1, 9.2; ghdl 0.18-0.25
22
-- Revision History: 
23
-- Date         Rev Version  Comment
24
-- 2008-03-01   120   1.0.2  add addrzero constant to avoid XST errors
25
-- 2008-02-23   118   1.0.1  AWIDTH now a generic port
26
-- 2008-02-17   117   1.0    Initial version 
27
------------------------------------------------------------------------------
28
 
29
library ieee;
30
use ieee.std_logic_1164.all;
31
use ieee.std_logic_arith.all;
32
 
33
use work.slvtypes.all;
34
use work.memlib.all;
35
use work.pdp11.all;
36
 
37
entity pdp11_bram is                   -- cache
38
  generic (
39
    AWIDTH : positive := 14);           -- address width
40
  port (
41
    CLK : in slbit;                     -- clock
42
    GRESET : in slbit;                  -- global reset
43
    EM_MREQ : in em_mreq_type;          -- em request
44
    EM_SRES : out em_sres_type          -- em response
45
  );
46
end pdp11_bram;
47
 
48
 
49
architecture syn of pdp11_bram is
50
 
51
  type regs_type is record
52
    req_r : slbit;                      -- read request
53
    req_w : slbit;                      -- write request
54
    be : slv2;                          -- byte enables
55
    addr : slv(AWIDTH-1 downto 1);      -- address
56
  end record regs_type;
57
 
58
  constant addrzero : slv(AWIDTH-1 downto 1) := (others=>'0');
59
 
60
  constant regs_init : regs_type := (
61
    '0','0',                            -- req_r,w
62
    (others=>'0'),                      -- be
63
    addrzero                            -- addr
64
  );
65
 
66
  signal R_REGS : regs_type := regs_init;  -- state registers
67
  signal N_REGS : regs_type := regs_init;  -- next value state regs
68
 
69
  signal MEM_ENB : slbit := '0';
70
  signal MEM_WEA : slv2  := "00";
71
  signal MEM_DOA : slv16 := (others=>'0');
72
begin
73
 
74
  MEM_BYT0 : ram_2swsr_rfirst_gen
75
    generic map (
76
      AWIDTH => AWIDTH-1,
77
      DWIDTH =>  8)
78
    port map (
79
      CLKA  => CLK,
80
      CLKB  => CLK,
81
      ENA   => EM_MREQ.req,
82
      ENB   => MEM_ENB,
83
      WEA   => MEM_WEA(0),
84
      WEB   => R_REGS.be(0),
85
      ADDRA => EM_MREQ.addr(AWIDTH-1 downto 1),
86
      ADDRB => R_REGS.addr,
87
      DIA   => EM_MREQ.din(7 downto 0),
88
      DIB   => MEM_DOA(7 downto 0),
89
      DOA   => MEM_DOA(7 downto 0),
90
      DOB   => open
91
      );
92
 
93
  MEM_BYT1 : ram_2swsr_rfirst_gen
94
    generic map (
95
      AWIDTH => AWIDTH-1,
96
      DWIDTH =>  8)
97
    port map (
98
      CLKA  => CLK,
99
      CLKB  => CLK,
100
      ENA   => EM_MREQ.req,
101
      ENB   => MEM_ENB,
102
      WEA   => MEM_WEA(1),
103
      WEB   => R_REGS.be(1),
104
      ADDRA => EM_MREQ.addr(AWIDTH-1 downto 1),
105
      ADDRB => R_REGS.addr,
106
      DIA   => EM_MREQ.din(15 downto 8),
107
      DIB   => MEM_DOA(15 downto 8),
108
      DOA   => MEM_DOA(15 downto 8),
109
      DOB   => open
110
      );
111
 
112
  proc_regs: process (CLK)
113
  begin
114
 
115
    if CLK'event and CLK='1' then
116
      if GRESET = '1' then
117
        R_REGS <= regs_init;
118
      else
119
        R_REGS <= N_REGS;
120
      end if;
121
    end if;
122
 
123
  end process proc_regs;
124
 
125
  N_REGS.req_r  <= EM_MREQ.req and not EM_MREQ.we;
126
  N_REGS.req_w  <= EM_MREQ.req and EM_MREQ.we;
127
  N_REGS.be     <= EM_MREQ.be;
128
  N_REGS.addr   <= EM_MREQ.addr(N_REGS.addr'range);
129
 
130
  MEM_WEA(0) <= EM_MREQ.we and EM_MREQ.be(0);
131
  MEM_WEA(1) <= EM_MREQ.we and EM_MREQ.be(1);
132
  MEM_ENB    <= EM_MREQ.cancel and R_REGS.req_w;
133
 
134
  EM_SRES.ack_r <= R_REGS.req_r;
135
  EM_SRES.ack_w <= R_REGS.req_w;
136
  EM_SRES.dout  <= MEM_DOA;
137
 
138
end syn;

powered by: WebSVN 2.1.0

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