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

Subversion Repositories w11

[/] [w11/] [tags/] [w11a_V0.5/] [rtl/] [bplib/] [s3board/] [s3_humanio_rri.vhd] - Blame information for rev 7

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 wfjm
-- $Id: s3_humanio_rri.vhd 314 2010-07-09 17:38:41Z mueller $
2
--
3
-- Copyright 2010- 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:    s3_humanio_rri - syn
16
-- Description:    s3_humanio with rri interceptor
17
--
18
-- Dependencies:   s3board/s3_humanio
19
--
20
-- Test bench:     -
21
--
22
-- Target Devices: generic
23
-- Tool versions:  xst 11.4; ghdl 0.26
24
--
25
-- Synthesized (xst):
26
-- Date         Rev  ise         Target      flop lutl lutm slic t peri
27
-- 2010-06-03   300 11.4    L68  xc3s1000-4    92  137    0  111 s  6.7 ns 
28
--
29
-- Revision History: 
30
-- Date         Rev Version  Comment
31
-- 2010-06-18   306   1.0.1  rename rbus data fields to _rbf_
32
-- 2010-06-03   300   1.0    Initial version
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
--             11   dat_en    r/w/-    if 1 display data will be driven by rri
40
--             10   dp_en     r/w/-    if 1 display dp's will be driven by rri
41
--              9   led_en    r/w/-    if 1 LED will be driven by rri
42
--              8   swi_en    r/w/-    if 1 SWI will be driven by rri
43
--           3:00   btn       r/w/-    r: return hio BTN status
44
--                                     w: BTN is hio BTN ored with this fields
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         leddp     r/w/-    interface to LED and DSP_DP
50
--          11:09     dsp_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_dat   r/w/-    r: return hio DSP_DAT status
56
--                                     w: will drive DSP_DAT when dat_en=1
57
--
58
 
59
library ieee;
60
use ieee.std_logic_1164.all;
61
use ieee.std_logic_arith.all;
62
 
63
use work.slvtypes.all;
64
use work.rrilib.all;
65
use work.s3boardlib.all;
66
 
67
-- ----------------------------------------------------------------------------
68
 
