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

Subversion Repositories w11

[/] [w11/] [tags/] [w11a_V0.6/] [rtl/] [sys_gen/] [tst_fx2loop/] [tst_fx2loop.vhd] - Blame information for rev 17

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

Line No. Rev Author Line
1 17 wfjm
-- $Id: tst_fx2loop.vhd 453 2012-01-15 17:51:18Z mueller $
2
--
3
-- Copyright 2011-2012 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:    tst_fx2loop - syn
16
-- Description:    simple stand-alone tester for fx2lib components
17
--
18
-- Dependencies:   comlib/byte2word
19
--                 comlib/word2byte
20
-- Test bench:     -
21
--
22
-- Target Devices: generic
23
-- Tool versions:  xst 13.3; ghdl 0.29
24
--
25
-- Revision History: 
26
-- Date         Rev Version  Comment
27
-- 2012-01-15   453   1.0    Initial version
28
-- 2011-12-26   445   0.5    First draft
29
------------------------------------------------------------------------------
30
 
31
library ieee;
32
use ieee.std_logic_1164.all;
33
use ieee.numeric_std.all;
34
 
35
use work.slvtypes.all;
36
use work.comlib.all;
37
use work.fx2lib.all;
38
use work.tst_fx2looplib.all;
39
 
40
-- ----------------------------------------------------------------------------
41
 
42
entity tst_fx2loop is                   -- tester for fx2lib components
43
  port (
44
    CLK : in slbit;                     -- clock
45
    RESET : in slbit;                   -- reset
46
    CE_MSEC : in slbit;                 -- msec pulse
47
    HIO_CNTL : in hio_cntl_type;        -- humanio controls
48
    HIO_STAT : out hio_stat_type;       -- humanio status
49
    FX2_MONI : in fx2ctl_moni_type;     -- fx2ctl monitor
50
    RXDATA : in slv8;                   -- receiver data out
51
    RXVAL : in slbit;                   -- receiver data valid
52
    RXHOLD : out slbit;                 -- receiver data hold
53
    TXDATA : out slv8;                  -- transmit data in
54
    TXENA : out slbit;                  -- transmit data enable
55
    TXBUSY : in slbit;                  -- transmit busy
56
    TX2DATA : out slv8;                 -- transmit 2 data in
57
    TX2ENA : out slbit;                 -- transmit 2 data enable
58
    TX2BUSY : in slbit                  -- transmit 2 busy
59
  );
60
end tst_fx2loop;
61
 
62
architecture syn of tst_fx2loop is
63
 
64
  type regs_type is record
65
    rxdata : slv16;                     -- next rx word
66
    txdata : slv16;                     -- next tx word
67
    tx2data : slv16;                    -- next tx2 word
68
    rxsecnt : slv16;                    -- rx sequence error counter
69
    rxcnt : slv32;                      -- rx word counter
70
    txcnt : slv32;                      -- tx word counter
71
    tx2cnt : slv32;                     -- tx2 word counter
72
    rxthrottle : slbit;                 -- rx throttle flag
73
  end record regs_type;
74
 
75
  constant regs_init : regs_type := (
76
    (others=>'0'),                      -- rxdata
77
    (others=>'0'),                      -- txdata
78
    (others=>'0'),                      -- tx2data
79
    (others=>'0'),                      -- rxsecnt
80
    (others=>'0'),                      -- rxcnt
81
    (others=>'0'),                      -- txcnt
82
    (others=>'0'),                      -- tx2cnt
83
    '0'                                 -- rxthrottle
84
  );
85
 
86
  signal R_REGS : regs_type := regs_init;  -- state registers
87
  signal N_REGS : regs_type := regs_init;  -- next value state regs
88
 
89
  signal RXWDATA  : slv16 := (others=>'0');
90
  signal RXWVAL   : slbit := '0';
91
  signal RXWHOLD  : slbit := '0';
92
  signal RXODD    : slbit := '0';
93
 
94
  signal TXWDATA  : slv16 := (others=>'0');
95
  signal TXWENA   : slbit := '0';
96
  signal TXWBUSY  : slbit := '0';
97
  signal TXODD    : slbit := '0';
98
  signal TX2WDATA : slv16 := (others=>'0');
99
  signal TX2WENA  : slbit := '0';
100
  signal TX2WBUSY : slbit := '0';
101
  signal TX2ODD   : slbit := '0';
102
 
103
  signal RXHOLD_L : slbit := '0';       -- local copy of out port signal
104
  signal TXENA_L  : slbit := '0';       -- local copy of out port signal
105
  signal TX2ENA_L : slbit := '0';       -- local copy of out port signal
106
  signal CNTL_RESET_L : slbit := '0';   -- local copy of out port signal
107
 
108
begin
109
 
110
  CNTL_RESET_L <= '0';                  -- so far unused
111
 
112
  RXB2W : byte2word
113
    port map (
114
      CLK   => CLK,
115
      RESET => CNTL_RESET_L,
116
      DI    => RXDATA,
117
      ENA   => RXVAL,
118
      BUSY  => RXHOLD_L,
119
      DO    => RXWDATA,
120
      VAL   => RXWVAL,
121
      HOLD  => RXWHOLD,
122
      ODD   => RXODD
123
    );
