Subversion Repositories pentevo

Rev

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

  1. // simulate fpga top-level with external dram, rom, z80
  2.  
  3. `include "../include/tune.v"
  4.  
  5. `define HALF_CLK_PERIOD (17.8)
  6. `define ZCLK_DELAY      (9.4)
  7. `define Z80_DELAY_DOWN  (17.0)
  8. `define Z80_DELAY_UP    (22.0)
  9.  
  10. module tb;
  11.  
  12.         reg fclk;
  13.  
  14.         wire clkz_out,clkz_in;
  15.  
  16.         reg iorq_n,mreq_n,rd_n,wr_n; // has some delays relative to z*_n (below)
  17.         reg m1_n,rfsh_n;             //
  18.  
  19.         tri1 int_n,nmi_n,wait_n,res;                    //
  20.         tri1 ziorq_n,zmreq_n,zrd_n,zwr_n,zm1_n,zrfsh_n; // connected to Z80
  21.  
  22.  
  23.         wire [15:0] za;
  24.         wire [7:0] zd;
  25.  
  26.  
  27.         wire csrom, romoe_n, romwe_n;
  28.  
  29.  
  30.         wire [15:0] rd;
  31.         wire [9:0] ra;
  32.         wire rwe_n,rucas_n,rlcas_n,rras0_n,rras1_n;
  33.  
  34.  
  35.         tri1 [15:0] ide_d;
  36.  
  37.  
  38.  
  39.         initial
  40.         begin
  41.  
  42.                 fclk = 1'b0;
  43.  
  44.                 forever #`HALF_CLK_PERIOD fclk = ~fclk;
  45.         end
  46.  
  47.  
  48.         assign #`ZCLK_DELAY clkz_in = ~clkz_out; // 9.4ns
  49.  
  50.  
  51.  
  52.  
  53.  
  54.  
  55.  
  56.         top DUT( .fclk(fclk),
  57.                  .clkz_out(clkz_out),
  58.                  .clkz_in(clkz_in),
  59.  
  60.                // z80
  61.                  .iorq_n(iorq_n),
  62.                  .mreq_n(mreq_n),
  63.                  .rd_n(rd_n),
  64.                  .wr_n(wr_n),
  65.                  .m1_n(m1_n),
  66.                  .rfsh_n(rfsh_n),
  67.                  .int_n(int_n),
  68.                  .nmi_n(nmi_n),
  69.                  .wait_n(wait_n),
  70.                  .res(res),
  71.                  //
  72.                  .d(zd),
  73.                  .a(za),
  74.  
  75.                  // ROM
  76.                  .csrom(csrom),
  77.                  .romoe_n(romoe_n),
  78.                  .romwe_n(romwe_n),
  79.  
  80.                  // DRAM
  81.                  .rd(rd),
  82.                  .ra(ra),
  83.                  .rwe_n(rwe_n),
  84.                  .rucas_n(rucas_n),
  85.                  .rlcas_n(rlcas_n),
  86.                  .rras0_n(rras0_n),
  87.                  .rras1_n(rras1_n),
  88.  
  89.                  // ZX-bus
  90.                  .iorqge1(1'b0),
  91.                  .iorqge2(1'b0),
  92.  
  93.                  // IDE
  94.                  .ide_d(ide_d),
  95.                  .ide_rdy(1'b1),
  96.  
  97.                  // VG93
  98.                  .step(1'b0),
  99.                  .vg_sl(1'b0),
  100.                  .vg_sr(1'b0),
  101.                  .vg_tr43(1'b0),
  102.                  .rdat_b_n(1'b1),
  103.                  .vg_wf_de(1'b0),
  104.                  .vg_drq(1'b1),
  105.                  .vg_irq(1'b1),
  106.                  .vg_wd(1'b0),
  107.  
  108.                  // SDcard SPI
  109.                  .sddi(1'b1),
  110.  
  111.                  // ATmega SPI
  112.                  .spics_n(1'b1),
  113.                  .spick(1'b0),
  114.                  .spido(1'b1)
  115.  
  116.                );
  117.  
  118.  
  119.         wire zrst_n = ~res;
  120.  
  121.         T80a z80( .RESET_n(zrst_n),
  122.                   .CLK_n(clkz_in),
  123.                   .WAIT_n(wait_n),
  124.                   .INT_n(int_n),
  125.                   .NMI_n(nmi_n),
  126.                   .M1_n(zm1_n),
  127.                   .RFSH_n(zrfsh_n),
  128.                   .MREQ_n(zmreq_n),
  129.                   .IORQ_n(ziorq_n),
  130.                   .RD_n(zrd_n),
  131.                   .WR_n(zwr_n),
  132.                   .BUSRQ_n(1'b1),
  133.                   .A(za),
  134.                   .D(zd)
  135.                 );
  136.  
  137.         // now make delayed versions of signals
  138.         //
  139.         always @(zm1_n)
  140.                 if( zm1_n )
  141.                         m1_n <= #`Z80_DELAY_UP zm1_n;
  142.                 else
  143.                         m1_n <= #`Z80_DELAY_DOWN zm1_n;
  144.         //
  145.         always @(zrfsh_n)
  146.                 if( zrfsh_n )
  147.                         rfsh_n <= #`Z80_DELAY_UP zrfsh_n;
  148.                 else
  149.                         rfsh_n <= #`Z80_DELAY_DOWN zrfsh_n;
  150.         //
  151.         always @(zmreq_n)
  152.                 if( zmreq_n )
  153.                         mreq_n <= #`Z80_DELAY_UP zmreq_n;
  154.                 else
  155.                         mreq_n <= #`Z80_DELAY_DOWN zmreq_n;
  156.         //
  157.         always @(ziorq_n)
  158.                 if( ziorq_n )
  159.                         iorq_n <= #`Z80_DELAY_UP ziorq_n;
  160.                 else
  161.                         iorq_n <= #`Z80_DELAY_DOWN ziorq_n;
  162.         //
  163.         always @(zrd_n)
  164.                 if( zrd_n )
  165.                         rd_n <= #`Z80_DELAY_UP zrd_n;
  166.                 else
  167.                         rd_n <= #`Z80_DELAY_DOWN zrd_n;
  168.         //
  169.         // special handling for broken WR_n
  170.         always @(negedge clkz_in)
  171.                 if( zwr_n )
  172.                         wr_n <= #`Z80_DELAY_UP zwr_n;
  173.                 else
  174.                         wr_n <= #`Z80_DELAY_DOWN zwr_n;
  175.  
  176.  
  177.         // ROM model
  178.         rom romko(
  179.                    .addr( {dos_n, (~rompg0_n), za[13:0]} ),
  180.                    .data(zd),
  181.                    .ce_n( romoe_n | (~csrom) )
  182.                  );
  183.  
  184.         // DRAM model
  185.         drammem dramko1(
  186.                          .ma(ra),
  187.                          .d(rd),
  188.                          .ras_n(rras0_n),
  189.                          .ucas_n(rucas_n),
  190.                          .lcas_n(rlcas_n),
  191.                          .we_n(rwe_n)
  192.                        );
  193.         //
  194.         drammem dramko2(
  195.                          .ma(ra),
  196.                          .d(rd),
  197.                          .ras_n(rras1_n),
  198.                          .ucas_n(rucas_n),
  199.                          .lcas_n(rlcas_n),
  200.                          .we_n(rwe_n)
  201.                        );
  202.         defparam dramko1._verbose_ = 0;
  203.         defparam dramko2._verbose_ = 0;
  204.  
  205.  
  206.  
  207. endmodule
  208.  
  209.  
  210.