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

Subversion Repositories spdif_interface

[/] [spdif_interface/] [trunk/] [rtl/] [vhdl/] [rx_spdif.vhd] - Blame information for rev 72

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

Line No. Rev Author Line
1 36 gedra
----------------------------------------------------------------------
2
----                                                              ----
3
---- WISHBONE SPDIF IP Core                                       ----
4
----                                                              ----
5
---- This file is part of the SPDIF project                       ----
6
---- http://www.opencores.org/cores/spdif_interface/              ----
7
----                                                              ----
8
---- Description                                                  ----
9
---- SPDIF receiver. Top level entity for the receiver core.      ----
10
----                                                              ----
11
----                                                              ----
12
---- To Do:                                                       ----
13
---- -                                                            ----
14
----                                                              ----
15
---- Author(s):                                                   ----
16
---- - Geir Drange, gedra@opencores.org                           ----
17
----                                                              ----
18
----------------------------------------------------------------------
19
----                                                              ----
20
---- Copyright (C) 2004 Authors and OPENCORES.ORG                 ----
21
----                                                              ----
22
---- This source file may be used and distributed without         ----
23
---- restriction provided that this copyright statement is not    ----
24
---- removed from the file and that any derivative work contains  ----
25
---- the original copyright notice and the associated disclaimer. ----
26
----                                                              ----
27
---- This source file is free software; you can redistribute it   ----
28
---- and/or modify it under the terms of the GNU Lesser General   ----
29
---- Public License as published by the Free Software Foundation; ----
30
---- either version 2.1 of the License, or (at your option) any   ----
31
---- later version.                                               ----
32
----                                                              ----
33
---- This source is distributed in the hope that it will be       ----
34
---- useful, but WITHOUT ANY WARRANTY; without even the implied   ----
35
---- warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ----
36
---- PURPOSE. See the GNU Lesser General Public License for more  ----
37
---- details.                                                     ----
38
----                                                              ----
39
---- You should have received a copy of the GNU Lesser General    ----
40
---- Public License along with this source; if not, download it   ----
41
---- from http://www.opencores.org/lgpl.shtml                     ----
42
----                                                              ----
43
----------------------------------------------------------------------
44
--
45
-- CVS Revision History
46
--
47
-- $Log: not supported by cvs2svn $
48 72 gedra
-- Revision 1.6  2004/07/20 17:41:25  gedra
49
-- Cleaned up synthesis warnings.
50
--
51 62 gedra
-- Revision 1.5  2004/07/19 16:58:37  gedra
52
-- Fixed bug.
53
--
54 58 gedra
-- Revision 1.4  2004/07/12 17:06:41  gedra
55
-- Fixed bug with lock event generation.
56
--
57 42 gedra
-- Revision 1.3  2004/07/11 16:19:50  gedra
58
-- Bug-fix.
59
--
60 39 gedra
-- Revision 1.2  2004/06/27 16:16:55  gedra
61
-- Signal renaming and bug fix.
62
--
63 38 gedra
-- Revision 1.1  2004/06/26 14:13:56  gedra
64
-- Top level entity for receiver.
65 36 gedra
--
66 38 gedra
--
67 36 gedra
 
68
library IEEE;
69
use IEEE.std_logic_1164.all;
70
use work.rx_package.all;
71
 
72 72 gedra
entity rx_spdif is
73
   generic (DATA_WIDTH    : integer range 16 to 32;
74
            ADDR_WIDTH    : integer range 8 to 64;
75
            CH_ST_CAPTURE : integer range 0 to 8;
76
            WISHBONE_FREQ : natural);
77
   port (
78
      -- Wishbone interface
79
      wb_clk_i   : in  std_logic;
80
      wb_rst_i   : in  std_logic;
81
      wb_sel_i   : in  std_logic;
82
      wb_stb_i   : in  std_logic;
83
      wb_we_i    : in  std_logic;
84
      wb_cyc_i   : in  std_logic;
85
      wb_bte_i   : in  std_logic_vector(1 downto 0);
86
      wb_cti_i   : in  std_logic_vector(2 downto 0);
87
      wb_adr_i   : in  std_logic_vector(ADDR_WIDTH - 1 downto 0);
88
      wb_dat_i   : in  std_logic_vector(DATA_WIDTH -1 downto 0);
89
      wb_ack_o   : out std_logic;
90
      wb_dat_o   : out std_logic_vector(DATA_WIDTH - 1 downto 0);
91
      -- Interrupt line
92
      rx_int_o   : out std_logic;
93
      -- SPDIF input signal
94
      spdif_rx_i : in  std_logic);
95 36 gedra
end rx_spdif;
96
 
97
architecture rtl of rx_spdif is
98
 
99 72 gedra
   signal data_out, ver_dout                          : std_logic_vector(DATA_WIDTH - 1 downto 0);