124
 
125
  TX1W2B : word2byte
126
    port map (
127
      CLK   => CLK,
128
      RESET => CNTL_RESET_L,
129
      DI    => TXWDATA,
130
      ENA   => TXWENA,
131
      BUSY  => TXWBUSY,
132
      DO    => TXDATA,
133
      VAL   => TXENA_L,
134
      HOLD  => TXBUSY,
135
      ODD   => TXODD
136
    );
137
 
138
  TX2W2B : word2byte
139
    port map (
140
      CLK   => CLK,
141
      RESET => CNTL_RESET_L,
142
      DI    => TX2WDATA,
143
      ENA   => TX2WENA,
144
      BUSY  => TX2WBUSY,
145
      DO    => TX2DATA,
146
      VAL   => TX2ENA_L,
147
      HOLD  => TX2BUSY,
148
      ODD   => TX2ODD
149
    );
150
 
151
  proc_regs: process (CLK)
152
  begin
153
 
154
    if rising_edge(CLK) then
155
      if RESET = '1' then
156
        R_REGS <= regs_init;
157
      else
158
        R_REGS <= N_REGS;
159
      end if;
160
    end if;
161
 
162
  end process proc_regs;
163
 
164
  proc_next: process (R_REGS, CE_MSEC, HIO_CNTL, FX2_MONI,
165
                      RXWDATA, RXWVAL, TXWBUSY, TX2WBUSY)
166
 
167
    variable r : regs_type := regs_init;
168
    variable n : regs_type := regs_init;
169
 
170
    variable irxwhold  : slbit := '1';
171
    variable itxwena   : slbit := '0';
172
    variable itxwdata  : slv16 := (others=>'0');
173
    variable itx2wena  : slbit := '0';
174
 
175
  begin
176
    r := R_REGS;
177
    n := R_REGS;
178
 
179
    irxwhold := '1';
180
    itxwena  := '0';
181
    itxwdata := RXWDATA;
182
    itx2wena := '0';
183
 
184
    if HIO_CNTL.throttle = '1' then
185
      if CE_MSEC = '1' then
186
        n.rxthrottle := not r.rxthrottle;
187
      end if;
188
    else
189
      n.rxthrottle := '0';
190
    end if;
191
 
192
 
193
    case HIO_CNTL.mode is
194
      when c_mode_idle =>
195
        null;
196
 
197
      when c_mode_rxblast =>
198
        if RXWVAL='1' and r.rxthrottle='0' then
199
          irxwhold := '0';
200
          if RXWDATA /= r.rxdata then
201
            n.rxsecnt := slv(unsigned(r.rxsecnt) + 1);
202
          end if;
203
          n.rxdata := slv(unsigned(RXWDATA) + 1);
204
        end if;
205
 
206
      when c_mode_txblast =>
207
        itxwdata := r.txdata;
208
        if TXWBUSY = '0' then
209
          itxwena := '1';
210
          n.txdata := slv(unsigned(r.txdata) + 1);
211
        end if;
212
        irxwhold := '0';
213
 
214
      when c_mode_loop =>
215
        itxwdata := RXWDATA;
216
        if RXWVAL='1' and r.rxthrottle='0' and TXWBUSY = '0' then
217
          irxwhold := '0';
218
          itxwena  := '1';
219
        end if;
220
 
221
      when others => null;
222
    end case;
223
 
224
    if HIO_CNTL.tx2blast = '1' then
225
      if TX2WBUSY = '0' then
226
        itx2wena := '1';
227
        n.tx2data := slv(unsigned(r.tx2data) + 1);
228
      end if;
229
    end if;
230
 
231
    if RXWVAL='1' and irxwhold='0' then
232
      n.rxcnt := slv(unsigned(r.rxcnt) + 1);
233
    end if;
234
 
235
    if itxwena = '1' then
236
      n.txcnt := slv(unsigned(r.txcnt) + 1);
237
    end if;
238
 
239
    if itx2wena = '1' then
240
      n.tx2cnt := slv(unsigned(r.tx2cnt) + 1);
241
    end if;
242
 
243
    N_REGS <= n;
244
 
245
    RXWHOLD  <= irxwhold;
246
    TXWENA   <= itxwena;
247
    TXWDATA  <= itxwdata;
248
    TX2WENA  <= itx2wena;
249
    TX2WDATA <= r.tx2data;
250
 
251
    HIO_STAT.rxhold  <= RXHOLD_L;
252
    HIO_STAT.txbusy  <= TXBUSY;
253
    HIO_STAT.tx2busy <= TX2BUSY;
254
    HIO_STAT.rxsecnt <= r.rxsecnt;
255
    HIO_STAT.rxcnt   <= r.rxcnt;
256
    HIO_STAT.txcnt   <= r.txcnt;
257
    HIO_STAT.tx2cnt  <= r.tx2cnt;
258
 
259
  end process proc_next;
260
 
261
  RXHOLD  <= RXHOLD_L;
262
  TXENA   <= TXENA_L;
263
  TX2ENA  <= TX2ENA_L;
264
 
265
end syn;

powered by: WebSVN 2.1.0

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