Subversion Repositories ngs

Rev

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

  1. // modelling dma_access.v in both burst and one-shot modes
  2.  
  3. module tb_dma1;
  4.  
  5.    integer i,j,k;
  6.  
  7.  
  8.    tri1 iorq_n,mreq_n,rd_n,wr_n;
  9.    reg clk,rst_n;
  10.    wire busrq_n,busak_n;
  11.    trireg [15:0] zaddr;
  12.    tri  [7:0] zdata;
  13.  
  14.  
  15.    reg dma_req, dma_rnw;
  16.    wire dma_busynready;
  17.    wire mem_dma_bus;
  18.    wire [15:0] mem_dma_addr;
  19.    wire [7:0] mem_dma_wd;
  20.    wire [7:0] mem_dma_rd;
  21.    wire mem_dma_rnw;
  22.    wire mem_dma_oe;
  23.    wire mem_dma_we;
  24.  
  25.    reg [7:0] wridat;
  26.  
  27.  
  28.    T80a z80( .RESET_n(rst_n),
  29.              .CLK_n(clk),
  30.              .WAIT_n(1'b1),
  31.              .INT_n(1'b1),
  32.              .NMI_n(1'b1),
  33.              .MREQ_n(mreq_n),
  34.              .IORQ_n(iorq_n),
  35.              .RD_n(rd_n),
  36.              .WR_n(wr_n),
  37.              .BUSRQ_n(busrq_n),
  38.              .BUSAK_n(busak_n),
  39.              .A(zaddr),
  40.              .D(zdata) );
  41.  
  42.  
  43.  
  44.    rom myrom( .addr(zaddr),
  45.               .data(zdata),
  46.               .ce_n( (zaddr<16'h8000)?(mreq_n|rd_n):1'b1 ) );
  47.  
  48.  
  49.    assign zaddr = mem_dma_bus ? mem_dma_addr[15:0] : 16'hZZZZ;
  50.  
  51.    assign zdata = (mem_dma_bus&(!mem_dma_rnw)) ? mem_dma_wd : 8'hZZ;
  52.    assign mem_dma_rd = zdata;
  53.  
  54.    ram myram( .addr(zaddr),
  55.               .data(zdata),
  56.               .ce_n( (zaddr>=16'h8000)?1'b0:1'b1 ),
  57.               .oe_n( mem_dma_bus ? mem_dma_oe : (mreq_n|rd_n) ),
  58.               .we_n( mem_dma_bus ? mem_dma_we : (mreq_n|wr_n) ) );
  59.  
  60.  
  61.    dma_access mydma( .dma_req(dma_req),
  62.                      .dma_rnw(dma_rnw),
  63.                      .dma_addr(21'h08001),
  64.                      .dma_wd(wridat),
  65.                      .mem_dma_rd(zdata),
  66.                      .mem_dma_wd(mem_dma_wd),
  67.                      .dma_busynready(dma_busynready),
  68.                      .mem_dma_bus(mem_dma_bus),
  69.                      .mem_dma_addr(mem_dma_addr),
  70.                      .mem_dma_rnw(mem_dma_rnw),
  71.                      .mem_dma_oe(mem_dma_oe),
  72.                      .mem_dma_we(mem_dma_we),
  73.                      .clk(clk),
  74.                      .rst_n(rst_n),
  75.                      .busrq_n(busrq_n),
  76.                      .busak_n(busak_n) );
  77.  
  78.  
  79.  
  80.  
  81.         initial
  82.         begin
  83.       wridat <= 8'hA5;
  84.                 clk = 1'b0;
  85.             forever #40 clk = ~clk;
  86.         end
  87.  
  88.         initial
  89.         begin
  90.                 rst_n <= 1'b0;
  91.                 @(posedge clk);
  92.                 @(posedge clk);
  93.                 @(posedge clk);
  94.                 rst_n <= 1'b1;
  95.         end
  96.  
  97.  
  98.         initial
  99.         begin
  100.                 dma_req <= 1'b0;
  101.                 dma_rnw <= 1'b1;
  102.  
  103.                 @(posedge rst_n);
  104.  
  105.  
  106.                 forever
  107.                 begin
  108.                         for(i=1;i<5;i=i+1) // one-shot dma requests
  109.                         begin
  110.                                 @(posedge clk);
  111.                                 @(posedge clk);
  112.                                 @(posedge clk);
  113.                                 @(posedge clk);
  114.                                 @(posedge clk);
  115.                                 @(posedge clk);
  116.                                 @(posedge clk);
  117.                                 dma_req <= 1'b1;
  118.                                 @(posedge dma_busynready);
  119.                                 @(posedge clk);
  120.                                 dma_req <= 1'b0;
  121.                                 dma_rnw <= ~dma_rnw;
  122.                                 @(negedge dma_busynready);
  123.             wridat <= wridat + 8'h01;
  124.                         end
  125.  
  126.  
  127.  
  128.                         @(posedge clk);
  129.                         dma_req <= 1'b1;
  130.                         for(i=1;i<10;i=i+1) // burst dma requests
  131.                         begin
  132.                                 @(negedge dma_busynready);
  133.             wridat <= wridat + 8'h01;
  134.                                 dma_rnw <= ~dma_rnw;
  135.                         end
  136.  
  137.                         dma_req <= 1'b0;
  138.                 end
  139.         end
  140.  
  141.  
  142.  
  143.  
  144. endmodule
  145.