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

Subversion Repositories i2s_to_wb

[/] [i2s_to_wb/] [trunk/] [src/] [i2s_to_wb_top.v] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 qaztronic
// --------------------------------------------------------------------
2
//
3
// --------------------------------------------------------------------
4
 
5
`include "timescale.v"
6
 
7
 
8
module
9
  i2s_to_wb_top
10
  (
11
    input   [31:0]  wbs_data_i,
12
    output  [31:0]  wbs_data_o,
13
    input   [31:0]  wbs_addr_i,
14
    input   [3:0]   wbs_sel_i,
15
    input           wbs_we_i,
16
    input           wbs_cyc_i,
17
    input           wbs_stb_i,
18
    output          wbs_ack_o,
19
    output          wbs_err_o,
20
    output          wbs_rty_o,
21
 
22
    input           i2s_sck_i,
23
    input           i2s_ws_i,
24
    output          i2s_sd_o,
25
 
26
    input           i2s_clk_i,
27
    input           i2s_rst_i
28
  );
29
 
30
 
31
  //---------------------------------------------------
32
  // register encoder
33
  reg [3:0] register_index_r;
34
 
35
  always @(*)
36
    case( wbs_addr_i[19:0] )
37
      20'h0_0000: register_index_r = 4'h0;
38
      20'h0_0004: register_index_r = 4'h1;
39
      20'h0_0008: register_index_r = 4'h2;
40
      20'h0_000c: register_index_r = 4'h3;
41
      20'h0_0010: register_index_r = 4'h4;
42
      default:    register_index_r = 4'hf;
43
    endcase
44
 
45
 
46
  //---------------------------------------------------
47
  // register offset 0x0  -- 
48
  reg [31:0]  i2s_register_0;
49
  wire        i2s_register_0_we = (wbs_cyc_i & wbs_stb_i & wbs_we_i) & (register_index_r == 4'h0);
50
 
51
  always @( posedge i2s_clk_i )
52
    if( i2s_rst_i )
53
      i2s_register_0 <= 32'h00000000;
54
    else if( i2s_register_0_we )
55
      i2s_register_0 <= wbs_data_i;
56
 
57
 
58
  //---------------------------------------------------
59
  // register offset 0x4  -- 
60
  reg [31:0]  i2s_register_1;
61
 
62
  always @( posedge i2s_clk_i )
63
    if( i2s_rst_i )
64
      i2s_register_1 <= 32'h00000000;
65
    else if( (wbs_cyc_i & wbs_stb_i & wbs_we_i) & (register_index_r == 4'h1) )
66
      i2s_register_1 <= wbs_data_i;
67
 
68
 
69
  //---------------------------------------------------
70
  // register offset 0x8  -- read only
71
  wire [31:0] i2s_register_2;
72
 
73
 
74
  //---------------------------------------------------
75
  // register offset 0xc  -- read only
76
  wire [31:0] i2s_register_3;
77
 
78
 
79
  //---------------------------------------------------
80
  // register offset 0x10  -- write only
81
  wire [31:0] i2s_register_4;
82
  wire        i2s_register_4_we = (wbs_cyc_i & wbs_stb_i & wbs_we_i) & (register_index_r == 4'h4);
83
 
84
 
85
  //---------------------------------------------------
86
  // register mux
87
  reg [31:0]  wbs_data_o_r;
88
 
89
  always @(*)
90
    case( register_index_r )
91
      4'h0:     wbs_data_o_r = i2s_register_0;
92
      4'h1:     wbs_data_o_r = i2s_register_1;
93
      4'h2:     wbs_data_o_r = i2s_register_2;
94
      4'h3:     wbs_data_o_r = i2s_register_3;
95
      4'h4:     wbs_data_o_r = i2s_register_4;
96
      4'hf:     wbs_data_o_r = 32'h1bad_c0de;
97
      default:  wbs_data_o_r = 32'h1bad_c0de;
98
    endcase
99
 
100
 
101
  //---------------------------------------------------
102
  // wishbone clock domain
103
  wire        i2s_ws_edge;
104
  wire [31:0] fifo_right_data;
105
  wire [31:0] fifo_left_data;
106
  wire        fifo_ack;
107
  wire        fifo_ready;
108
 
109
  i2s_to_wb_tx_if #( .DMA_BUFFER_MAX_WIDTH(12) )
110
    i_i2s_to_wb_tx_if
111
    (
112
      .i2s_enable(i2s_register_0[0]),
113
      .i2s_ws_edge(i2s_ws_edge),
114
      .i2s_ws_i(i2s_ws_i),
115
 
116
      .fifo_ack(fifo_ack),
117
 
118
      .fifo_ready(fifo_ready),
119
      .fifo_right_data(fifo_right_data),
120
      .fifo_left_data(fifo_left_data),
121
 
122
      .dma_rd_pointer_i( wbs_data_i ),
123
      .dma_rd_pointer_o( i2s_register_4 ),
124
 
125
      .dma_rd_pointer_we( i2s_register_4_we ),
126
      .dma_word_size( {9'h0, 3'b100} ),
127
      .dma_buffer_size( 12'h1BC ),
128
 
129
      .dma_overflow_error(),
130
 
131
      .i2s_clk_i(i2s_clk_i),
132
      .i2s_rst_i(i2s_rst_i)
133
    );
134
 
135
 
136
  //---------------------------------------------------
137
  // i2s clock domain
138
 
139
  i2s_to_wb_tx
140
    i_i2s_to_wb_tx
141
    (
142
      .fifo_right_data(fifo_right_data),
143
      .fifo_left_data(fifo_left_data),
144
      .fifo_ready(fifo_ready),
145
 
146
      .fifo_ack(fifo_ack),
147
 
148
      .i2s_ws_edge(i2s_ws_edge),
149
 
150
      .i2s_enable(i2s_register_0[0]),
151
      .i2s_sck_i(i2s_sck_i),
152
      .i2s_ws_i(i2s_ws_i),
153
      .i2s_sd_o(i2s_sd_o)
154
    );
155
 
156
 
157
  //---------------------------------------------------
158
  // assign outputs
159
 
160
  assign wbs_data_o = wbs_data_o_r;
161
  assign wbs_ack_o  = wbs_cyc_i & wbs_stb_i;
162
  assign wbs_err_o  = 1'b0;
163
  assign wbs_rty_o  = 1'b0;
164
 
165
 
166
endmodule

powered by: WebSVN 2.1.0

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