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

Subversion Repositories ccsds_rxtxsoc

[/] [ccsds_rxtxsoc/] [trunk/] [ccsds_tx_filter.vhd] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 zguig52
-------------------------------
2
---- Project: EurySPACE CCSDS RX/TX with wishbone interface
3
---- Design Name: ccsds_tx_filter
4
---- Version: 1.0.0
5
---- Description:
6
---- Transform symbols to samples, oversample signal and filter it with SRRC filter
7
-------------------------------
8
---- Author(s):
9
---- Guillaume REMBERT
10
-------------------------------
11
---- Licence:
12
---- MIT
13
-------------------------------
14
---- Changes list:
15
---- 2016/11/06: initial release
16
-------------------------------
17
 
18
-- libraries used
19
library ieee;
20
use ieee.std_logic_1164.all;
21
 
22
--=============================================================================
23
-- Entity declaration for ccsds_tx / unitary tx filter inputs and outputs
24
--=============================================================================
25
entity ccsds_tx_filter is
26
  generic(
27
    constant CCSDS_TX_FILTER_BITS_PER_SYMBOL: integer; -- in bits
28
    constant CCSDS_TX_FILTER_OVERSAMPLING_RATIO: integer;
29
    constant CCSDS_TX_FILTER_OFFSET_IQ: boolean := true;
30
    constant CCSDS_TX_FILTER_MODULATION_TYPE: integer;
31
    constant CCSDS_TX_FILTER_SIG_QUANT_DEPTH: integer;
32
    constant CCSDS_TX_FILTER_TARGET_SNR: real := 40.0
33
  );
34
  port(
35
    -- inputs
36
    clk_i: in std_logic;
37
    rst_i: in std_logic;
38
    sym_i_i: in std_logic_vector(CCSDS_TX_FILTER_BITS_PER_SYMBOL-1 downto 0);
39
    sym_q_i: in std_logic_vector(CCSDS_TX_FILTER_BITS_PER_SYMBOL-1 downto 0);
40
    sym_val_i: in std_logic;
41
    -- outputs
42
    sam_i_o: out std_logic_vector(CCSDS_TX_FILTER_SIG_QUANT_DEPTH-1 downto 0);
43
    sam_q_o: out std_logic_vector(CCSDS_TX_FILTER_SIG_QUANT_DEPTH-1 downto 0);
44
    sam_val_o: out std_logic
45
  );
46
end ccsds_tx_filter;
47
 
48
--=============================================================================
49
-- architecture declaration / internal components and connections
50
--=============================================================================
51
architecture structure of ccsds_tx_filter is
52
  component ccsds_tx_mapper_symbols_samples is
53
    generic(
54
      constant CCSDS_TX_MAPPER_TARGET_SNR: real;
55
      constant CCSDS_TX_MAPPER_BITS_PER_SYMBOL: integer;
56
      constant CCSDS_TX_MAPPER_QUANTIZATION_DEPTH: integer
57
    );
58
    port(
59
      clk_i: in std_logic;
60
      rst_i: in std_logic;
61
      sym_i: in std_logic_vector(CCSDS_TX_MAPPER_BITS_PER_SYMBOL-1 downto 0);
62
      sym_val_i: in std_logic;
63
      sam_val_o: out std_logic;
64
      sam_o: out std_logic_vector(CCSDS_TX_MAPPER_QUANTIZATION_DEPTH-1 downto 0)
65
    );
66
  end component;
67
  component ccsds_rxtx_oversampler is
68
    generic(
69
      CCSDS_RXTX_OVERSAMPLER_OVERSAMPLING_RATIO: integer;
70
      CCSDS_RXTX_OVERSAMPLER_SYMBOL_DEPHASING: boolean;
71
      CCSDS_RXTX_OVERSAMPLER_SIG_QUANT_DEPTH: integer
72
    );
73
    port(
74
      clk_i: in std_logic;
75
      sam_i: in std_logic_vector(CCSDS_RXTX_OVERSAMPLER_SIG_QUANT_DEPTH-1 downto 0);
76
      sam_val_i: in std_logic;
77
      rst_i: in std_logic;
78
      sam_o: out std_logic_vector(CCSDS_RXTX_OVERSAMPLER_SIG_QUANT_DEPTH-1 downto 0);
79
      sam_val_o: out std_logic
80
    );