100
   signal ver_rd, conf_chas, conf_valid               : std_logic;
101
   signal conf_rxen, conf_sample, evt_en              : std_logic;
102
   signal conf_blken, conf_valen, conf_useren         : std_logic;
103
   signal conf_paren, config_rd, config_wr            : std_logic;
104
   signal conf_mode                                   : std_logic_vector(3 downto 0);
105
   signal conf_bits, conf_dout                        : std_logic_vector(DATA_WIDTH - 1 downto 0);
106
   signal status_rd, istat_parityb                    : std_logic;
107
   signal stat_dout                                   : std_logic_vector(DATA_WIDTH - 1 downto 0);
108
   signal imask_bits, imask_dout                      : std_logic_vector(DATA_WIDTH - 1 downto 0);
109
   signal imask_rd, imask_wr, conf_staten             : std_logic;
110
   signal istat_dout, istat_events                    : std_logic_vector(DATA_WIDTH - 1 downto 0);
111
   signal istat_rd, istat_wr, istat_lock              : std_logic;
112
   signal istat_lsbf, istat_hsbf, istat_paritya       : std_logic;
113
   signal istat_cap                                   : std_logic_vector(7 downto 0);
114
   signal ch_st_cap_rd, ch_st_cap_wr, ch_st_data_rd   : std_logic_vector(7 downto 0);
115
   signal cap_dout                                    : bus_array;
116
   signal ch_data, ud_a_en, ud_b_en, cs_a_en, cs_b_en : std_logic;
117
   signal mem_rd, sample_wr                           : std_logic;
118
   signal sample_din, sample_dout                     : std_logic_vector(DATA_WIDTH - 1 downto 0);
119
   signal sbuf_wr_adr, sbuf_rd_adr                    : std_logic_vector(ADDR_WIDTH - 2 downto 0);
120
   signal lock, rx_frame_start                        : std_logic;
121
   signal rx_data, rx_data_en, rx_block_start         : std_logic;
122
   signal rx_channel_a, rx_error, lock_evt            : std_logic;
123 36 gedra
 
124
begin
125
 
126
-- Data bus or'ing 
127 72 gedra
   DB16 : if DATA_WIDTH = 16 generate
128
      data_out <= ver_dout or conf_dout or stat_dout or imask_dout or istat_dout
129
                  when wb_adr_i(ADDR_WIDTH - 1) = '0' else sample_dout;
130
   end generate DB16;
131
   DB32 : if DATA_WIDTH = 32 generate
132
      data_out <= ver_dout or conf_dout or stat_dout or imask_dout or istat_dout or
133
                  cap_dout(1) or cap_dout(2) or cap_dout(3) or cap_dout(4) or
134
                  cap_dout(5) or cap_dout(6) or cap_dout(7) or cap_dout(0) when
135
                  wb_adr_i(ADDR_WIDTH - 1) = '0' else sample_dout;
136
   end generate DB32;
137 36 gedra
 
138
-- Wishbone bus cycle decoder
139 72 gedra
   WB : rx_wb_decoder
140
      generic map (
141
         DATA_WIDTH => DATA_WIDTH,
142
         ADDR_WIDTH => ADDR_WIDTH)
143
      port map (
144
         wb_clk_i      => wb_clk_i,
145
         wb_rst_i      => wb_rst_i,
146
         wb_sel_i      => wb_sel_i,
147
         wb_stb_i      => wb_stb_i,
148
         wb_we_i       => wb_we_i,
149
         wb_cyc_i      => wb_cyc_i,
150
         wb_bte_i      => wb_bte_i,
151
         wb_cti_i      => wb_cti_i,
152
         wb_adr_i      => wb_adr_i,
153
         data_out      => data_out,
154
         wb_ack_o      => wb_ack_o,
155
         wb_dat_o      => wb_dat_o,
156
         version_rd    => ver_rd,
157
         config_rd     => config_rd,
158
         config_wr     => config_wr,
159
         status_rd     => status_rd,
160
         intmask_rd    => imask_rd,
161
         intmask_wr    => imask_wr,
162
         intstat_rd    => istat_rd,
163
         intstat_wr    => istat_wr,
164
         mem_rd        => mem_rd,
165
         mem_addr      => sbuf_rd_adr,
166
         ch_st_cap_rd  => ch_st_cap_rd,
167
         ch_st_cap_wr  => ch_st_cap_wr,
168
         ch_st_data_rd => ch_st_data_rd);
169
 
170 36 gedra
-- Version register
171 72 gedra
   VER : rx_ver_reg
172
      generic map (
173
         DATA_WIDTH    => DATA_WIDTH,
174
         ADDR_WIDTH    => ADDR_WIDTH,
175
         CH_ST_CAPTURE => CH_ST_CAPTURE)
