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

Subversion Repositories w11

[/] [w11/] [tags/] [w11a_V0.7/] [rtl/] [bplib/] [bpgen/] [sn_humanio_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_rbus.vhd 640 2015-02-01 09:56:53Z mueller $
2 2 wfjm
--
3 29 wfjm
-- Copyright 2010-2015 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
4 2 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 12 wfjm
-- Module Name:    sn_humanio_rbus - syn
16
-- Description:    sn_humanio with rbus interceptor
17 2 wfjm
--
18 12 wfjm
-- Dependencies:   bpgen/sn_humanio
19 2 wfjm
--
20
-- Test bench:     -
21
--
22
-- Target Devices: generic
23 29 wfjm
-- Tool versions:  ise 11.4-14.7; viv 2014.4; ghdl 0.26-0.31
24 2 wfjm
--
25
-- Synthesized (xst):
26
-- Date         Rev  ise         Target      flop lutl lutm slic t peri
27 29 wfjm
-- 2015-01-28   639 14.7  131013 xc6slx16-2   253  223    0   97 s  3.6 ns (n4)
28
-- 2015-01-28   639 14.7  131013 xc6slx16-2   141  120    0   42 s  3.5 ns (n2)
29
-- 2015-01-25   583 14.7  131013 xc6slx16-2   140  120    0   46 s  3.5 ns
30 12 wfjm
-- 2011-08-14   406 12.1    M53d xc3s1000-4   142  156    0  123 s  5.1 ns 
31
-- 2011-08-07   404 12.1    M53d xc3s1000-4   142  157    0  124 s  5.1 ns 
32
-- 2010-12-29   351 12.1    M53d xc3s1000-4    93  138    0  111 s  6.8 ns 
33 2 wfjm
-- 2010-06-03   300 11.4    L68  xc3s1000-4    92  137    0  111 s  6.7 ns 
34
--
35
-- Revision History: 
36
-- Date         Rev Version  Comment
37 29 wfjm
-- 2015-01-31   640   2.0    add SWIDTH,LWIDTH,DCWIDTH, change register layout
38 27 wfjm
-- 2014-08-15   583   1.3    rb_mreq addr now 16 bit
39 13 wfjm
-- 2011-11-19   427   1.2.1  now numeric_std clean
40 12 wfjm
-- 2011-08-14   406   1.2    common register layout with bp_swibtnled_rbus
41
-- 2011-08-07   404   1.3    add pipeline regs ledin,(swi,btn,led,dp,dat)eff
42
-- 2011-07-08   390   1.2    renamed from s3_humanio_rbus, add BWIDTH generic
43 9 wfjm
-- 2010-12-29   351   1.1    renamed from s3_humanio_rri; ported to rbv3
44 2 wfjm
-- 2010-06-18   306   1.0.1  rename rbus data fields to _rbf_
45
-- 2010-06-03   300   1.0    Initial version
46
------------------------------------------------------------------------------
47
--
48
-- rbus registers:
49
--
50 29 wfjm
-- Addr   Bits  Name        r/w/f  Function
51
--  000         stat        r/-/-  Status register
52
--        14:12   hdig      r/-/-    display size as (2**DCWIDTH)-1
53
--        11:08   hled      r/-/-    led     size as LWIDTH-1
54
--         7:04   hbtn      r/-/-    button  size as BWIDTH-1
55
--         3:00   hswi      r/-/-    switch  size as SWIDTH-1
56
--         
57
--  001         cntl        r/w/-  Control register
58
--            4   dsp1_en   r/w/-    if 1 display msb will be driven by rbus
59
--            3   dsp0_en   r/w/-    if 1 display lsb will be driven by rbus
60
--            2   dp_en     r/w/-    if 1 display dp's will be driven by rbus
61
--            1   led_en    r/w/-    if 1 LED will be driven by rbus
62
--            0   swi_en    r/w/-    if 1 SWI will be driven by rbus
63
--            
64
--  010    x:00 btn         r/-/f    r: return hio BTN status
65
--                                   w: will pulse BTN
66
--                                   
67
--  011    x:00 swi         r/w/-    r: return hio SWI status
68
--                                   w: will drive SWI when swi_en=1
69
--                                   
70
--  100    x:00 led         r/w/-    r: return hio LED status
71
--                                   w: will drive LED when led_en=1
72
--                                   
73
--  101    x:00 dp          r/w/-    r: return hio DSP_DP status
74
--                                   w: will drive dp's when dp_en=1
75
--                                   
76
--  110   15:00 dsp0        r/w/-    r: return hio DSP_DAT lsb status
77
--                                   w: will drive DSP_DAT lsb when dsp_en=1
78
--  111   15:00 dsp1        r/w/-    r: return hio DSP_DAT msb status
79
--                                   w: will drive DSP_DAT msb when dsp_en=1
80 2 wfjm
--
81
 
82
library ieee;
83
use ieee.std_logic_1164.all;
84 13 wfjm
use ieee.numeric_std.all;
85 2 wfjm
 
86
use work.slvtypes.all;
87 9 wfjm
use work.rblib.all;
88 12 wfjm
use work.bpgenlib.all;
89 2 wfjm
 
90
-- ----------------------------------------------------------------------------
91
 
92 12 wfjm
entity sn_humanio_rbus is               -- human i/o handling /w rbus intercept
93 2 wfjm
  generic (
94 29 wfjm
    SWIDTH : positive := 8;             -- SWI port width
95 12 wfjm
    BWIDTH : positive := 4;             -- BTN port width
96 29 wfjm
    LWIDTH : positive := 8;             -- LED port width
97
    DCWIDTH : positive := 2;            -- digit counter width (2 or 3)
98 2 wfjm
    DEBOUNCE : boolean := true;         -- instantiate debouncer for SWI,BTN
99 29 wfjm
    RB_ADDR : slv16 := slv(to_unsigned(16#fef0#,16)));
100 2 wfjm
  port (
101
    CLK : in slbit;                     -- clock
102 12 wfjm
    RESET : in slbit := '0';            -- reset
103 2 wfjm
    CE_MSEC : in slbit;                 -- 1 ms clock enable
104
    RB_MREQ : in rb_mreq_type;          -- rbus: request
105
    RB_SRES : out rb_sres_type;         -- rbus: response
106 29 wfjm
    SWI : out slv(SWIDTH-1 downto 0);   -- switch settings, debounced
107 12 wfjm
    BTN : out slv(BWIDTH-1 downto 0);   -- button settings, debounced
108 29 wfjm
    LED : in slv(LWIDTH-1 downto 0);    -- led data
109
    DSP_DAT : in slv(4*(2**DCWIDTH)-1 downto 0);   -- display data
110
    DSP_DP : in slv((2**DCWIDTH)-1 downto 0);      -- display decimal points
111
    I_SWI : in slv(SWIDTH-1 downto 0);  -- pad-i: switches
112 12 wfjm
    I_BTN : in slv(BWIDTH-1 downto 0);  -- pad-i: buttons
113 29 wfjm
    O_LED : out slv(LWIDTH-1 downto 0); -- pad-o: leds
114
    O_ANO_N : out slv((2**DCWIDTH)-1 downto 0); -- pad-o: disp: anodes (act.low)
115
    O_SEG_N : out slv8                         -- pad-o: disp: segments (act.low)
116 2 wfjm
  );
117 12 wfjm
end sn_humanio_rbus;
118 2 wfjm
 
119 12 wfjm
architecture syn of sn_humanio_rbus is
120 2 wfjm
 
121
  type regs_type is record
122 9 wfjm
    rbsel : slbit;                      -- rbus select
123 29 wfjm
    swi : slv(SWIDTH-1 downto 0);       -- rbus swi
124 12 wfjm
    btn : slv(BWIDTH-1 downto 0);       -- rbus btn
125 29 wfjm
    led : slv(LWIDTH-1 downto 0);        -- rbus led
126
    dsp_dat : slv(4*(2**DCWIDTH)-1 downto 0); -- rbus dsp_dat
127
    dsp_dp  : slv((2**DCWIDTH)-1 downto 0);   -- rbus dsp_dp
128
    ledin : slv(LWIDTH-1 downto 0);     -- led from design
129
    swieff : slv(SWIDTH-1 downto 0);    -- effective swi
130 12 wfjm
    btneff : slv(BWIDTH-1 downto 0);    -- effective btn
131 29 wfjm
    ledeff : slv(LWIDTH-1 downto 0);    -- effective led
132
    dateff : slv(4*(2**DCWIDTH)-1 downto 0);  -- effective dsp_dat
133
    dpeff : slv((2**DCWIDTH)-1 downto 0);     -- effective dsp_dp
134 12 wfjm
    swi_en : slbit;                     -- enable: swi from rbus
135
    led_en : slbit;                     -- enable: led from rbus
136 29 wfjm
    dsp0_en : slbit;                    -- enable: dsp_dat lsb from rbus
137
    dsp1_en : slbit;                    -- enable: dsp_dat msb from rbus
138 12 wfjm
    dp_en : slbit;                      -- enable: dsp_dp  from rbus
139 2 wfjm
  end record regs_type;
140 12 wfjm
 
141 29 wfjm
  constant swizero : slv(SWIDTH-1 downto 0) := (others=>'0');
142 12 wfjm
  constant btnzero : slv(BWIDTH-1 downto 0) := (others=>'0');
143 29 wfjm
  constant ledzero : slv(LWIDTH-1 downto 0) := (others=>'0');
144
  constant dpzero  : slv((2**DCWIDTH)-1 downto 0) := (others=>'0');
145
  constant datzero : slv(4*(2**DCWIDTH)-1 downto 0) := (others=>'0');
146
 
147 2 wfjm
  constant regs_init : regs_type := (
148 9 wfjm
    '0',                                -- rbsel
149 29 wfjm
    swizero,                            -- swi
150 12 wfjm
    btnzero,                            -- btn
151 29 wfjm
    ledzero,                            -- led
152
    datzero,                            -- dsp_dat
153
    dpzero,                             -- dsp_dp
154
    ledzero,                            -- ledin
155
    swizero,                            -- swieff
156 12 wfjm
    btnzero,                            -- btneff
157 29 wfjm
    ledzero,                            -- ledeff
158
    datzero,                            -- dateff
159
    dpzero,                             -- dpeff
160
    '0','0','0','0','0'                 -- (swi|led|dsp0|dsp1|dp)_en
161 2 wfjm
  );
162
 
163
  signal R_REGS : regs_type := regs_init;  -- state registers
164
  signal N_REGS : regs_type := regs_init;  -- next value state regs
165
 
166 29 wfjm
  subtype  stat_rbf_hdig     is integer range 14 downto 12;
167
  subtype  stat_rbf_hled     is integer range 11 downto  8;
168
  subtype  stat_rbf_hbtn     is integer range  7 downto  4;
169
  subtype  stat_rbf_hswi     is integer range  3 downto  0;
170
 
171
  constant cntl_rbf_dsp1_en: integer :=  4;
172
  constant cntl_rbf_dsp0_en: integer :=  3;
173 12 wfjm
  constant cntl_rbf_dp_en:   integer :=  2;
174
  constant cntl_rbf_led_en:  integer :=  1;
175
  constant cntl_rbf_swi_en:  integer :=  0;
176 2 wfjm
 
177 29 wfjm
  constant rbaddr_stat:  slv3 := "000";  --  0    r/-/-
178
  constant rbaddr_cntl:  slv3 := "001";  --  0    r/w/-
179
  constant rbaddr_btn:   slv3 := "010";  --  1    r/-/f
180
  constant rbaddr_swi:   slv3 := "011";  --  1    r/w/-
181
  constant rbaddr_led:   slv3 := "100";  --  2    r/w/-
182
  constant rbaddr_dp:    slv3 := "101";  --  3    r/w/-
183
  constant rbaddr_dsp0:  slv3 := "110";  --  4    r/w/-
184
  constant rbaddr_dsp1:  slv3 := "111";  --  5    r/w/-
185 2 wfjm
 
186 29 wfjm
  subtype  dspdat_msb is integer range 4*(2**DCWIDTH)-1 downto 4*(2**DCWIDTH)-16;
187
  subtype  dspdat_lsb is integer range 15 downto 0;
188
 
189
  signal HIO_SWI : slv(SWIDTH-1 downto  0) := (others=>'0');
190 12 wfjm
  signal HIO_BTN : slv(BWIDTH-1 downto  0) := (others=>'0');
191 29 wfjm
  signal HIO_LED : slv(LWIDTH-1 downto  0) := (others=>'0');
192
  signal HIO_DSP_DAT : slv(4*(2**DCWIDTH)-1 downto 0) := (others=>'0');
193
  signal HIO_DSP_DP  : slv((2**DCWIDTH)-1 downto 0)   := (others=>'0');
194 2 wfjm
 
195
begin
196
 
197 29 wfjm
  assert SWIDTH<=16
198
    report "assert (SWIDTH<=16)"
199
    severity failure;
200
  assert BWIDTH<=8
201
    report "assert (BWIDTH<=8)"
202
    severity failure;
203
  assert LWIDTH<=16
204
    report "assert (LWIDTH<=16)"
205
    severity failure;
206
 
207
  assert DCWIDTH=2 or DCWIDTH=3
208
  report "assert(DCWIDTH=2 or DCWIDTH=3): unsupported DCWIDTH"
209
  severity FAILURE;
210
 
211 12 wfjm
  HIO : sn_humanio
212 2 wfjm
    generic map (
213 29 wfjm
      SWIDTH   => SWIDTH,
214 12 wfjm
      BWIDTH   => BWIDTH,
215 29 wfjm
      LWIDTH   => LWIDTH,
216
      DCWIDTH  => DCWIDTH,
217 2 wfjm
      DEBOUNCE => DEBOUNCE)
218
    port map (
219
      CLK     => CLK,
220
      RESET   => RESET,
221
      CE_MSEC => CE_MSEC,
222
      SWI     => HIO_SWI,
223
      BTN     => HIO_BTN,
224
      LED     => HIO_LED,
225
      DSP_DAT => HIO_DSP_DAT,
226
      DSP_DP  => HIO_DSP_DP,
227
      I_SWI   => I_SWI,
228
      I_BTN   => I_BTN,
229
      O_LED   => O_LED,
230
      O_ANO_N => O_ANO_N,
231
      O_SEG_N => O_SEG_N
232
    );
233
 
234
  proc_regs: process (CLK)
235
  begin
236
 
237 13 wfjm
    if rising_edge(CLK) then
238 2 wfjm
      if RESET = '1' then
239
        R_REGS <= regs_init;
240
      else
241
        R_REGS <= N_REGS;
242
      end if;
243
    end if;
244
 
245
  end process proc_regs;
246
 
247
  proc_next: process (R_REGS, RB_MREQ, LED, DSP_DAT, DSP_DP,
248 12 wfjm
                      HIO_SWI, HIO_BTN, HIO_DSP_DAT, HIO_DSP_DP)
249 2 wfjm
 
250
    variable r : regs_type := regs_init;
251
    variable n : regs_type := regs_init;
252
 
253
    variable irb_ack  : slbit := '0';
254
    variable irb_busy : slbit := '0';
255
    variable irb_err  : slbit := '0';
256
    variable irb_dout : slv16 := (others=>'0');
257 9 wfjm
    variable irbena   : slbit := '0';
258 2 wfjm
 
259
  begin
260
 
261
    r := R_REGS;
262
    n := R_REGS;
263
 
264
    irb_ack  := '0';
265
    irb_busy := '0';
266
    irb_err  := '0';
267
    irb_dout := (others=>'0');
268
 
269 9 wfjm
    irbena  := RB_MREQ.re or RB_MREQ.we;
270
 
271 12 wfjm
    -- input register for LED signal
272
    n.ledin  := LED;
273
 
274 9 wfjm
    -- rbus address decoder
275
    n.rbsel := '0';
276 29 wfjm
    if RB_MREQ.aval='1' and RB_MREQ.addr(15 downto 3)=RB_ADDR(15 downto 3) then
277 9 wfjm
      n.rbsel := '1';
278 2 wfjm
    end if;
279
 
280 9 wfjm
    -- rbus transactions
281
    if r.rbsel = '1' then
282
      irb_ack := irbena;                  -- ack all accesses
283
 
284 29 wfjm
      case RB_MREQ.addr(2 downto 0) is
285
 
286
        when rbaddr_stat =>
287
          irb_dout(stat_rbf_hdig)  := slv(to_unsigned((2**DCWIDTH)-1,3));
288
          irb_dout(stat_rbf_hled)  := slv(to_unsigned(LWIDTH-1,4));
289
          irb_dout(stat_rbf_hbtn)  := slv(to_unsigned(BWIDTH-1,4));
290
          irb_dout(stat_rbf_hswi)  := slv(to_unsigned(SWIDTH-1,4));
291
          if RB_MREQ.we = '1' then
292
            irb_ack := '0';
293
          end if;
294
 
295 2 wfjm
        when rbaddr_cntl =>
296 29 wfjm
          irb_dout(cntl_rbf_dsp1_en) := r.dsp1_en;
297
          irb_dout(cntl_rbf_dsp0_en) := r.dsp0_en;
298
          irb_dout(cntl_rbf_dp_en)   := r.dp_en;
299
          irb_dout(cntl_rbf_led_en)  := r.led_en;
300
          irb_dout(cntl_rbf_swi_en)  := r.swi_en;
301 2 wfjm
          if RB_MREQ.we = '1' then
302 29 wfjm
            n.dsp1_en := RB_MREQ.din(cntl_rbf_dsp1_en);
303
            n.dsp0_en := RB_MREQ.din(cntl_rbf_dsp0_en);
304
            n.dp_en   := RB_MREQ.din(cntl_rbf_dp_en);
305
            n.led_en  := RB_MREQ.din(cntl_rbf_led_en);
306
            n.swi_en  := RB_MREQ.din(cntl_rbf_swi_en);
307 2 wfjm
          end if;
308
 
309 29 wfjm
        when rbaddr_btn =>
310
          irb_dout(HIO_BTN'range) := HIO_BTN;
311
          if RB_MREQ.we = '1' then
312
            n.btn    := RB_MREQ.din(n.btn'range);
313
          end if;
314
 
315 2 wfjm
        when rbaddr_swi =>
316
          irb_dout(HIO_SWI'range) := HIO_SWI;
317
          if RB_MREQ.we = '1' then
318
            n.swi := RB_MREQ.din(n.swi'range);
319
          end if;
320
 
321 12 wfjm
        when rbaddr_led =>
322 29 wfjm
          irb_dout(r.ledin'range) := r.ledin;
323 2 wfjm
          if RB_MREQ.we = '1' then
324 29 wfjm
            n.led := RB_MREQ.din(n.led'range);
325 2 wfjm
          end if;
326
 
327 29 wfjm
        when rbaddr_dp =>
328
          irb_dout(HIO_DSP_DP'range) := HIO_DSP_DP;
329 2 wfjm
          if RB_MREQ.we = '1' then
330 29 wfjm
            n.dsp_dp := RB_MREQ.din(n.dsp_dp'range);
331 2 wfjm
          end if;
332 29 wfjm
 
333
        when rbaddr_dsp0 =>
334
          irb_dout := HIO_DSP_DAT(dspdat_lsb);
335
          if RB_MREQ.we = '1' then
336
            n.dsp_dat(dspdat_lsb) := RB_MREQ.din;
337
          end if;
338 2 wfjm
 
339 29 wfjm
        when rbaddr_dsp1 =>
340
          irb_dout := HIO_DSP_DAT(dspdat_msb);
341
          if RB_MREQ.we = '1' then
342
            n.dsp_dat(dspdat_msb) := RB_MREQ.din;
343
          end if;
344
 
345
        when others => null;
346 2 wfjm
      end case;
347
 
348
    end if;
349
 
350 12 wfjm
    n.btneff := HIO_BTN or r.btn;
351 2 wfjm
 
352
    if r.swi_en = '0' then
353 12 wfjm
      n.swieff := HIO_SWI;
354 2 wfjm
    else
355 12 wfjm
      n.swieff := r.swi;
356 2 wfjm
    end if;
357
 
358
    if r.led_en = '0' then
359 12 wfjm
      n.ledeff := r.ledin;
360 2 wfjm
    else
361 12 wfjm
      n.ledeff := r.led;
362 2 wfjm
    end if;
363
 
364
    if r.dp_en = '0' then
365 12 wfjm
      n.dpeff  := DSP_DP;
366 2 wfjm
    else
367 12 wfjm
      n.dpeff  := r.dsp_dp;
368 2 wfjm
    end if;
369
 
370 29 wfjm
    if r.dsp0_en = '0' then
371
      n.dateff(dspdat_lsb) := DSP_DAT(dspdat_lsb);
372 2 wfjm
    else
373 29 wfjm
      n.dateff(dspdat_lsb) := r.dsp_dat(dspdat_lsb);
374 2 wfjm
    end if;
375
 
376 29 wfjm
    if DCWIDTH=3 then
377
      if r.dsp1_en = '0' then
378
        n.dateff(dspdat_msb) := DSP_DAT(dspdat_msb);
379
      else
380
        n.dateff(dspdat_msb) := r.dsp_dat(dspdat_msb);
381
      end if;
382
    end if;
383
 
384 2 wfjm
    N_REGS       <= n;
385
 
386 12 wfjm
    BTN         <= R_REGS.btneff;
387
    SWI         <= R_REGS.swieff;
388
    HIO_LED     <= R_REGS.ledeff;
389
    HIO_DSP_DP  <= R_REGS.dpeff;
390
    HIO_DSP_DAT <= R_REGS.dateff;
391
 
392 2 wfjm
    RB_SRES      <= rb_sres_init;
393
    RB_SRES.ack  <= irb_ack;
394
    RB_SRES.busy <= irb_busy;
395
    RB_SRES.err  <= irb_err;
396
    RB_SRES.dout <= irb_dout;
397
 
398
  end process proc_next;
399
 
400
end syn;

powered by: WebSVN 2.1.0

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