Subversion Repositories ngs

Rev

Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. // part of NeoGS project
  2. //
  3. // (c) NedoPC 2007-2010
  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 init, // initializes fifo: wptr=rptr=0
  14.  
  15.         input  wire wr_stb, // write strobe: writes data from wd to the current wptr, increments wptr
  16.         input  wire rd_stb, // read strobe: increments rptr
  17.  
  18.         output wire wdone, // write done - all 512 bytes are written (end of write operation)
  19.         output wire rdone, // read done - all 512 bytes are read (end of read operation)
  20.         output wire empty, // fifo empty: when wptr==rptr (rd_stb must not be issued when empty is active, otherwise everytrhing desyncs)
  21.  
  22.         input  wire [7:0] wd, // data to be written
  23.         output wire [7:0] rd  // data just read from rptr address
  24. );
  25.  
  26.         reg [9:0] wptr;
  27.         reg [9:0] rptr;
  28.  
  29.         always @(posedge clk, negedge rst_n)
  30.         begin
  31.                 if( !rst_n )
  32.                 begin
  33.                         wptr = 10'd0;
  34.                         rptr = 10'd0;
  35.                 end
  36.                 else
  37.                 begin // posedge clk
  38.  
  39.                         if( init )
  40.                         begin
  41.                                 wptr <= 10'd0;
  42.                         end
  43.                         else if( wr_stb )
  44.                         begin
  45.                                 wptr <= wptr + 10'd1;
  46.                         end
  47.  
  48.  
  49.                         if( init )
  50.                         begin
  51.                                 rptr <= 10'd0;
  52.                         end
  53.                         else if( rd_stb )
  54.                         begin
  55.                                 rptr <= rptr + 10'd1;
  56.                         end
  57.  
  58.                 end
  59.         end
  60.  
  61.         assign wdone = wptr[9];
  62.         assign rdone = rptr[9];
  63.         assign empty = ( wptr==rptr );
  64.  
  65.  
  66.  
  67.         mem512b fifo512_oneshot_mem512b( .clk(clk),
  68.  
  69.                                          .rdaddr(rptr[8:0]),
  70.                                          .dataout(rd),
  71.  
  72.                                          .wraddr(wptr[8:0]),
  73.                                          .datain(wd),
  74.                                          .we(wr_stb)
  75.                                        );
  76. endmodule
  77.  
  78.