176
      port map (
177
         ver_rd   => ver_rd,
178
         ver_dout => ver_dout);
179 36 gedra
 
180
-- Configuration register
181 72 gedra
   CG32 : if DATA_WIDTH = 32 generate
182
      CONF : gen_control_reg
183
         generic map (
184
            DATA_WIDTH      => 32,
185
            ACTIVE_BIT_MASK => "11111100000000001111111100000000")
186
         port map (
187
            clk       => wb_clk_i,
188
            rst       => wb_rst_i,
189
            ctrl_wr   => config_wr,
190
            ctrl_rd   => config_rd,
191
            ctrl_din  => wb_dat_i,
192
            ctrl_dout => conf_dout,
193
            ctrl_bits => conf_bits);
194
      conf_mode(3 downto 0) <= conf_bits(23 downto 20);
195
      conf_paren            <= conf_bits(19);
196
      conf_staten           <= conf_bits(18);
197
      conf_useren           <= conf_bits(17);
198
      conf_valen            <= conf_bits(16);
199
   end generate CG32;
200
 
201
   CG16 : if DATA_WIDTH = 16 generate
202
      CONF : gen_control_reg
203
         generic map (
204
            DATA_WIDTH      => 16,
205
            ACTIVE_BIT_MASK => "1111110000000000")
206
         port map (
207
            clk       => wb_clk_i,
208
            rst       => wb_rst_i,
209
            ctrl_wr   => config_wr,
210
            ctrl_rd   => config_rd,
211
            ctrl_din  => wb_dat_i,
212
            ctrl_dout => conf_dout,
213
            ctrl_bits => conf_bits);
214
      conf_mode(3 downto 0) <= "0000";
215
      conf_paren            <= '0';
216
      conf_staten           <= '0';
217
      conf_useren           <= '0';
218
      conf_valen            <= '0';
219
   end generate CG16;
220
 
221
   conf_blken  <= conf_bits(5);
222
   conf_valid  <= conf_bits(4);
223
   conf_chas   <= conf_bits(3);
224
   evt_en      <= conf_bits(2);
225
   conf_sample <= conf_bits(1);
226
   conf_rxen   <= conf_bits(0);
227
 
228
-- status register
229
   STAT : rx_status_reg
230 36 gedra
      generic map (
231 72 gedra
         DATA_WIDTH => DATA_WIDTH)
232 36 gedra
      port map (
233 72 gedra
         wb_clk_i       => wb_clk_i,
234
         status_rd      => status_rd,
235
         lock           => lock,
236
         chas           => conf_chas,
237
         rx_block_start => rx_block_start,
238
         ch_data        => rx_data,
239
         cs_a_en        => cs_a_en,
240
         cs_b_en        => cs_b_en,
241
         status_dout    => stat_dout);
242 36 gedra
 
243
-- interrupt mask register
244 72 gedra
   IM32 : if DATA_WIDTH = 32 generate
245
      IMASK : gen_control_reg
246
         generic map (
247
            DATA_WIDTH      => 32,
248
            ACTIVE_BIT_MASK => "11111000000000001111111100000000")
249
         port map (
250
            clk       => wb_clk_i,
251
            rst       => wb_rst_i,
252
            ctrl_wr   => imask_wr,
253
            ctrl_rd   => imask_rd,
254
            ctrl_din  => wb_dat_i,
255
            ctrl_dout => imask_dout,
256
            ctrl_bits => imask_bits);
257
   end generate IM32;
258
 
259
   IM16 : if DATA_WIDTH = 16 generate
260
      IMASK : gen_control_reg
261
         generic map (
262
            DATA_WIDTH      => 16,
263
            ACTIVE_BIT_MASK => "1111100000000000")
264
         port map (
265
            clk       => wb_clk_i,
266
            rst       => wb_rst_i,
267
            ctrl_wr   => imask_wr,
268
            ctrl_rd   => imask_rd,
269
            ctrl_din  => wb_dat_i,
270
            ctrl_dout => imask_dout,
271
            ctrl_bits => imask_bits);
272
   end generate IM16;
273
 
274
-- interrupt status register
275
   ISTAT : gen_event_reg
276 36 gedra
      generic map (
277 72 gedra
         DATA_WIDTH => DATA_WIDTH)
278 36 gedra
      port map (
279 72 gedra
         clk      => wb_clk_i,
280
         rst      => wb_rst_i,
281
         evt_wr   => istat_wr,
282
         evt_rd   => istat_rd,
283
         evt_din  => wb_dat_i,
284
         evt_dout => istat_dout,
285
         event    => istat_events,
286
         evt_mask => imask_bits,
287
         evt_en   => evt_en,
288
         evt_irq  => rx_int_o);
289 36 gedra
 
290 72 gedra
   istat_events(0)           <= lock_evt;
291
   istat_events(1)           <= istat_lsbf;
