Subversion Repositories pentevo

Rev

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

  1. `include "../include/tune.v"
  2.  
  3. module top(
  4.  
  5.         // clocks
  6.         input fclk,
  7.         output clkz_out,
  8.         input clkz_in,
  9.  
  10.         // z80
  11.         input iorq_n,
  12.         input mreq_n,
  13.         input rd_n,
  14.         input wr_n,
  15.         input m1_n,
  16.         input rfsh_n,
  17.         output int_n,
  18.         output nmi_n,
  19.         output wait_n,
  20.         output res,
  21.  
  22.         inout [7:0] d,
  23.         input [15:0] a,
  24.  
  25.         // zxbus and related
  26.         output csrom,
  27.         output romoe_n,
  28.         output romwe_n,
  29.  
  30.         output rompg0_n,
  31.         output dos_n, // aka rompg1
  32.         output rompg2,
  33.         output rompg3,
  34.         output rompg4,
  35.  
  36.         input iorqge1,
  37.         input iorqge2,
  38.         output iorq1_n,
  39.         output iorq2_n,
  40.  
  41.         // DRAM
  42.         inout [15:0] rd,
  43.         output [9:0] ra,
  44.         output rwe_n,
  45.         output rucas_n,
  46.         output rlcas_n,
  47.         output rras0_n,
  48.         output rras1_n,
  49.  
  50.         // video
  51.         output [1:0] vred,
  52.         output [1:0] vgrn,
  53.         output [1:0] vblu,
  54.  
  55.         output vhsync,
  56.         output vvsync,
  57.         output vcsync,
  58.  
  59.         // AY control and audio/tape
  60.         output ay_clk,
  61.         output ay_bdir,
  62.         output ay_bc1,
  63.  
  64.         output beep,
  65.  
  66.         // IDE
  67.         output [2:0] ide_a,
  68.         inout [15:0] ide_d,
  69.  
  70.         output ide_dir,
  71.  
  72.         input ide_rdy,
  73.  
  74.         output ide_cs0_n,
  75.         output ide_cs1_n,
  76.         output ide_rs_n,
  77.         output ide_rd_n,
  78.         output ide_wr_n,
  79.  
  80.         // VG93 and diskdrive
  81.         output vg_clk,
  82.  
  83.         output vg_cs_n,
  84.         output vg_res_n,
  85.  
  86.         output vg_hrdy,
  87.         output vg_rclk,
  88.         output vg_rawr,
  89.         output [1:0] vg_a, // disk drive selection
  90.         output vg_wrd,
  91.         output vg_side,
  92.  
  93.         input step,
  94.         input vg_sl,
  95.         input vg_sr,
  96.         input vg_tr43,
  97.         input rdat_b_n,
  98.         input vg_wf_de,
  99.         input vg_drq,
  100.         input vg_irq,
  101.         input vg_wd,
  102.  
  103.         // serial links (atmega-fpga, sdcard)
  104.         output sdcs_n,
  105.         output sddo,
  106.         output sdclk,
  107.         input sddi,
  108.  
  109.         input spics_n,
  110.         input spick,
  111.         input spido,
  112.         output spidi,
  113.         output spiint_n
  114. );
  115.  
  116.         wire dos;
  117.  
  118.  
  119.         wire zclk; // z80 clock for short
  120.  
  121.         wire rst_n; // global reset
  122.  
  123.         wire rrdy;
  124.         wire cbeg;
  125.         wire [15:0] rddata;
  126.  
  127.         wire [4:0] rompg;
  128.  
  129.         wire [7:0] zports_dout;
  130.         wire zports_dataout;
  131.         wire porthit;
  132.  
  133.         wire [4:0] keys;
  134.         wire tape_in;
  135.  
  136.         wire [15:0] ideout;
  137.         wire [15:0] idein;
  138.         wire idedataout;
  139.  
  140.  
  141.         wire [7:0] zmem_dout;
  142.         wire zmem_dataout;
  143.  
  144.  
  145.  
  146.         reg [3:0] ayclk_gen;
  147.  
  148.  
  149.         wire [7:0] received;
  150.         wire [7:0] tobesent;
  151.  
  152.  
  153.         wire intrq,drq;
  154.         wire vg_wrFF;
  155.  
  156.         wire [1:0] rstrom;
  157.  
  158.  
  159.  
  160.  
  161.         assign zclk = clkz_in;
  162.  
  163.  
  164.         // RESETTER
  165.         wire genrst;
  166.  
  167.         resetter myrst( .clk(fclk),
  168.                         .rst_in_n(~genrst),
  169.                         .rst_out_n(rst_n) );
  170.         defparam myrst.RST_CNT_SIZE = 6;
  171.  
  172.  
  173.         assign nmi_n=1'bZ;
  174.         assign wait_n=1'bZ;
  175.         assign res= ~rst_n;
  176.  
  177.         assign spiint_n=1'b1;
  178.  
  179.  
  180.  
  181.  
  182.         assign ide_rs_n = rst_n;
  183.  
  184.         assign ide_d = idedataout ? ideout : 16'hZZZZ;
  185.         assign idein = ide_d;
  186.  
  187.         assign ide_dir = ~idedataout;
  188.  
  189.  
  190.  
  191.  
  192.  
  193.         wire [7:0] peff7;
  194.         wire [7:0] p7ffd;
  195.  
  196.  
  197.  
  198.         wire cpu_req,cpu_rnw,cpu_wrbsel,cpu_strobe;
  199.         wire [20:0] cpu_addr;
  200.         wire [15:0] cpu_rddata;
  201.         wire [7:0] cpu_wrdata;
  202.  
  203.  
  204.         wire cend,pre_cend,go;
  205.  
  206.  
  207.         wire sd_start;
  208.         wire [7:0] sd_dataout,sd_datain;
  209.  
  210.  
  211.  
  212. //AY control
  213.         always @(posedge fclk)
  214.         begin
  215.                 ayclk_gen <= ayclk_gen + 4'd1;
  216.         end
  217.  
  218.         assign ay_clk = ayclk_gen[3];
  219.  
  220.  
  221.  
  222.  
  223.  
  224.  
  225.  
  226.         assign rompg0_n = ~rompg[0];
  227.         assign dos_n    =  rompg[1];
  228.         assign rompg2   =  rompg[2];
  229.         assign rompg3   =  rompg[3];
  230.         assign rompg4   =  rompg[4];
  231.  
  232.         zclock z80clk( .fclk(fclk), .rst_n(rst_n), .zclk(zclk), .zclk_out(clkz_out),
  233.                        .turbo( {1'b0,~(peff7[4]|dos)} ), .pre_cend(pre_cend) );
  234.  
  235.  
  236.  
  237.         wire [7:0] dout_ram;
  238.         wire ena_ram;
  239.         wire [7:0] dout_ports;
  240.         wire ena_ports;
  241.  
  242.  
  243.         wire [2:0] border;
  244.  
  245.         wire drive_ff;
  246.  
  247.         // data bus out: either RAM data or internal ports data or 0xFF with unused ports
  248.         assign d = ena_ram ? dout_ram : ( ena_ports ? dout_ports : ( drive_ff ? 8'hFF : 8'bZZZZZZZZ ) );
  249.  
  250.  
  251.  
  252.  
  253.         zbus zxbus( .iorq_n(iorq_n), .rd_n(rd_n), .wr_n(wr_n), .m1_n(m1_n),
  254.                     .iorq1_n(iorq1_n), .iorq2_n(iorq2_n), .iorqge1(iorqge1), .iorqge2(iorqge2),
  255.                     .porthit(porthit), .drive_ff(drive_ff) );
  256.  
  257.  
  258.  
  259.         zmem z80mem( .fclk(fclk), .rst_n(rst_n), .zpos(1'b0), .zneg(1'b0),
  260.                      .cend(cend), .pre_cend(pre_cend), .za(a), .zd_in(d),
  261.                      .zd_out(dout_ram), .zd_ena(ena_ram), .m1_n(m1_n),
  262.                      .rfsh_n(rfsh_n), .iorq_n(iorq_n), .mreq_n(mreq_n),
  263.                      .rd_n(rd_n), .wr_n(wr_n),
  264.  
  265.         .win0_romnram(~peff7[3]), // was 1'b1
  266.         .win1_romnram(1'b0),
  267.         .win2_romnram(1'b0),
  268.         .win3_romnram(1'b0),
  269.  
  270.         .win0_page( peff7[3] ? 8'd0 : {6'd0,~dos,p7ffd[4]} ),
  271.         .win1_page(8'd5),
  272.         .win2_page(8'd2),
  273.         .win3_page( {2'd0,p7ffd[7:5],p7ffd[2:0]} ),
  274.  
  275.         .dos(dos),
  276.  
  277.         .rompg(rompg),
  278.         .romoe_n(romoe_n),
  279.         .romwe_n(romwe_n),
  280.         .csrom(csrom),
  281.  
  282.         .cpu_req(cpu_req),
  283.         .cpu_rnw(cpu_rnw),
  284.         .cpu_wrbsel(cpu_wrbsel),
  285.         .cpu_strobe(cpu_strobe),
  286.         .cpu_addr(cpu_addr),
  287.         .cpu_wrdata(cpu_wrdata),
  288.         .cpu_rddata(cpu_rddata) );
  289.  
  290.  
  291.  
  292.  
  293.  
  294.  
  295.         wire [20:0] daddr;
  296.         wire dreq;
  297.         wire drnw;
  298.         wire [15:0] drddata;
  299.         wire [15:0] dwrdata;
  300.         wire [1:0] dbsel;
  301.  
  302.  
  303.  
  304.  
  305.         dram dramko( .clk(fclk),
  306.                      .rst_n(rst_n),
  307.  
  308.                      .addr(daddr),
  309.                      .req(dreq),
  310.                      .rnw(drnw),
  311.                      .cbeg(cbeg),
  312.                      .rrdy(drrdy),
  313.                      .rddata(drddata),
  314.                      .wrdata(dwrdata),
  315.                      .bsel(dbsel),
  316.  
  317.                      .ra(ra),
  318.                      .rd(rd),
  319.                      .rwe_n(rwe_n),
  320.                      .rucas_n(rucas_n),
  321.                      .rlcas_n(rlcas_n),
  322.                      .rras0_n(rras0_n),
  323.                      .rras1_n(rras1_n) );
  324.  
  325.  
  326.         wire [1:0] bw;
  327.  
  328.         wire [20:0] video_addr;
  329.         wire [15:0] video_data;
  330.         wire video_strobe;
  331.         wire video_next;
  332.  
  333.         arbiter dramarb( .clk(fclk),
  334.                          .rst_n(rst_n),
  335.  
  336.                          .dram_addr(daddr),
  337.                          .dram_req(dreq),
  338.                          .dram_rnw(drnw),
  339.                          .dram_cbeg(cbeg),
  340.                          .dram_rrdy(drrdy),
  341.                          .dram_bsel(dbsel),
  342.                          .dram_rddata(drddata),
  343.                          .dram_wrdata(dwrdata),
  344.  
  345.                          .cend(cend),
  346.                          .pre_cend(pre_cend),
  347.  
  348.                          .go(go),
  349.                          .bw(bw),
  350.  
  351.                          .video_addr(video_addr),
  352.                          .video_data(video_data),
  353.                          .video_strobe(video_strobe),
  354.                          .video_next(video_next),
  355.  
  356.                          //.cpu_waitcyc(cpu_waitcyc),
  357.                          //.cpu_stall(cpu_stall),
  358.                          .cpu_req(cpu_req),
  359.                          .cpu_rnw(cpu_rnw),
  360.                          .cpu_addr(cpu_addr),
  361.                          .cpu_wrbsel(cpu_wrbsel),
  362.                          .cpu_wrdata(cpu_wrdata),
  363.                          .cpu_rddata(cpu_rddata),
  364.                          .cpu_strobe(cpu_strobe) );
  365.  
  366.  
  367.         wire hsync,hblank,hpix,hsync_start,line_start,hint_start;
  368.  
  369.         synch horiz_sync( .clk(fclk), .init(1'b0), .cend(cend), .pre_cend(pre_cend),
  370.                           .hsync(hsync), .hblank(hblank), .hpix(hpix), .hsync_start(hsync_start),
  371.                           .line_start(line_start), .hint_start(hint_start) );
  372.  
  373.  
  374.         wire vblank,vsync,int_start,vpix;
  375.  
  376.         syncv vert_sync( .clk(fclk), .hsync_start(hsync_start), .line_start(line_start),
  377.                          .vblank(vblank), .vsync(vsync), .int_start(int_start),
  378.                          .vpix(vpix), .hint_start(hint_start) );
  379.  
  380.  
  381.         wire [5:0] pixel;
  382.  
  383.         fetch fecher( .clk(fclk), .cend(cend), .line_start(line_start), .vpix(vpix), .int_start(int_start),
  384.                       .vmode( {peff7[0],peff7[5]} ), .screen(p7ffd[3]), .video_addr(video_addr), .video_data(video_data),
  385.                       .video_strobe(video_strobe), .video_next(video_next), .go(go), .bw(bw), .pixel(pixel) );
  386.  
  387.  
  388.  
  389.  
  390.         videoout vidia( .clk(fclk), .pixel(pixel), .border({ 1'b0,border[1],1'b0,border[2],1'b0,border[0] }), .hblank(hblank), .vblank(vblank),
  391.                         .hpix(hpix), .vpix(vpix), .hsync(hsync), .vsync(vsync), .vred(vred), .vgrn(vgrn),
  392.                         .vblu(vblu), .vhsync(vhsync), .vvsync(vvsync), .vcsync(vcsync) );
  393.  
  394.  
  395.  
  396.  
  397.  
  398.         wire [4:0] keyout;
  399.  
  400.         slavespi rab( .fclk(fclk), .rst_n(rst_n), .spics_n(spics_n), .spidi(spidi), .spido(spido),
  401.                       .spick(spick), .a(a), .keyout(keyout), .genrst(genrst), .rstrom(rstrom) );
  402.  
  403.  
  404.  
  405.  
  406.  
  407.         zports porty( .clk(zclk), .fclk(fclk), .rst_n(rst_n), .din(d), .dout(dout_ports), .dataout(ena_ports),
  408.                       .a(a), .iorq_n(iorq_n), .rd_n(rd_n), .wr_n(wr_n), .keyout(keyout), .porthit(porthit),
  409.                       .ay_bdir(ay_bdir), .ay_bc1(ay_bc1), .border(border), .beep(beep),
  410.                       .p7ffd(p7ffd), .peff7(peff7), .mreq_n(mreq_n), .m1_n(m1_n), .dos(dos),
  411.                       .rstrom(rstrom), .vg_intrq(intrq), .vg_drq(drq), .vg_wrFF(vg_wrFF),
  412.                       .vg_cs_n(vg_cs_n), .sd_start(sd_start), .sd_dataout(sd_dataout),
  413.                       .sd_datain(sd_datain), .sdcs_n(sdcs_n),
  414.                       .idein(idein), .ideout(ideout), .idedataout(idedataout),
  415.                       .ide_a(ide_a), .ide_cs0_n(ide_cs0_n), .ide_cs1_n(ide_cs1_n), .ide_wr_n(ide_wr_n), .ide_rd_n(ide_rd_n)
  416.                     );
  417.  
  418.  
  419.         zint preryv( .fclk(fclk), .zclk(zclk), .int_start(int_start), .iorq_n(iorq_n), .m1_n(m1_n),
  420.                      .int_n(int_n) );
  421.  
  422.  
  423.  
  424.         wire [1:0] vg_ddrv;
  425.         assign vg_a[0] = vg_ddrv[0] ? 1'b1 : 1'b0; // possibly open drain?
  426.         assign vg_a[1] = vg_ddrv[1] ? 1'b1 : 1'b0;
  427.  
  428.         vg93 vgshka( .zclk(zclk), .rst_n(rst_n), .fclk(fclk), .vg_clk(vg_clk),
  429.                      .vg_res_n(vg_res_n), .din(d), .intrq(intrq), .drq(drq), .vg_wrFF(vg_wrFF),
  430.                      .vg_hrdy(vg_hrdy), .vg_rclk(vg_rclk), .vg_rawr(vg_rawr), .vg_a(vg_ddrv),
  431.                      .vg_wrd(vg_wrd), .vg_side(vg_side), .step(step), .vg_sl(vg_sl), .vg_sr(vg_sr),
  432.                      .vg_tr43(vg_tr43), .rdat_n(rdat_b_n), .vg_wf_de(vg_wf_de), .vg_drq(vg_drq),
  433.                      .vg_irq(vg_irq), .vg_wd(vg_wd) );
  434.  
  435.  
  436.  
  437.  
  438.         spi2 zspi( .clock(fclk), .sck(sdclk), .sdo(sddo), .sdi(sddi), .start(sd_start),
  439.                    .speed(2'b00), .din(sd_datain), .dout(sd_dataout) );
  440.  
  441. endmodule
  442.  
  443.