Subversion Repositories ngs

Rev

Rev 2 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed | ?url?

  1. // part of NeoGS project
  2. //
  3. // (c) NedoPC 2007-2008
  4. //
  5. // modelling is in tb_dma2.*
  6.  
  7. module dma_sequencer(
  8.  
  9.         clk,
  10.         rst_n,
  11.  
  12.         addr,
  13.         wd,
  14.  
  15.         rd,
  16.  
  17.         req,
  18.         rnw,
  19.         ack,
  20.         done,
  21.  
  22.         dma_req,
  23.         dma_addr,
  24.         dma_rnw,
  25.         dma_wd,
  26.         dma_rd,
  27.  
  28.         dma_ack,
  29.         dma_end
  30. );
  31.  
  32.         parameter DEVNUM = 4;
  33.  
  34.  
  35.         input clk;
  36.         input rst_n;
  37.  
  38.  
  39.         input       [20:0] addr [1:DEVNUM];
  40.         input        [7:0] wd   [1:DEVNUM];
  41.  
  42.         output reg   [7:0] rd;
  43.  
  44.         input              [DEVNUM:1] req;
  45.         input              [DEVNUM:1] rnw;
  46.  
  47.         output reg         dma_req;
  48.         output reg         dma_rnw;
  49.         output reg  [20:0] dma_addr;
  50.         output reg   [7:0] dma_wd;
  51.         input        [7:0] dma_rd;
  52.  
  53.         input              dma_ack;
  54.         input              dma_end;
  55.  
  56.  
  57.  
  58.         output reg [DEVNUM:1] ack;
  59.         output reg [DEVNUM:1] done;
  60.  
  61.         reg [DEVNUM:1] muxbeg;
  62.         reg [DEVNUM:1] muxend;
  63.         reg [DEVNUM:1] muxend_in;
  64.  
  65.         reg [DEVNUM:1] pri_in;
  66.         reg [DEVNUM:1] pri_out;
  67.  
  68.  
  69.  
  70.  
  71.  
  72.         integer i;
  73.  
  74.         always @*
  75.                 for(i=1;i<=DEVNUM;i=i+1)
  76.                 begin
  77.                         pri_in[i]  = (i==1) ? pri_out[DEVNUM] : pri_out[i-1];
  78.                         pri_out[i] = ( pri_in[i] & (~req[i]) ) | muxend[i];
  79.  
  80.                         muxbeg[i]    = pri_in[i] & req[i];
  81.                         muxend_in[i] = muxbeg[i] & dma_ack;
  82.                 end
  83.  
  84.         always @(posedge clk, negedge rst_n)
  85.         begin
  86.                 if( !rst_n )
  87.                 begin
  88.                         muxend[1] <= 1'b1;
  89.                         for(i=2;i<=DEVNUM;i=i+1)
  90.                                 muxend[i] <= 1'b0;
  91.                 end
  92.                 else if( dma_ack )
  93.                 begin
  94.                         for(i=1;i<=DEVNUM;i=i+1)
  95.                                 muxend[i] <= muxend_in[i];
  96.                 end
  97.         end
  98.  
  99.  
  100.  
  101.  
  102.  
  103.         always @*
  104.         begin
  105.                 rd = dma_rd;
  106.  
  107.                 dma_req = 1'b0;
  108.                 for(i=1;i<=DEVNUM;i=i+1)
  109.                         dma_req = dma_req | req[i];
  110.  
  111.                 dma_wd = 8'd0;
  112.                 for(i=1;i<=DEVNUM;i=i+1)
  113.                         dma_wd = dma_wd | ( (muxbeg[i]==1'b1) ? wd[i] : 8'd0 );
  114.  
  115.                 dma_addr = 21'd0;
  116.                 for(i=1;i<=DEVNUM;i=i+1)
  117.                         dma_addr = dma_addr | ( (muxbeg[i]==1'b1) ? addr[i] : 21'd0 );
  118.  
  119.                 dma_rnw = 1'b0;
  120.                 for(i=1;i<=DEVNUM;i=i+1)
  121.                         dma_rnw = dma_rnw | ( (muxbeg[i]==1'b1) ? rnw[i] : 1'b0 );
  122.  
  123.  
  124.                 for(i=1;i<=DEVNUM;i=i+1)
  125.                         ack[i] = (muxbeg[i]==1'b1) ? dma_ack : 1'b0;
  126.  
  127.                 for(i=1;i<=DEVNUM;i=i+1)
  128.                         done[i] = (muxend[i]==1'b1) ? dma_end : 1'b0;
  129.  
  130.         end
  131.  
  132.  
  133.  
  134.  
  135.  
  136. endmodule
  137.  
  138.