Subversion Repositories ngs

Rev

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

  1. // modelling dma_sequencer.v together with dma_access.v
  2.  
  3. module tb_dma2;
  4.  
  5.  
  6.    parameter DEVNUM = 4;
  7.  
  8.  
  9.    integer i,j,k;
  10.  
  11.  
  12.    tri1 iorq_n,mreq_n,rd_n,wr_n;
  13.    reg clk,rst_n;
  14.    wire busrq_n,busak_n;
  15.    trireg [15:0] zaddr;
  16.    tri  [7:0] zdata;
  17.  
  18.  
  19.    wire dma_req,dma_rnw;
  20.    wire dma_ack,dma_end;
  21.    wire dma_busynready;
  22.  
  23.    wire [20:0] dma_addr;
  24.    wire  [7:0] dma_wd;
  25.    wire  [7:0] dma_rd;
  26.  
  27.    reg  [DEVNUM:1] req;
  28.    reg  [DEVNUM:1] rnw;
  29.    wire [DEVNUM:1] done;
  30.    wire [DEVNUM:1] ack;
  31.  
  32.    reg [20:0] addr[1:DEVNUM];
  33.    reg  [7:0]   wd[1:DEVNUM];
  34.    reg  [7:0]   rd;
  35.  
  36.  
  37.  
  38.    wire mem_dma_bus;
  39.    wire [15:0] mem_dma_addr;
  40.    wire [7:0] mem_dma_wd;
  41.    wire [7:0] mem_dma_rd;
  42.    wire mem_dma_rnw;
  43.    wire mem_dma_oe;
  44.    wire mem_dma_we;
  45.  
  46.  
  47.  
  48.    T80a z80( .RESET_n(rst_n),
  49.              .CLK_n(clk),
  50.              .WAIT_n(1'b1),
  51.              .INT_n(1'b1),
  52.              .NMI_n(1'b1),
  53.              .MREQ_n(mreq_n),
  54.              .IORQ_n(iorq_n),
  55.              .RD_n(rd_n),
  56.              .WR_n(wr_n),
  57.              .BUSRQ_n(busrq_n),
  58.              .BUSAK_n(busak_n),
  59.              .A(zaddr),
  60.              .D(zdata) );
  61.  
  62.  
  63.  
  64.    rom myrom( .addr(zaddr),
  65.               .data(zdata),
  66.               .ce_n( (zaddr<16'h8000)?(mreq_n|rd_n):1'b1 ) );
  67.  
  68.  
  69.    assign zaddr = mem_dma_bus ? mem_dma_addr[15:0] : 16'hZZZZ;
  70.  
  71.    assign zdata = (mem_dma_bus&(!mem_dma_rnw)) ? mem_dma_wd : 8'hZZ;
  72.    assign mem_dma_rd = zdata;
  73.  
  74.    ram myram( .addr(zaddr),
  75.               .data(zdata),
  76.               .ce_n( (zaddr>=16'h8000)?1'b0:1'b1 ),
  77.               .oe_n( mem_dma_bus ? mem_dma_oe : (mreq_n|rd_n) ),
  78.               .we_n( mem_dma_bus ? mem_dma_we : (mreq_n|wr_n) ) );
  79.  
  80.  
  81.    dma_sequencer myseq( .clk(clk),
  82.                         .rst_n(rst_n),
  83.  
  84.                         .addr(addr),
  85.                         .wd(wd),
  86.                         .rd(rd),
  87.                         .req(req),
  88.                         .rnw(rnw),
  89.                         .ack(ack),
  90.                         .done(done),
  91.  
  92.                         .dma_req(dma_req),
  93.                         .dma_rnw(dma_rnw),
  94.                         .dma_ack(dma_ack),
  95.                         .dma_end(dma_end),
  96.                         .dma_addr(dma_addr),
  97.                         .dma_wd(dma_wd),
  98.                         .dma_rd(dma_rd) );
  99.  
  100.  
  101.    dma_access mydma( .dma_req(dma_req),
  102.                      .dma_rnw(dma_rnw),
  103.                      .dma_ack(dma_ack),
  104.                      .dma_end(dma_end),
  105.                      .dma_addr(dma_addr),
  106.                      .dma_wd(dma_wd),
  107.                      .dma_busynready(dma_busynready),
  108.  
  109.                      .mem_dma_rd(zdata),
  110.                      .mem_dma_wd(mem_dma_wd),
  111.                      .mem_dma_bus(mem_dma_bus),
  112.                      .mem_dma_addr(mem_dma_addr),
  113.                      .mem_dma_rnw(mem_dma_rnw),
  114.                      .mem_dma_oe(mem_dma_oe),
  115.                      .mem_dma_we(mem_dma_we),
  116.  
  117.                      .clk(clk),
  118.                      .rst_n(rst_n),
  119.                      .busrq_n(busrq_n),
  120.                      .busak_n(busak_n) );
  121.  
  122.  
  123.  
  124.         reg start  [1:DEVNUM];
  125.         reg rnw_in [1:DEVNUM];
  126.         wire inprogress [1:DEVNUM];
  127.  
  128.  
  129.  
  130.         generate
  131.                 genvar gv;
  132.                 for(gv=1;gv<=DEVNUM;gv=gv+1)
  133.                 begin : dmaers
  134.                         dmaer g( .clk(clk), .rst_n(rst_n),
  135.                                  .start(start[gv]),
  136.                                  .rnw_in(rnw_in[gv]),
  137.                                  .inprogress(inprogress[gv]),
  138.                                  .req(req[gv]),
  139.                                  .rnw(rnw[gv]),
  140.                                  .ack(ack[gv]),
  141.                                  .done(done[gv]) );
  142.                 end
  143.         endgenerate
  144.  
  145.  
  146.  
  147.  
  148.         initial
  149.         begin
  150.                 clk <= 1'b0;
  151.             forever #40 clk <= ~clk;
  152.         end
  153.  
  154.  
  155.         initial
  156.         begin
  157.                 rst_n <= 1'b0;
  158.  
  159.                 for(i=1;i<=DEVNUM;i=i+1)
  160.                 begin
  161.                         start[i] <= 1'b0;
  162.                         rnw_in[i] <= 1'b1;
  163.                 end
  164.  
  165.  
  166.                 @(posedge clk);
  167.                 @(posedge clk);
  168.                 @(posedge clk);
  169.                 rst_n <= 1'b1;
  170.                 @(posedge clk);
  171.  
  172.  
  173.  
  174.  
  175. /*              start[1] <= 1'b1;
  176.                 @(posedge ack[1]);
  177.                 start[1] <= 1'b0;
  178.  
  179.                 @(negedge inprogress[1]);
  180. */
  181.                 repeat (5) @(posedge clk);
  182.  
  183.  
  184.  
  185.                 rnw_in[1] = 1'b1;
  186.                 rnw_in[2] = 1'b0;
  187.                 start[1] = 1'b1;
  188.                 start[2] = 1'b1;
  189.  
  190.                 fork
  191.                 begin
  192.                         @(posedge ack[1]);
  193.                         start[1] <= 1'b0;
  194.                 end
  195.                 begin
  196.                         @(posedge ack[2]);
  197.                         start[2] <= 1'b0;
  198.                 end
  199.                 join
  200.  
  201.  
  202. //              $stop;
  203.  
  204.  
  205.  
  206.         end
  207.  
  208.  
  209.  
  210.  
  211. endmodule
  212.  
  213.  
  214.  
  215.  
  216. module dmaer(
  217.  
  218.         input clk,
  219.         input rst_n,
  220.  
  221.         input start,
  222.         input rnw_in,
  223.  
  224.         output reg inprogress,
  225.  
  226.         output reg req,
  227.         output reg rnw,
  228.         input      ack,
  229.         input      done
  230. );
  231.  
  232.  
  233.         initial
  234.         begin
  235.                 inprogress = 1'b0;
  236.                 req        = 1'b0;
  237.                 rnw        = 1'b1;
  238.         end
  239.  
  240.  
  241.         always @(negedge rst_n)
  242.         begin
  243.                 disable main_loop;
  244.  
  245.                 req <= 1'b0;
  246.                 rnw <= 1'b1;
  247.                 inprogress <= 1'b0;
  248.         end
  249.  
  250.  
  251.         always
  252.         begin : main_loop
  253.  
  254.                 wait(rst_n);
  255.  
  256.                 wait(start);
  257.  
  258.               begin : dma_loop
  259.                         forever
  260.                         begin
  261.                                 inprogress <= 1'b1;
  262.                                 rnw <= rnw_in;
  263.                                 req <= 1'b1;
  264.  
  265.                                 @(negedge ack);
  266.                                 if( !start ) disable dma_loop;
  267.                         end
  268.                 end
  269.  
  270.                 req <= 1'b0;
  271.                 wait(done);/*@(posedge done);*/
  272.                 inprogress <= 1'b0;
  273.         end
  274.  
  275.  
  276.  
  277. endmodule
  278.  
  279.