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_dma.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_dma
10
  #(
11
    parameter DMA_BUFFER_MAX_WIDTH = 12
12
  )
13
  (
14
    input   [31:0]  wbm_data_i,
15
    output  [31:0]  wbm_data_o,
16
    output  [31:0]  wbm_addr_o,
17
    output  [3:0]   wbm_sel_o,
18
    output          wbm_we_o,
19
    output          wbm_cyc_o,
20
    output          wbm_stb_o,
21
    input           wbm_ack_i,
22
    input           wbm_err_i,
23
    input           wbm_rty_i,
24
 
25
    input           i2s_enable,
26
 
27
    input           fifo_pop,
28
 
29
    output          fifo_empty,
30
 
31
    output  [31:0]  dma_rd_pointer_o,
32
    input   [31:0]  dma_rd_pointer_i,
33
 
34
    input           dma_rd_pointer_we,
35
 
36
    input   [(DMA_BUFFER_MAX_WIDTH - 1):0]  dma_word_size,
37
    input   [(DMA_BUFFER_MAX_WIDTH - 1):0]  dma_buffer_size,
38
 
39
    output          dma_overflow_error,
40
 
41
    input           i2s_clk_i,
42
    output          i2s_rst_i
43
  );
44
 
45
 
46
  //---------------------------------------------------
47
  // fifo
48
  wire        fifo_wr_enable;
49
  wire        fifo_full;
50
 
51
  sync_fifo #( .depth(4), .width(32) )
52
    i_fifo
53
    (
54
     .clk(i2s_clk_i),
55
     .reset(i2s_rst_i),
56
     .wr_enable(fifo_wr_enable),
57
     .rd_enable( fifo_pop ),
58
     .empty(fifo_empty),
59
     .full(fifo_full),
60
     .rd_data(wbm_data_o),
61
     .wr_data(wbm_data_i),
62
     .count()
63
     );
64
 
65
 
66
  //---------------------------------------------------
67
  // 
68
  wire dma_fsm_error;
69
 
70
  i2s_to_wb_dma_fsm
71
    i_i2s_to_wb_dma_fsm
72
    (
73
      .dma_enable(i2s_enable),
74
      .dma_ack_i(wbm_ack_i),
75
 
76
      .fifo_empty(fifo_empty),
77
      .fifo_full(fifo_full),
78
 
79
      .fifo_wr_enable(fifo_wr_enable),
80
      .dma_fsm_error(dma_fsm_error),
81
 
82
      .dma_clk_i(i2s_clk_i),
83
      .dma_rst_i(i2s_rst_i)
84
    );
85
 
86
 
87
  //---------------------------------------------------
88
  // 
89
  reg  [31:0]  dma_buffer_base_r;
90
  wire [31:DMA_BUFFER_MAX_WIDTH] dma_buffer_base_w = dma_buffer_base_r[31:DMA_BUFFER_MAX_WIDTH];
91
 
92
  always @(posedge i2s_clk_i)
93
    if( i2s_rst_i )
94
      dma_buffer_base_r <= 0;
95
    else if( dma_rd_pointer_we )
96
      dma_buffer_base_r <= dma_rd_pointer_i;
97
 
98
 
99
  //---------------------------------------------------
100
  // 
101
  reg  [DMA_BUFFER_MAX_WIDTH:0]  dma_rd_pointer_o_r;
102
 
103
  wire [(DMA_BUFFER_MAX_WIDTH - 1):0] dma_middle = dma_buffer_base_r[(DMA_BUFFER_MAX_WIDTH - 1):0] + {1'b0, dma_buffer_size[(DMA_BUFFER_MAX_WIDTH - 1):1]};
104
  wire [(DMA_BUFFER_MAX_WIDTH - 1):0] dma_bottom = dma_buffer_base_r[(DMA_BUFFER_MAX_WIDTH - 1):0] + dma_buffer_size - dma_word_size - 1;
105
 
106
  always @(posedge i2s_clk_i)
107
    if( dma_rd_pointer_we )
108
      dma_rd_pointer_o_r <= {1'b0, dma_buffer_base_r[(DMA_BUFFER_MAX_WIDTH - 1):0]};
109
    else if( dma_rd_pointer_o_r > dma_bottom )
110
      dma_rd_pointer_o_r <= {1'b0, dma_buffer_base_r[(DMA_BUFFER_MAX_WIDTH - 1):0]};
111
    else if(fifo_wr_enable)
112
      dma_rd_pointer_o_r <= dma_rd_pointer_o_r + dma_word_size;
113
 
114
 
115
  //---------------------------------------------------
116
  // assign outputs
117
 
118
  assign dma_rd_pointer_o    = {dma_buffer_base_w, dma_rd_pointer_o_r[(DMA_BUFFER_MAX_WIDTH - 1):0]};
119
  assign dma_overflow_error  = dma_rd_pointer_o_r[DMA_BUFFER_MAX_WIDTH];
120
 
121
  assign wbm_addr_o = {dma_buffer_base_w, dma_rd_pointer_o_r[(DMA_BUFFER_MAX_WIDTH - 1):0]};
122
  assign wbm_sel_o  = 4'b1111;
123
  assign wbm_we_o   = 1'b0;
124
  assign wbm_cyc_o  = fifo_wr_enable;
125
  assign wbm_stb_o  = fifo_wr_enable;
126
 
127
endmodule
128
 
129
 

powered by: WebSVN 2.1.0

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