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

Subversion Repositories lateq

[/] [lateq/] [trunk/] [hdl_various_types/] [src/] [ex1_pkg.vhd] - Blame information for rev 4

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

Line No. Rev Author Line
1 2 wzab
-------------------------------------------------------------------------------
2
-- Title      : ex1_pkg package
3
-- Project    : 
4
-------------------------------------------------------------------------------
5
-- File       : ex1_pkg.vhd
6
-- Author     : Wojciech M. Zabolotny ( wzab01<at>gmail.com )
7
-- Company    :
8
-- License    : BSD
9
-- Created    : 2013-11-01
10
-- Last update: 2015-09-24
11
-- Platform   : 
12
-- Standard   : VHDL'93/02
13
-------------------------------------------------------------------------------
14
-- Description: Package with definitions for the simple system
15
--              demonstrating a method of latency balancing
16
-------------------------------------------------------------------------------
17
-- Copyright (c) 2015
18
-------------------------------------------------------------------------------
19
-- Revisions  :
20
-- Date        Version  Author  Description
21
-- 2013-11-01  1.0      WZab    Created
22
-------------------------------------------------------------------------------
23
 
24
library ieee;
25
use ieee.std_logic_1164.all;
26
use ieee.numeric_std.all;
27
use std.textio.all;
28
use IEEE.math_real.all;
29
 
30
library work;
31
use work.lateq_pkg.all;
32
 
33
package ex1_pkg is
34
 
35
  -- Constants describing the processor
36
  constant C_N_CHANNELS   : integer := 64;
37
  constant C_DATA_WIDTH   : integer := 9;
38
  constant C_N_SIDE_CHANS : integer := 3;  -- number of neighbouring channels
39
 
40
  -- Type describing the position of the maximum of the signal
41
  subtype T_POS_INT is integer range 0 to C_N_CHANNELS-1;
42
  constant C_POS_INT_INIT : T_POS_INT := 0;
43
 
44
  -- Position of the maximum with time marker
45
  type T_POS_INT_MRK is record
46
    position  : T_POS_INT;
47
    -- pragma translate_off
48
    lateq_mrk : T_LATEQ_MRK;
49
  -- pragma translate_on
50
  end record T_POS_INT_MRK;
51
 
52
  constant C_POS_INT_MRK_INIT : T_POS_INT_MRK := (
53
    -- pragma translate_off
54
    lateq_mrk => C_LATEQ_MRK_INIT,
55
    -- pragma translate_on    
56
    position  => C_POS_INT_INIT
57
    );
58
 
59
  -- Data from a single channel
60
  subtype T_SINGLE_DATA is signed(C_DATA_WIDTH-1 downto 0);
61
  constant C_SINGLE_DATA_INIT : T_SINGLE_DATA := (others => '0');
62
 
63
  -- Data from a single channel with time marker,position marker and validity marker
64
  type T_SINGLE_DATA_WITH_POS is record
65
    -- pragma translate_off
66
    lateq_mrk : T_LATEQ_MRK;
67
    -- pragma translate_on
68
    position  : T_POS_INT;
69
    valid     : boolean;
70
    data      : T_SINGLE_DATA;
71
  end record T_SINGLE_DATA_WITH_POS;
72
 
73
  constant C_SINGLE_DATA_WITH_POS_INIT : T_SINGLE_DATA_WITH_POS := (
74
    -- pragma translate_off
75
    lateq_mrk => C_LATEQ_MRK_INIT,
76
    -- pragma translate_on
77
    position  => C_POS_INT_INIT,
78
    valid     => false,
79
    data      => C_SINGLE_DATA_INIT
80
    );
81
 
82
  -- Function comparing two data with markers
83
  function ex1_cmp_data (
84
    constant v1, v2 : T_SINGLE_DATA_WITH_POS)
85
    return integer;                     -- range -1 to 1;
86
 
87
 
88
  -- Vector with all input data
89
  type T_INPUT_DATA is array (0 to C_N_CHANNELS-1) of T_SINGLE_DATA;
90
  constant C_INPUT_DATA_INIT : T_INPUT_DATA := (others => C_SINGLE_DATA_INIT);
91
 
92
  -- Record with all input data and time marker - internal form
93
  type T_INPUT_DATA_MRK is record
94
    -- pragma translate_off
95
    lateq_mrk : T_LATEQ_MRK;
