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