Subversion Repositories pentevo

Rev

Rev 200 | Rev 467 | 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. // (c) 2010 NedoPC
  3.  
  4. `include "../include/tune.v"
  5.  
  6.  
  7. `define HALF_CLK_PERIOD (17.8)
  8.  
  9. `define ZCLK_DELAY      (9.5)
  10.  
  11. // toshibo
  12. //`define Z80_DELAY_DOWN  (17.0)
  13. //`define Z80_DELAY_UP    (22.0)
  14.  
  15. // z0840008
  16. `define Z80_DELAY_DOWN   34
  17. `define Z80_DELAY_UP     30
  18.  
  19. module tb;
  20.  
  21.         reg fclk;
  22.  
  23.         wire clkz_out,clkz_in;
  24.  
  25.         reg iorq_n,mreq_n,rd_n,wr_n; // has some delays relative to z*_n (below)
  26.         reg m1_n,rfsh_n;             //
  27.  
  28.         wire int_n,res;                    //
  29.         tri1 ziorq_n,zmreq_n,zrd_n,zwr_n,zm1_n,zrfsh_n; // connected to Z80
  30.  
  31.         tri1 wait_n,nmi_n;
  32.         wire zwait_n,znmi_n;
  33.  
  34.         wire [15:0] za;
  35.         wire [7:0] zd;
  36.  
  37.  
  38.         wire csrom, romoe_n, romwe_n;
  39.         wire rompg0_n, dos_n;
  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.         assign zwait_n = (wait_n==1'b0) ? 1'b0 : 1'b1;
  51.         assign znmi_n = (nmi_n==1'b0) ? 1'b0 : 1'b1;
  52.  
  53.  
  54.  
  55.         initial
  56.         begin
  57.  
  58.                 fclk = 1'b0;
  59.  
  60.                 forever #`HALF_CLK_PERIOD fclk = ~fclk;
  61.         end
  62.  
  63.  
  64.         assign #`ZCLK_DELAY clkz_in = ~clkz_out;
  65.  
  66.  
  67.  
  68.  
  69.  
  70.  
  71.  
  72.         top DUT( .fclk(fclk),
  73.                  .clkz_out(clkz_out),
  74.                  .clkz_in(clkz_in),
  75.  
  76.                // z80
  77.                  .iorq_n(iorq_n),
  78.                  .mreq_n(mreq_n),
  79.                  .rd_n(rd_n),
  80.                  .wr_n(wr_n),
  81.                  .m1_n(m1_n),
  82.                  .rfsh_n(rfsh_n),
  83.                  .int_n(int_n),
  84.                  .nmi_n(nmi_n),
  85.                  .wait_n(wait_n),
  86.                  .res(res),
  87.                  //
  88.                  .d(zd),
  89.                  .a(za),
  90.  
  91.                  // ROM
  92.                  .csrom(csrom),
  93.                  .romoe_n(romoe_n),
  94.                  .romwe_n(romwe_n),
  95.                  .rompg0_n(rompg0_n),
  96.                  .dos_n(dos_n),
  97.  
  98.                  // DRAM
  99.                  .rd(rd),
  100.                  .ra(ra),
  101.                  .rwe_n(rwe_n),
  102.                  .rucas_n(rucas_n),
  103.                  .rlcas_n(rlcas_n),
  104.                  .rras0_n(rras0_n),
  105.                  .rras1_n(rras1_n),
  106.  
  107.                  // ZX-bus
  108.                  .iorqge1(1'b0),
  109.                  .iorqge2(1'b0),
  110.  
  111.                  // IDE
  112.                  .ide_d(ide_d),
  113.                  .ide_rdy(1'b1),
  114.  
  115.                  // VG93
  116.                  .step(1'b0),
  117.                  .vg_sl(1'b0),
  118.                  .vg_sr(1'b0),
  119.                  .vg_tr43(1'b0),
  120.                  .rdat_b_n(1'b1),
  121.                  .vg_wf_de(1'b0),
  122.                  .vg_drq(1'b1),
  123.                  .vg_irq(1'b1),
  124.                  .vg_wd(1'b0),
  125.  
  126.                  // SDcard SPI
  127.                  .sddi(1'b1),
  128.  
  129.                  // ATmega SPI
  130.                  .spics_n(1'b1),
  131.                  .spick(1'b0),
  132.                  .spido(1'b1)
  133.  
  134.                );
  135.  
  136.  
  137.         wire zrst_n = ~res;
  138.  
  139.         T80a z80( .RESET_n(zrst_n),
  140.                   .CLK_n(clkz_in),
  141.                   .WAIT_n(zwait_n),
  142.                   .INT_n(int_n),
  143.                   .NMI_n(znmi_n),
  144.                   .M1_n(zm1_n),
  145.                   .RFSH_n(zrfsh_n),
  146.                   .MREQ_n(zmreq_n),
  147.                   .IORQ_n(ziorq_n),
  148.                   .RD_n(zrd_n),
  149.                   .WR_n(zwr_n),
  150.                   .BUSRQ_n(1'b1),
  151.                   .A(za),
  152.                   .D(zd)
  153.                 );
  154.  
  155.         // now make delayed versions of signals
  156.         //
  157.         reg  mreq_wr_n;
  158.         wire iorq_wr_n, full_wr_n;
  159.         //
  160.         // first, assure there is no X's at the start
  161.         //
  162.         initial
  163.         begin
  164.                 m1_n      = 1'b1;
  165.                 rfsh_n    = 1'b1;
  166.                 mreq_n    = 1'b1;
  167.                 iorq_n    = 1'b1;
  168.                 rd_n      = 1'b1;
  169.                 wr_n      = 1'b1;
  170.                 mreq_wr_n = 1'b1;
  171.         end
  172.         //
  173.         always @(zm1_n)
  174.                 if( zm1_n )
  175.                         m1_n <= #`Z80_DELAY_UP zm1_n;
  176.                 else
  177.                         m1_n <= #`Z80_DELAY_DOWN zm1_n;
  178.         //
  179.         always @(zrfsh_n)
  180.                 if( zrfsh_n )
  181.                         rfsh_n <= #`Z80_DELAY_UP zrfsh_n;
  182.                 else
  183.                         rfsh_n <= #`Z80_DELAY_DOWN zrfsh_n;
  184.         //
  185.         always @(zmreq_n)
  186.                 if( zmreq_n )
  187.                         mreq_n <= #`Z80_DELAY_UP zmreq_n;
  188.                 else
  189.                         mreq_n <= #`Z80_DELAY_DOWN zmreq_n;
  190.         //
  191.         always @(ziorq_n)
  192.                 if( ziorq_n )
  193.                         iorq_n <= #`Z80_DELAY_UP ziorq_n;
  194.                 else
  195.                         iorq_n <= #`Z80_DELAY_DOWN ziorq_n;
  196.         //
  197.         always @(zrd_n)
  198.                 if( zrd_n )
  199.                         rd_n <= #`Z80_DELAY_UP zrd_n;
  200.                 else
  201.                         rd_n <= #`Z80_DELAY_DOWN zrd_n;
  202.         //
  203.         //
  204.         // special handling for broken T80 WR_n
  205.         //     
  206.         always @(negedge clkz_in)
  207.                 mreq_wr_n <= zwr_n;
  208.         //
  209.         assign iorq_wr_n = ziorq_n | (~zrd_n) | (~zm1_n);
  210.         //
  211.         assign full_wr_n = mreq_wr_n & iorq_wr_n;
  212.         //
  213.         // this way glitches won't affect state of wr_n
  214.         always @(full_wr_n)
  215.                 if( !full_wr_n )
  216.                         #`Z80_DELAY_DOWN wr_n <= full_wr_n;
  217.                 else
  218.                         #`Z80_DELAY_UP wr_n <= full_wr_n;
  219.  
  220.  
  221.  
  222.  
  223.  
  224.         // ROM model
  225.         rom romko(
  226.                    .addr( {dos_n, (~rompg0_n), za[13:0]} ),
  227.                    .data(zd),
  228.                    .ce_n( romoe_n | (~csrom) )
  229.                  );
  230.  
  231.         // DRAM model
  232.         drammem dramko1(
  233.                          .ma(ra),
  234.                          .d(rd),
  235.                          .ras_n(rras0_n),
  236.                          .ucas_n(rucas_n),
  237.                          .lcas_n(rlcas_n),
  238.                          .we_n(rwe_n)
  239.                        );
  240.         //
  241.         drammem dramko2(
  242.                          .ma(ra),
  243.                          .d(rd),
  244.                          .ras_n(rras1_n),
  245.                          .ucas_n(rucas_n),
  246.                          .lcas_n(rlcas_n),
  247.                          .we_n(rwe_n)
  248.                        );
  249.         defparam dramko1._verbose_ = 0;
  250.         defparam dramko2._verbose_ = 0;
  251.  
  252.  
  253.  
  254. `ifndef GATE
  255.  
  256.         // trace rom page
  257.         wire rma14,rma15;
  258.  
  259.         assign rma14 = DUT.page[0][0];
  260.         assign rma15 = DUT.page[0][1];
  261.  
  262.  
  263.         always @(rma14 or rma15)
  264.         begin
  265.                 $display("at time %t us",$time/10000);
  266.  
  267.                 case( {rma15, rma14} )
  268.  
  269.                 2'b00: $display("BASIC 48");
  270.                 2'b01: $display("TR-DOS");
  271.                 2'b10: $display("BASIC 128");
  272.                 2'b11: $display("GLUKROM");
  273.                 default: $display("unknown");
  274.  
  275.                 endcase
  276.  
  277.                 $display("");
  278.         end
  279.  
  280.  
  281.         // trace ram page
  282.         wire [5:0] rpag;
  283.  
  284.         assign rpag=DUT.page[3][5:0];
  285.  
  286.         always @(rpag)
  287.         begin
  288.                 $display("at time %t us",$time/10000);
  289.  
  290.                 $display("RAM page is %d",rpag);
  291.  
  292.                 $display("");
  293.         end
  294.  
  295.  
  296.  
  297.         // emulate key presses
  298.         initial
  299.         begin
  300.                 tb.DUT.zkbdmus.kbd = 40'd0;
  301.                
  302.                 #600000000;
  303.  
  304.                 @(negedge int_n);
  305.  
  306.                 tb.DUT.zkbdmus.kbd[13] = 1'b1;
  307.  
  308.                 @(negedge int_n);
  309.                 @(negedge int_n);
  310.  
  311.                 tb.DUT.zkbdmus.kbd[13] = 1'b0;
  312.                
  313. //              $stop;
  314.         end
  315.  
  316.  
  317.  
  318. `endif
  319.  
  320.  
  321.         // time ticks
  322.         always
  323.         begin : timemark
  324.  
  325.                 integer ms;
  326.  
  327.                 ms = ($time/1000000);
  328.  
  329.                 $display("timemark %d ms",ms);
  330.  
  331.                 #10000000.0; // 1 ms
  332.         end
  333.  
  334.  
  335.  
  336.  
  337.  
  338.  
  339.  
  340.  
  341.  
  342. endmodule
  343.  
  344.  
  345.