81
  end component;
82
  component ccsds_rxtx_srrc is
83
    generic(
84
      CCSDS_RXTX_SRRC_OVERSAMPLING_RATIO: integer;
85
      CCSDS_RXTX_SRRC_SIG_QUANT_DEPTH: integer
86
    );
87
    port(
88
      clk_i: in std_logic;
89
      rst_i: in std_logic;
90
      sam_i: in std_logic_vector(CCSDS_RXTX_SRRC_SIG_QUANT_DEPTH-1 downto 0);
91
      sam_val_i: in std_logic;
92
      sam_o: out std_logic_vector(CCSDS_RXTX_SRRC_SIG_QUANT_DEPTH-1 downto 0);
93
      sam_val_o: out std_logic
94
    );
95
  end component;
96
-- internal constants
97
-- internal variable signals
98
  signal wire_sam_i: std_logic_vector(CCSDS_TX_FILTER_SIG_QUANT_DEPTH-1 downto 0);
99
  signal wire_sam_q: std_logic_vector(CCSDS_TX_FILTER_SIG_QUANT_DEPTH-1 downto 0);
100
  signal wire_sam_i_val: std_logic := '0';
101
  signal wire_sam_q_val: std_logic := '0';
102
  signal wire_sam_i_osr: std_logic_vector(CCSDS_TX_FILTER_SIG_QUANT_DEPTH-1 downto 0);
103
  signal wire_sam_q_osr: std_logic_vector(CCSDS_TX_FILTER_SIG_QUANT_DEPTH-1 downto 0);
104
  signal wire_sam_i_osr_val: std_logic;
105
  signal wire_sam_q_osr_val: std_logic;
106
  signal wire_sam_i_srrc_val: std_logic;
107
  signal wire_sam_q_srrc_val: std_logic;
108
-- components instanciation and mapping
109
  begin
110
  tx_mapper_symbols_samples_i_0: ccsds_tx_mapper_symbols_samples
111
    generic map(
112
      CCSDS_TX_MAPPER_QUANTIZATION_DEPTH => CCSDS_TX_FILTER_SIG_QUANT_DEPTH,
113
      CCSDS_TX_MAPPER_TARGET_SNR => CCSDS_TX_FILTER_TARGET_SNR,
114
      CCSDS_TX_MAPPER_BITS_PER_SYMBOL => CCSDS_TX_FILTER_BITS_PER_SYMBOL
115
    )
116
    port map(
117
      clk_i => clk_i,
118
      sym_i => sym_i_i,
119
      sym_val_i => sym_val_i,
120
      rst_i => rst_i,
121
      sam_o => wire_sam_i,
122
      sam_val_o => wire_sam_i_val
123
    );
124
  tx_oversampler_i_0: ccsds_rxtx_oversampler
125
    generic map(
126
      CCSDS_RXTX_OVERSAMPLER_OVERSAMPLING_RATIO => CCSDS_TX_FILTER_OVERSAMPLING_RATIO,
127
      CCSDS_RXTX_OVERSAMPLER_SYMBOL_DEPHASING => CCSDS_TX_FILTER_OFFSET_IQ,
128
      CCSDS_RXTX_OVERSAMPLER_SIG_QUANT_DEPTH => CCSDS_TX_FILTER_SIG_QUANT_DEPTH
129
    )
130
    port map(
131
      clk_i => clk_i,
132
      sam_i => wire_sam_i,
133
      sam_val_i => wire_sam_i_val,
134
      rst_i => rst_i,
135
      sam_val_o => wire_sam_i_osr_val,
136
      sam_o => wire_sam_i_osr
137
    );
138
  tx_srrc_i_0: ccsds_rxtx_srrc
139
    generic map(
140
      CCSDS_RXTX_SRRC_OVERSAMPLING_RATIO => CCSDS_TX_FILTER_OVERSAMPLING_RATIO,
141
      CCSDS_RXTX_SRRC_SIG_QUANT_DEPTH => CCSDS_TX_FILTER_SIG_QUANT_DEPTH
142
    )
