Subversion Repositories pentevo

Rev

Blame | Last modification | View Log | Download | RSS feed | ?url?

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