96
    -- pragma translate_on
97
    data_vec  : T_INPUT_DATA;
98
  end record T_INPUT_DATA_MRK;
99
 
100
  constant C_INPUT_DATA_MRK_INIT : T_INPUT_DATA_MRK := (
101
    -- pragma translate_off
102
    lateq_mrk => C_LATEQ_MRK_INIT,
103
    -- pragma translate_on
104
    data_vec  => (others => C_SINGLE_DATA_INIT)
105
    );
106
 
107
  -- Here we calculate widths of words needed to store intermadiate calculation
108
  -- results. We may assign too many bits. During the synthesis unused bits
109
  -- will be optimized out.
110
  constant C_CALC_SUM_WIDTH : integer := 2*integer(ceil(log2(real(1+2*C_N_SIDE_CHANS))))+C_DATA_WIDTH;
111
  subtype T_CALC_DATA is signed(C_CALC_SUM_WIDTH-1 downto 0);
112
 
113
  constant C_CALC_DATA_INIT : T_CALC_DATA := (others => '0');
114
 
115
  -- Type storing the calculation results with time merker
116
  type T_CALC_DATA_MRK is record
117
    -- pragma translate_off
118
    lateq_mrk : T_LATEQ_MRK;
119
    -- pragma translate_on
120
    valid     : boolean;
121
    sum       : T_CALC_DATA;
122
  end record T_CALC_DATA_MRK;
123
 
124
  constant C_CALC_DATA_MRK_INIT : T_CALC_DATA_MRK := (
125
    -- pragma translate_off
126
    lateq_mrk => C_LATEQ_MRK_INIT,
127
    -- pragma translate_on
128
    valid     => false,
129
    sum       => C_CALC_DATA_INIT
130
    );
131
 
132
  -- It would be nice to define the vectors with selected data as follows:
133
  -- type T_SEL_DATA_VEC is array (-C_N_SIDE_CHANS to C_N_SIDE_CHANS) of T_SINGLE_DATA;
134
  -- Unfortunately it creates problems with other blocks.
135
  -- Therefore I must define them with indices starting from 0
136
  -- Vector with selected data
137
 
138
  type T_SEL_DATA_VEC is array (0 to 2*C_N_SIDE_CHANS) of T_SINGLE_DATA;
139
  -- Vector with selected data after calculations
140
  type T_CALC_DATA_VEC is array (0 to 2*C_N_SIDE_CHANS) of T_CALC_DATA;
141
 
142
  -- Vector with selected data and time marker
143
  type T_SEL_DATA is record
144
    -- pragma translate_off
145
    lateq_mrk : T_LATEQ_MRK;
146
    -- pragma translate_on
147
    data_vec  : T_SEL_DATA_VEC;
148
  end record T_SEL_DATA;
149
  constant C_SEL_DATA_INIT : T_SEL_DATA := (
150
    -- pragma translate_off
151
    lateq_mrk => C_LATEQ_MRK_INIT,
152
    -- pragma translate_on
153
    data_vec  => (others => C_SINGLE_DATA_INIT)
154
    );
155
 
156
  -- Vector with calculation results and time marker
157
  type T_CALC_SEL_DATA is record
158
    -- pragma translate_off
159
    lateq_mrk : T_LATEQ_MRK;
160
    -- pragma translate_on
161
    data_vec  : T_CALC_DATA_VEC;
162
  end record T_CALC_SEL_DATA;
163
 
164
  constant C_CALC_SEL_DATA_INIT : T_CALC_SEL_DATA := (
165
    -- pragma translate_off
166
    lateq_mrk => C_LATEQ_MRK_INIT,
167
    -- pragma translate_on
168
    data_vec  => (others => C_CALC_DATA_INIT)
169
    );
170
 
171
end package ex1_pkg;
172
 
173
package body ex1_pkg is
174
 
175
  function ex1_cmp_data (
176
    constant v1, v2 : T_SINGLE_DATA_WITH_POS)
177
    return integer is
178
  begin  -- function ex1_cmp_data
179
    if v1.data > v2.data then
180
      return 1;
181
    elsif v2.data > v1.data then
182
      return -1;
183
    else
184
      return 0;
185
    end if;
186
  end function ex1_cmp_data;
187
 
188
 
189
end package body ex1_pkg;

powered by: WebSVN 2.1.0

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