143
    port map(
144
      clk_i => clk_i,
145
      sam_i => wire_sam_i_osr,
146
      sam_val_i => wire_sam_i_osr_val,
147
      rst_i => rst_i,
148
      sam_o => sam_i_o,
149
      sam_val_o => wire_sam_i_srrc_val
150
    );
151
  -- BPSK
152
  BPSK_GENERATION: if (CCSDS_TX_FILTER_BITS_PER_SYMBOL = 1) and (CCSDS_TX_FILTER_MODULATION_TYPE = 2) generate
153
    sam_q_o <= (others => '0');
154
    wire_sam_q_srrc_val <= '1';
155
  end generate BPSK_GENERATION;
156
  -- nPSK
157
  NPSK_GENERATION: if (CCSDS_TX_FILTER_MODULATION_TYPE /= 2) or (CCSDS_TX_FILTER_BITS_PER_SYMBOL /= 1) generate
158
    tx_mapper_symbols_samples_q_0: ccsds_tx_mapper_symbols_samples
159
      generic map(
160
        CCSDS_TX_MAPPER_QUANTIZATION_DEPTH => CCSDS_TX_FILTER_SIG_QUANT_DEPTH,
161
        CCSDS_TX_MAPPER_TARGET_SNR => CCSDS_TX_FILTER_TARGET_SNR,
162
        CCSDS_TX_MAPPER_BITS_PER_SYMBOL => CCSDS_TX_FILTER_BITS_PER_SYMBOL
163
      )
164
      port map(
165
        clk_i => clk_i,
166
        sym_i => sym_q_i,
167
        sym_val_i => sym_val_i,
168
        rst_i => rst_i,
169
        sam_o => wire_sam_q,
170
        sam_val_o => wire_sam_q_val
171
      );
172
    tx_oversampler_q_0: ccsds_rxtx_oversampler
173
      generic map(
174
        CCSDS_RXTX_OVERSAMPLER_OVERSAMPLING_RATIO => CCSDS_TX_FILTER_OVERSAMPLING_RATIO,
175
        CCSDS_RXTX_OVERSAMPLER_SYMBOL_DEPHASING => false,
176
        CCSDS_RXTX_OVERSAMPLER_SIG_QUANT_DEPTH => CCSDS_TX_FILTER_SIG_QUANT_DEPTH
177
      )
178
      port map(
179
        clk_i => clk_i,
180
        sam_i => wire_sam_q,
181
        sam_val_i => wire_sam_q_val,
182
        rst_i => rst_i,
183
        sam_val_o => wire_sam_q_osr_val,
184
        sam_o => wire_sam_q_osr
185
      );
186
    tx_srrc_q_0: ccsds_rxtx_srrc
187
      generic map(
188
        CCSDS_RXTX_SRRC_OVERSAMPLING_RATIO => CCSDS_TX_FILTER_OVERSAMPLING_RATIO,
189
        CCSDS_RXTX_SRRC_SIG_QUANT_DEPTH => CCSDS_TX_FILTER_SIG_QUANT_DEPTH
190
      )
191
      port map(
192
        clk_i => clk_i,
193
        sam_i => wire_sam_q_osr,
194
        sam_val_i => wire_sam_q_osr_val,
195
        rst_i => rst_i,
196
        sam_o => sam_q_o,
197
        sam_val_o => wire_sam_q_srrc_val
198
      );
199
    end generate NPSK_GENERATION;
200
    --Valid samples indicator
201
    sam_val_o <= wire_sam_i_srrc_val and wire_sam_q_srrc_val;
202
-- presynthesis checks
203
          CHKFILTERP0: if (CCSDS_TX_FILTER_BITS_PER_SYMBOL > 2*(CCSDS_TX_FILTER_SIG_QUANT_DEPTH-1)) generate
204
                  process
205
                  begin
206
                          report "ERROR: BITS PER SYMBOL CANNOT BE HIGHER THAN 2*(CCSDS_TX_FILTER_SIG_QUANT_DEPTH-1)" severity failure;
207
                          wait;
208
                  end process;
209
          end generate CHKFILTERP0;
210
end structure;

powered by: WebSVN 2.1.0

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