Subversion Repositories ngs

Rev

Rev 97 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
63 lvd 1
// part of NeoGS project
2
//
97 lvd 3
// (c) NedoPC 2007-2013
63 lvd 4
//
5
// this is dma "one-shot" fifo: after each 512 bytes both written and read back, it must be initialized by means of 'init'
6
//
7
 
8
module dma_fifo_oneshot(
9
 
10
        input  wire clk,
11
        input  wire rst_n,
12
 
13
        input  wire wr_stb, // write strobe: writes data from wd to the current wptr, increments wptr
14
        input  wire rd_stb, // read strobe: increments rptr
15
 
16
        output wire wdone, // write done - all 512 bytes are written (end of write operation)
98 lvd 17
        output wire w511,  // write almost done -- at address 511
63 lvd 18
        output wire rdone, // read done - all 512 bytes are read (end of read operation)
19
        output wire empty, // fifo empty: when wptr==rptr (rd_stb must not be issued when empty is active, otherwise everytrhing desyncs)
20
 
21
        input  wire [7:0] wd, // data to be written
22
        output wire [7:0] rd  // data just read from rptr address
23
);
24
 
25
        reg [9:0] wptr;
26
        reg [9:0] rptr;
27
 
28
        always @(posedge clk, negedge rst_n)
97 lvd 29
        if( !rst_n )
30
                wptr = 10'd0;
31
        else if( wr_stb )
32
                wptr <= wptr + 10'd1;
98 lvd 33
 
34
        assign w511 = &wptr[8:0];
35
 
97 lvd 36
        always @(posedge clk, negedge rst_n)
37
        if( !rst_n )
38
                rptr = 10'd0;
39
        else if( rd_stb )
40
                rptr <= rptr + 10'd1;
63 lvd 41
 
42
        assign wdone = wptr[9];
43
        assign rdone = rptr[9];
44
        assign empty = ( wptr==rptr );
45
 
46
 
47
 
98 lvd 48
        mem512b fifo512_oneshot_mem512b
49
        (
50
                .clk(clk),
63 lvd 51
 
98 lvd 52
                .rdaddr(rptr[8:0]),
53
                .dataout(rd),
54
                .re(rd_stb),
63 lvd 55
 
98 lvd 56
                .wraddr(wptr[8:0]),
57
                .datain(wd),
58
                .we(wr_stb)
59
        );
60
 
61
 
63 lvd 62
endmodule
63