69
entity s3_humanio_rri is                -- human i/o handling with rri intercept
70
  generic (
71
    DEBOUNCE : boolean := true;         -- instantiate debouncer for SWI,BTN
72
    RB_ADDR : slv8 := conv_std_logic_vector(2#10000000#,8));
73
  port (
74
    CLK : in slbit;                     -- clock
75
    RESET : in slbit;                   -- 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 slv4;                    -- pad-i: buttons
86
    O_LED : out slv8;                   -- pad-o: leds
87
    O_ANO_N : out slv4;                 -- pad-o: 7 seg disp: anodes   (act.low)
88
    O_SEG_N : out slv8                  -- pad-o: 7 seg disp: segments (act.low)
89
  );
90
end s3_humanio_rri;
91
 
92
architecture syn of s3_humanio_rri is
93
 
94
  type regs_type is record
95
    swi : slv8;                         -- rri swi
96
    btn : slv4;                         -- rri btn
97
    led : slv8;                         -- rri led
98
    dsp_dat : slv16;                    -- rri dsp_dat
99
    dsp_dp  : slv4;                     -- rri dsp_dp
100
    swi_en : slbit;                     -- enable: swi from rri
101
    led_en : slbit;                     -- enable: led from rri
102
    dat_en : slbit;                     -- enable: dsp_dat from rri
103
    dp_en : slbit;                      -- enable: dsp_dp  from rri
104
  end record regs_type;
105
 
106
  constant regs_init : regs_type := (
107
    (others=>'0'),                      -- swi
108
    (others=>'0'),                      -- btn
109
    (others=>'0'),                      -- led
110
    (others=>'0'),                      -- dsp_dat
111
    (others=>'0'),                      -- dsp_dp
112
    '0','0','0','0'                     -- (swi|led|dat|dp)_en
113
  );
114
 
115
  signal R_REGS : regs_type := regs_init;  -- state registers
116
  signal N_REGS : regs_type := regs_init;  -- next value state regs
117
 
118
  constant cntl_rbf_dat_en:  integer := 11;
119
  constant cntl_rbf_dp_en:   integer := 10;
120
  constant cntl_rbf_led_en:  integer :=  9;
121
  constant cntl_rbf_swi_en:  integer :=  8;
122
  subtype  cntl_rbf_btn      is integer range  3 downto  0;
123
  subtype  leddp_rbf_dsp_dp  is integer range 11 downto  8;
124
  subtype  leddp_rbf_led     is integer range  7 downto  0;
125
 
126
  constant rbaddr_cntl:  slv2 := "00";  --  0    -/r/w
127
  constant rbaddr_swi:   slv2 := "01";  --  1    -/r/w
128
  constant rbaddr_leddp: slv2 := "10";  --  2    -/r/w
129
  constant rbaddr_dsp:   slv2 := "11";  --  3    -/r/w
130
 
131
  signal HIO_SWI : slv8 := (others=>'0');
132
  signal HIO_BTN : slv4 := (others=>'0');
133
  signal HIO_LED : slv8 := (others=>'0');
134
  signal HIO_DSP_DAT : slv16 := (others=>'0');
135
  signal HIO_DSP_DP  : slv4 := (others=>'0');
136
 
137
begin
138
 
139
  HIO : s3_humanio
140
    generic map (
141
      DEBOUNCE => DEBOUNCE)
142
    port map (
143
      CLK     => CLK,
144
      RESET   => RESET,
145
      CE_MSEC => CE_MSEC,
146
      SWI     => HIO_SWI,
147
      BTN     => HIO_BTN,
148
      LED     => HIO_LED,
149
      DSP_DAT => HIO_DSP_DAT,
150
      DSP_DP  => HIO_DSP_DP,
151
      I_SWI   => I_SWI,
152
      I_BTN   => I_BTN,
153
      O_LED   => O_LED,
154
      O_ANO_N => O_ANO_N,
155
      O_SEG_N => O_SEG_N
156
    );
157
 
158
  proc_regs: process (CLK)
159
  begin
160
 
161
    if CLK'event and CLK='1' then
162
      if RESET = '1' then
163
        R_REGS <= regs_init;
164
      else
165
        R_REGS <= N_REGS;
166
      end if;
167
    end if;
168
 
169
  end process proc_regs;
170
 
171
  proc_next: process (R_REGS, RB_MREQ, LED, DSP_DAT, DSP_DP,
172
                      HIO_SWI, HIO_BTN, HIO_LED, HIO_DSP_DAT, HIO_DSP_DP)
173
 
174
    variable r : regs_type := regs_init;
175
    variable n : regs_type := regs_init;
176
 
177
    variable irb_sel  : slbit := '0';
178
    variable irb_ack  : slbit := '0';
179
    variable irb_busy : slbit := '0';
180
    variable irb_err  : slbit := '0';
181
    variable irb_dout : slv16 := (others=>'0');
182
 
183
  begin
184
 
185
    r := R_REGS;
186
    n := R_REGS;
187
 
188
    irb_sel  := '0';
189
    irb_ack  := '0';
190
    irb_busy := '0';
191
    irb_err  := '0';
192
    irb_dout := (others=>'0');
193
 
194
    if RB_MREQ.req='1' and RB_MREQ.addr(7 downto 2)=RB_ADDR(7 downto 2)  then
195
      irb_sel := '1';
196
      irb_ack := '1';
197
    end if;
198
 
199
    if irb_sel = '1' then
200
      case RB_MREQ.addr(1 downto 0) is
201
 
202
        when rbaddr_cntl =>
203
          irb_dout(cntl_rbf_dat_en) := r.dat_en;
204
          irb_dout(cntl_rbf_dp_en)  := r.dp_en;
205
          irb_dout(cntl_rbf_led_en) := r.led_en;
206
          irb_dout(cntl_rbf_swi_en) := r.swi_en;
207
          irb_dout(cntl_rbf_btn)    := HIO_BTN;
208
          if RB_MREQ.we = '1' then
209
            n.dat_en := RB_MREQ.din(cntl_rbf_dat_en);
210
            n.dp_en  := RB_MREQ.din(cntl_rbf_dp_en);
211
            n.led_en := RB_MREQ.din(cntl_rbf_led_en);
212
            n.swi_en := RB_MREQ.din(cntl_rbf_swi_en);
213
            n.btn    := RB_MREQ.din(cntl_rbf_btn);
214
          end if;
215
 
216
        when rbaddr_swi =>
217
          irb_dout(HIO_SWI'range) := HIO_SWI;
218
          if RB_MREQ.we = '1' then
219
            n.swi := RB_MREQ.din(n.swi'range);
220
          end if;
221
 
222
        when rbaddr_leddp =>
223
          irb_dout(leddp_rbf_dsp_dp) := HIO_DSP_DP;
224
          irb_dout(leddp_rbf_led)    := HIO_LED;
225
          if RB_MREQ.we = '1' then
226
            n.dsp_dp := RB_MREQ.din(leddp_rbf_dsp_dp);
227
            n.led    := RB_MREQ.din(leddp_rbf_led);
228
          end if;
229
 
230
        when rbaddr_dsp =>
231
          irb_dout := HIO_DSP_DAT;
232
          if RB_MREQ.we = '1' then
233
            n.dsp_dat := RB_MREQ.din;
234
          end if;
235
 
236
        when others => null;
237
      end case;
238
 
239
    end if;
240
 
241
    BTN <= HIO_BTN or r.btn;
242
 
243
    if r.swi_en = '0' then
244
      SWI <= HIO_SWI;
245
    else
246
      SWI <= r.swi;
247
    end if;
248
 
249
    if r.led_en = '0' then
250
      HIO_LED <= LED;
251
    else
252
      HIO_LED <= r.led;
253
    end if;
254
 
255
    if r.dp_en = '0' then
256
      HIO_DSP_DP  <= DSP_DP;
257
    else
258
      HIO_DSP_DP  <= r.dsp_dp;
259
    end if;
260
 
261
    if r.dat_en = '0' then
262
      HIO_DSP_DAT <= DSP_DAT;
263
    else
264
      HIO_DSP_DAT <= r.dsp_dat;
265
    end if;
266
 
267
    N_REGS       <= n;
268
 
269
    RB_SRES      <= rb_sres_init;
270
    RB_SRES.ack  <= irb_ack;
271
    RB_SRES.busy <= irb_busy;
272
    RB_SRES.err  <= irb_err;
273
    RB_SRES.dout <= irb_dout;
274
 
275
  end process proc_next;
276
 
277
end syn;

powered by: WebSVN 2.1.0

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