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_tx.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_tx
10
  (
11
    input   [31:0]  fifo_right_data,
12
    input   [31:0]  fifo_left_data,
13
    input           fifo_ready,
14
 
15
    output reg      fifo_ack,
16
 
17
    output          i2s_ws_edge,
18
 
19
    input           i2s_enable,
20
    input           i2s_sck_i,
21
    input           i2s_ws_i,
22
    output          i2s_sd_o
23
  );
24
 
25
  //---------------------------------------------------
26
  // fifo_ready edge detection
27
  reg [2:0] fifo_ready_r;
28
  wire      fifo_ready_s = fifo_ready_r[1];
29
 
30
  always @(posedge i2s_sck_i)
31
    fifo_ready_r <= {fifo_ready_r[1:0], fifo_ready};
32
 
33
  wire fifo_ready_rise_edge = (fifo_ready_r[1] ^ fifo_ready_r[2]) & fifo_ready_r[1];
34
 
35
 
36
  //---------------------------------------------------
37
  // i2s_ws_i edge detection
38
  reg [1:0] i2s_ws_i_r;
39
 
40
  always @(posedge i2s_sck_i)
41
    i2s_ws_i_r <= {i2s_ws_i_r[0], i2s_ws_i};
42
 
43
  wire i2s_ws_rise_edge;
44
  wire i2s_ws_fall_edge;
45
 
46
  assign i2s_ws_rise_edge = (i2s_ws_i_r[0] ^ i2s_ws_i_r[1]) & i2s_ws_i_r[0];  // right
47
  assign i2s_ws_fall_edge = (i2s_ws_i_r[0] ^ i2s_ws_i_r[1]) & ~i2s_ws_i_r[0]; // left
48
 
49
 
50
  //---------------------------------------------------
51
  //  data out shift reg
52
  reg  [31:0] sd_r;
53
  wire [31:0] sd_w = i2s_ws_i ? fifo_right_data : fifo_left_data;
54
 
55
  always @(negedge i2s_sck_i)
56
    if( i2s_ws_edge )
57
      sd_r <= sd_w;
58
    else
59
      sd_r <= {sd_r[30:0], 1'b0};
60
 
61
  //---------------------------------------------------
62
  // ack flop
63
  always @(posedge i2s_sck_i)
64
    if( fifo_ready_s & i2s_ws_edge )
65
      fifo_ack <= 1'b1;
66
    else if( ~fifo_ready_s )
67
      fifo_ack <= 1'b0;
68
 
69
 
70
  //---------------------------------------------------
71
  // assign outputs
72
 
73
  assign i2s_sd_o     = sd_r[31];
74
  assign i2s_ws_edge  = i2s_ws_rise_edge | i2s_ws_fall_edge;
75
 
76
endmodule
77
 
78
 
79
 

powered by: WebSVN 2.1.0

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