292
   istat_events(2)           <= istat_hsbf;
293
   istat_events(3)           <= istat_paritya;
294
   istat_events(4)           <= istat_parityb;
295
   istat_events(15 downto 5) <= (others => '0');
296
 
297
   IS32 : if DATA_WIDTH = 32 generate
298
      istat_events(23 downto 16) <= istat_cap(7 downto 0);
299
      istat_events(31 downto 24) <= (others => '0');
300
   end generate IS32;
301
 
302 36 gedra
-- capture registers
303 72 gedra
   GCAP : if DATA_WIDTH = 32 and CH_ST_CAPTURE > 0 generate
304
      CAPR : for k in 0 to CH_ST_CAPTURE - 1 generate
305
         CHST : rx_cap_reg
306
            port map (
307
               clk            => wb_clk_i,
308
               rst            => wb_rst_i,
309
               cap_ctrl_wr    => ch_st_cap_wr(k),
310
               cap_ctrl_rd    => ch_st_cap_rd(k),
311
               cap_data_rd    => ch_st_data_rd(k),
312
               cap_din        => wb_dat_i,
313
               cap_dout       => cap_dout(k),
314
               cap_evt        => istat_cap(k),
315
               rx_block_start => rx_block_start,
316
               ch_data        => rx_data,
317
               ud_a_en        => ud_a_en,
318
               ud_b_en        => ud_b_en,
319
               cs_a_en        => cs_a_en,
320
               cs_b_en        => cs_b_en);
321
      end generate CAPR;
322 36 gedra
 
323 72 gedra
      -- unused capture registers set to zero
324
      UCAPR : if CH_ST_CAPTURE < 8 generate
325
         UC : for k in CH_ST_CAPTURE to 7 generate
326
            cap_dout(k) <= (others => '0');
327
         end generate UC;
328
      end generate UCAPR;
329
   end generate GCAP;
330
 
331 36 gedra
-- Sample buffer memory
332 72 gedra
   MEM : dpram
333
      generic map (
334
         DATA_WIDTH => DATA_WIDTH,
335
         RAM_WIDTH  => ADDR_WIDTH - 1)
336
      port map (
337
         clk     => wb_clk_i,
338
         rst     => wb_rst_i,
339
         din     => sample_din,
340
         wr_en   => sample_wr,
341
         rd_en   => mem_rd,
342
         wr_addr => sbuf_wr_adr,
343
         rd_addr => sbuf_rd_adr,
344
         dout    => sample_dout);
345 36 gedra
 
346
-- phase decoder
347 72 gedra
   PDET : rx_phase_det
348
      generic map (
349
         WISHBONE_FREQ => WISHBONE_FREQ)  -- WishBone frequency in MHz
350
      port map (
351
         wb_clk_i       => wb_clk_i,
352
         rxen           => conf_rxen,
353
         spdif          => spdif_rx_i,
354
         lock           => lock,
355
         lock_evt       => lock_evt,
356
         rx_data        => rx_data,
357
         rx_data_en     => rx_data_en,
358
         rx_block_start => rx_block_start,
359
         rx_frame_start => rx_frame_start,
360
         rx_channel_a   => rx_channel_a,
361
         rx_error       => rx_error,
362
         ud_a_en        => ud_a_en,
363
         ud_b_en        => ud_b_en,
364
         cs_a_en        => cs_a_en,
365
         cs_b_en        => cs_b_en);
366 36 gedra
 
367
-- frame decoder
368 72 gedra
   FDEC : rx_decode
369
      generic map (
370
         DATA_WIDTH => DATA_WIDTH,
371
         ADDR_WIDTH => ADDR_WIDTH)
372
      port map (
373
         wb_clk_i       => wb_clk_i,
374
         conf_rxen      => conf_rxen,
375
         conf_sample    => conf_sample,
376
         conf_valid     => conf_valid,
377
         conf_mode      => conf_mode,
378
         conf_blken     => conf_blken,
379
         conf_valen     => conf_valen,
380
         conf_useren    => conf_useren,
381
         conf_staten    => conf_staten,
382
         conf_paren     => conf_paren,
383
         lock           => lock,
384
         rx_data        => rx_data,
385
         rx_data_en     => rx_data_en,
386
         rx_block_start => rx_block_start,
387
         rx_frame_start => rx_frame_start,
388
         rx_channel_a   => rx_channel_a,
389
         wr_en          => sample_wr,
390
         wr_addr        => sbuf_wr_adr,
391
         wr_data        => sample_din,
392
         stat_paritya   => istat_paritya,
393
         stat_parityb   => istat_parityb,
394
         stat_lsbf      => istat_lsbf,
395
         stat_hsbf      => istat_hsbf);
396
 
397 36 gedra
end rtl;
398
 

powered by: WebSVN 2.1.0

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