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

Subversion Repositories w11

[/] [w11/] [tags/] [w11a_V0.7/] [rtl/] [bplib/] [bpgen/] [sn_humanio_demu_rbus.vhd] - Blame information for rev 36

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 29 wfjm
-- $Id: sn_humanio_demu_rbus.vhd 637 2015-01-25 18:36:40Z mueller $
2 18 wfjm
--
3 27 wfjm
-- Copyright 2013-2014 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
4 18 wfjm
--
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:    sn_humanio_demu_rbus - syn
16
-- Description:    sn_humanio_demu with rbus interceptor
17
--
18
-- Dependencies:   bpgen/sn_humanio_demu
19
--
20
-- Test bench:     -
21
--
22
-- Target Devices: generic
23 27 wfjm
-- Tool versions:  xst 13.3-14.7; ghdl 0.0.29-0.31
24 18 wfjm
--
25
-- Synthesized (xst):
26
-- Date         Rev  ise         Target      flop lutl lutm slic t peri
27
-- 2013-01-06   472 13.3   O76xd xc3s1000-4   160  136    0  124 s  6.1 ns 
28
--
29
-- Revision History: 
30
-- Date         Rev Version  Comment
31 27 wfjm
-- 2014-08-15   583   1.1    rb_mreq addr now 16 bit
32 18 wfjm
-- 2013-01-06   472   1.0    Initial version (cloned from sn_humanio_rbus
33
------------------------------------------------------------------------------
34
--
35
-- rbus registers:
36
--
37
-- Address   Bits Name        r/w/f  Function
38
-- bbbbbb00       cntl        r/w/-  Control register and BTN access
39
--           x:08   btn       r/w/-    r: return hio BTN status
40
--                                     w: ored with hio BTN to drive BTN
41
--              3   dsp_en    r/w/-    if 1 display data will be driven by rbus
42
--              2   dp_en     r/w/-    if 1 display dp's will be driven by rbus
43
--              1   led_en    r/w/-    if 1 LED will be driven by rri
44
--              0   swi_en    r/w/-    if 1 SWI will be driven by rri
45
--
46
-- bbbbbb01  7:00   swi       r/w/-    r: return hio SWI status
47
--                                     w: will drive SWI when swi_en=1
48
--
49
-- bbbbbb10         led       r/w/-  Interface to LED and DSP_DP
50
--          15:12     dp      r/w/-    r: returns DSP_DP status
51
--                                     w: will drive display dp's when dp_en=1
52
--           7:00     led     r/w/-    r: returns LED status
53
--                                     w: will drive led's when led_en=1
54
--
55
-- bbbbbb11 15:00   dsp       r/w/-    r: return hio DSP_DAT status
56
--                                     w: will drive DSP_DAT when dsp_en=1
57
--
58
 
59
library ieee;
60
use ieee.std_logic_1164.all;
61
use ieee.numeric_std.all;
62
 
63
use work.slvtypes.all;
64
use work.rblib.all;
65
use work.bpgenlib.all;
66
 
67
-- ----------------------------------------------------------------------------
68
 
69
entity sn_humanio_demu_rbus is          -- human i/o swi,btn,led only /w rbus
70
  generic (
71
    DEBOUNCE : boolean := true;         -- instantiate debouncer for SWI,BTN
72 29 wfjm
    RB_ADDR : slv16 := slv(to_unsigned(16#fef0#,16)));
73 18 wfjm
  port (
74
    CLK : in slbit;                     -- clock
75
    RESET : in slbit := '0';            -- reset
76
    CE_MSEC : in slbit;                 -- 1 ms clock enable
77
    RB_MREQ : in rb_mreq_type;          -- rbus: request
78
    RB_SRES : out rb_sres_type;         -- rbus: response
79
    SWI : out slv8;                     -- switch settings, debounced
80
    BTN : out slv4;                     -- button settings, debounced
81
    LED : in slv8;                      -- led data
82
    DSP_DAT : in slv16;                 -- display data
83
    DSP_DP : in slv4;                   -- display decimal points
84
    I_SWI : in slv8;                    -- pad-i: switches
85
    I_BTN : in slv6;                    -- pad-i: buttons
86
    O_LED : out slv8                    -- pad-o: leds
87
  );
88
end sn_humanio_demu_rbus;
89
 
90
architecture syn of sn_humanio_demu_rbus is
91
 
92
  type regs_type is record
93
    rbsel : slbit;                      -- rbus select
94
    swi : slv8;                         -- rbus swi
95
    btn : slv4;                         -- rbus btn
96
    led : slv8;                         -- rbus led
97
    dsp_dat : slv16;                    -- rbus dsp_dat
98
    dsp_dp  : slv4;                     -- rbus dsp_dp
99
    ledin : slv8;                       -- led from design
100
    swieff : slv8;                      -- effective swi
101
    btneff : slv4;                      -- effective btn
102
    ledeff : slv8;                      -- effective led
103
    dpeff : slv4;                       -- effective dsp_dp
104
    dateff : slv16;                     -- effective dsp_dat
105
    swi_en : slbit;                     -- enable: swi from rbus
106
    led_en : slbit;                     -- enable: led from rbus
107
    dsp_en : slbit;                     -- enable: dsp_dat from rbus
108
    dp_en : slbit;                      -- enable: dsp_dp  from rbus
109
  end record regs_type;
110
 
111
  constant regs_init : regs_type := (
112
    '0',                                -- rbsel
113
    (others=>'0'),                      -- swi
114
    (others=>'0'),                      -- btn
115
    (others=>'0'),                      -- led
116
    (others=>'0'),                      -- dsp_dat
117
    (others=>'0'),                      -- dsp_dp
118
    (others=>'0'),                      -- ledin
119
    (others=>'0'),                      -- swieff
120
    (others=>'0'),                      -- btneff
121
    (others=>'0'),                      -- ledeff
122
    (others=>'0'),                      -- dpeff
123
    (others=>'0'),                      -- dateff
124
    '0','0','0','0'                     -- (swi|led|dsp|dp)_en
125
  );
126
 
127
  signal R_REGS : regs_type := regs_init;  -- state registers
128
  signal N_REGS : regs_type := regs_init;  -- next value state regs
129
 
130
  subtype  cntl_rbf_btn      is integer range 11 downto 8;
131
  constant cntl_rbf_dsp_en:  integer :=  3;
132
  constant cntl_rbf_dp_en:   integer :=  2;
133
  constant cntl_rbf_led_en:  integer :=  1;
134
  constant cntl_rbf_swi_en:  integer :=  0;
135
  subtype  led_rbf_dp      is integer range 15 downto 12;
136
  subtype  led_rbf_led     is integer range  7 downto  0;
137
 
138
  constant rbaddr_cntl:  slv2 := "00";  --  0    r/w/-
139
  constant rbaddr_swi:   slv2 := "01";  --  1    r/w/-
140
  constant rbaddr_led:   slv2 := "10";  --  2    r/w/-
141
  constant rbaddr_dsp:   slv2 := "11";  --  3    r/w/-
142
 
143
  signal HIO_SWI : slv8 := (others=>'0');
144
  signal HIO_BTN : slv4 := (others=>'0');
145
  signal HIO_LED : slv8 := (others=>'0');
146
  signal HIO_DSP_DAT : slv16 := (others=>'0');
147
  signal HIO_DSP_DP  : slv4 := (others=>'0');
148
 
149
begin
150
 
151
  HIO : sn_humanio_demu
152
    generic map (
153
      DEBOUNCE => DEBOUNCE)
154
    port map (
155
      CLK     => CLK,
156
      RESET   => RESET,
157
      CE_MSEC => CE_MSEC,
158
      SWI     => HIO_SWI,
159
      BTN     => HIO_BTN,
160
      LED     => HIO_LED,
161
      DSP_DAT => HIO_DSP_DAT,
162
      DSP_DP  => HIO_DSP_DP,
163
      I_SWI   => I_SWI,
164
      I_BTN   => I_BTN,
165
      O_LED   => O_LED
166
    );
167
 
168
  proc_regs: process (CLK)
169
  begin
170
 
171
    if rising_edge(CLK) then
172
      if RESET = '1' then
173
        R_REGS <= regs_init;
174
      else
175
        R_REGS <= N_REGS;
176
      end if;
177
    end if;
178
 
179
  end process proc_regs;
180
 
181
  proc_next: process (R_REGS, RB_MREQ, LED, DSP_DAT, DSP_DP,
182
                      HIO_SWI, HIO_BTN, HIO_DSP_DAT, HIO_DSP_DP)
183
 
184
    variable r : regs_type := regs_init;
185
    variable n : regs_type := regs_init;
186
 
187
    variable irb_ack  : slbit := '0';
188
    variable irb_busy : slbit := '0';
189
    variable irb_err  : slbit := '0';
190
    variable irb_dout : slv16 := (others=>'0');
191
    variable irbena   : slbit := '0';
192
 
193
  begin
194
 
195
    r := R_REGS;
196
    n := R_REGS;
197
 
198
    irb_ack  := '0';
199
    irb_busy := '0';
200
    irb_err  := '0';
201
    irb_dout := (others=>'0');
202
 
203
    irbena  := RB_MREQ.re or RB_MREQ.we;
204
 
205
    -- input register for LED signal
206
    n.ledin  := LED;
207
 
208
    -- rbus address decoder
209
    n.rbsel := '0';
210 27 wfjm
    if RB_MREQ.aval='1' and RB_MREQ.addr(15 downto 2)=RB_ADDR(15 downto 2) then
211 18 wfjm
      n.rbsel := '1';
212
    end if;
213
 
214
    -- rbus transactions
215
    if r.rbsel = '1' then
216
      irb_ack := irbena;                  -- ack all accesses
217
 
218
      case RB_MREQ.addr(1 downto 0) is
219
 
220
        when rbaddr_cntl =>
221
          irb_dout(cntl_rbf_btn)    := HIO_BTN;
222
          irb_dout(cntl_rbf_dsp_en) := r.dsp_en;
223
          irb_dout(cntl_rbf_dp_en)  := r.dp_en;
224
          irb_dout(cntl_rbf_led_en) := r.led_en;
225
          irb_dout(cntl_rbf_swi_en) := r.swi_en;
226
          if RB_MREQ.we = '1' then
227
            n.btn    := RB_MREQ.din(cntl_rbf_btn);
228
            n.dsp_en := RB_MREQ.din(cntl_rbf_dsp_en);
229
            n.dp_en  := RB_MREQ.din(cntl_rbf_dp_en);
230
            n.led_en := RB_MREQ.din(cntl_rbf_led_en);
231
            n.swi_en := RB_MREQ.din(cntl_rbf_swi_en);
232
          end if;
233
 
234
        when rbaddr_swi =>
235
          irb_dout(HIO_SWI'range) := HIO_SWI;
236
          if RB_MREQ.we = '1' then
237
            n.swi := RB_MREQ.din(n.swi'range);
238
          end if;
239
 
240
        when rbaddr_led =>
241
          irb_dout(led_rbf_dp)  := HIO_DSP_DP;
242
          irb_dout(led_rbf_led) := r.ledin;
243
          if RB_MREQ.we = '1' then
244
            n.dsp_dp := RB_MREQ.din(led_rbf_dp);
245
            n.led    := RB_MREQ.din(led_rbf_led);
246
          end if;
247
 
248
        when rbaddr_dsp =>
249
          irb_dout := HIO_DSP_DAT;
250
          if RB_MREQ.we = '1' then
251
            n.dsp_dat := RB_MREQ.din;
252
          end if;
253
 
254
        when others => null;
255
      end case;
256
 
257
    end if;
258
 
259
    n.btneff := HIO_BTN or r.btn;
260
 
261
    if r.swi_en = '0' then
262
      n.swieff := HIO_SWI;
263
    else
264
      n.swieff := r.swi;
265
    end if;
266
 
267
    if r.led_en = '0' then
268
      n.ledeff := r.ledin;
269
    else
270
      n.ledeff := r.led;
271
    end if;
272
 
273
    if r.dp_en = '0' then
274
      n.dpeff  := DSP_DP;
275
    else
276
      n.dpeff  := r.dsp_dp;
277
    end if;
278
 
279
    if r.dsp_en = '0' then
280
      n.dateff := DSP_DAT;
281
    else
282
      n.dateff := r.dsp_dat;
283
    end if;
284
 
285
    N_REGS       <= n;
286
 
287
    BTN         <= R_REGS.btneff;
288
    SWI         <= R_REGS.swieff;
289
    HIO_LED     <= R_REGS.ledeff;
290
    HIO_DSP_DP  <= R_REGS.dpeff;
291
    HIO_DSP_DAT <= R_REGS.dateff;
292
 
293
    RB_SRES      <= rb_sres_init;
294
    RB_SRES.ack  <= irb_ack;
295
    RB_SRES.busy <= irb_busy;
296
    RB_SRES.err  <= irb_err;
297
    RB_SRES.dout <= irb_dout;
298
 
299
  end process proc_next;
300
 
301
end syn;

powered by: WebSVN 2.1.0

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