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

Subversion Repositories lateq

[/] [lateq/] [trunk/] [hdl_single_type/] [src/] [lateq.vhd] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 wzab
 
2
-------------------------------------------------------------------------------
3
-- Title      : Versatile latency checker/equalizer for pipelines
4
-- Project    :
5
-------------------------------------------------------------------------------
6
-- File       : lateq.vhd
7
-- Author     : Wojciech M. Zabolotny ( wzab01<at>gmail.com )
8
-- Company    :
9
-- License    : BSD
10
-- Created    : 2013-11-01
11
-- Standard   : VHDL'93/02
12
 
13
-- Libraries used
14
library ieee;
15
use ieee.std_logic_1164.all;
16
 
17
use ieee.numeric_std.all;
18
library work;
19
 
20
use work.lateq_pkg.all;
21
use work.ex1_pkg.all;
22
use work.lateq_read_pkg.all;
23
 
24
entity lateq is
25
  generic (
26
    LEQ_ID : string  := "X";
27
    NCHANS : integer := 2
28
    );
29
  port (
30
    -- groups of inputs and outputs 
31
    din   : in  T_USER_DATA_SET(0 to NCHANS-1);
32
    dout  : out T_USER_DATA_SET(0 to NCHANS-1);
33
    -- system ports
34
    clk   : in  std_logic;
35
    rst_p : in  std_logic
36
    );
37
end lateq;
38
 
39
architecture beh of lateq is
40
  -- declarations
41
  -- definition of types and signals used in delay lines
42
  type T_DELAY is array (integer range <>) of T_USER_DATA_MRK;
43
  signal s_out : T_USER_DATA_SET(0 to NCHANS-1);
44
begin
45
  g1 : for i in 0 to NCHANS-1 generate
46
    constant NDEL : integer := lateq_read_delays(LEQ_ID, i);
47
    signal delay  : T_DELAY(0 to NDEL) := (others => C_USER_DATA_MRK_INIT);
48
  begin
49
    -- signal assignment and processes for delay lines
50
    s_out(i) <= delay(0);
51
    -- handle the case, where latency is above 0
52
    gp0 : if NDEL > 0 generate
53
      pd0 : process(clk, rst_p) is
54
      begin
55
        if clk'event and clk = '1' then
56
          if rst_p = '1' then
57
            for i in 0 to NDEL-1 loop
58
              delay(i) <= C_USER_DATA_MRK_INIT;
59
            end loop;
60
          else
61
            delay(NDEL-1) <= din(i);
62
            for i in 1 to NDEL-1 loop
63
              delay(i-1) <= delay(i);
64
            end loop;
65
          end if;
66
        end if;
67
      end process pd0;
68
    end generate gp0;
69
    -- handle the case where latency is 0 (simple copy input to output)
70
    gn0 : if NDEL = 0 generate
71
      delay(0) <= din(i);
72
    end generate gn0;
73
  end generate g1;
74
 
75
  -- Reporting of delays works only in alayzis mode
76
  ig1 : if C_LATEQ_MODE = 0 generate
77
    --pragma translate off
78
    pc1 : process(clk, rst_p) is
79
    begin
80
      if clk'event and clk = '1' then
81
        if rst_p = '1' then
82
          null;
83
        else
84
          for i in 0 to NCHANS-1 loop
85
            lateq_report_delay(LEQ_ID, i, din(i).lateq_mrk);
86
          end loop;
87
          lateq_report_end(LEQ_ID);
88
        end if;
89
      end if;
90
    end process pc1;
91
    --pragma translate on
92
  end generate ig1;
93
 
94
  -- Aborting of simulation in final verification mode
95
  ig2 : if C_LATEQ_MODE = 1 generate
96
    --pragma translate off
97
    pc2 : process(clk, rst_p) is
98
      variable latm : T_LATEQ_MRK;
99
    begin
100
      if clk'event and clk = '1' then
101
        if rst_p = '1' then
102
          null;
103
        else
104
          latm := s_out(0).lateq_mrk;
105
          for i in 1 to NCHANS-1 loop
106
            if lateq_mrk_cmp(latm,s_out(i).lateq_mrk) /= 0 then
107
              report "ERROR: Inequal latencies in block " & LEQ_ID &
108
                " chan 0:" & lateq_mrk_to_str(latm) & " chan " &
109
                integer'image(i) & ":" & lateq_mrk_to_str(s_out(i).lateq_mrk)
110
                severity FAILURE;
111
            end if;
112
          end loop;
113
        end if;
114
      end if;
115
    end process pc2;
116
    --pragma translate on
117
  end generate ig2;
118
 
119
  -- The process, which assigns outputs
120
 
121
    pu : process(s_out) is
122
      --pragma translate off
123
      variable dmin : T_LATEQ_MRK;
124
     --pragma translate on
125
    begin
126
      --pragma translate off
127
      dmin := s_out(0).lateq_mrk;
128
      --pragma translate on
129
      dout <= s_out;
130
      --pragma translate off
131
      for i in 0 to NCHANS-1 loop
132
        if lateq_mrk_cmp(dmin, s_out(i).lateq_mrk) > 0 then
133
          dmin := s_out(i).lateq_mrk;
134
        end if;
135
      end loop;
136
      -- now we have found the dmin, so set it in all outputs
137
      for i in 0 to NCHANS-1 loop
138
        dout(i).lateq_mrk <= dmin;
139
      end loop;
140
      --pragma translate on
141
    end process pu;
142
 
143
end beh;
144
 

powered by: WebSVN 2.1.0

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