Subversion Repositories pentevo

Rev

Rev 30 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed | ?url?

  1. // simulate together CPU, DRAM and VIDEO FETCH
  2.  
  3. `include "../include/tune.v"
  4.  
  5. module tb_cdv;
  6.  
  7.  
  8.         reg rst_n;
  9.         reg clk;
  10.  
  11.         wire zclk,zclk_out;
  12.         wire mreq_n,iorq_n,rd_n,wrbad_n,m1_n,rfsh_n;
  13.         reg wr_n;
  14.         tri [7:0] zdata;
  15.         wire [15:0] zaddr;
  16.  
  17.         wire [7:0] ramout;
  18.         wire ram_ena;
  19.  
  20.         wire [4:0] rompg;
  21.         wire romoe_n,romwe_n,csrom;
  22.         wire [7:0] romdata;
  23.  
  24.  
  25.         wire cbeg,pre_cend,cend;
  26.  
  27.         wire cpu_req,cpu_rnw,cpu_wrbsel,cpu_strobe;
  28.         wire [20:0] cpu_addr;
  29.         wire [7:0] cpu_wrdata;
  30.         wire [15:0] cpu_rddata;
  31.         wire cpu_stall;
  32.         wire [4:0] cpu_waitcyc;
  33.  
  34.         wire video_strobe,video_next;
  35.         wire [15:0] video_data;
  36.         wire [20:0] video_addr;
  37.  
  38.         wire go;
  39.         wire [1:0] bw;
  40.  
  41.  
  42.         wire [20:0] daddr;
  43.         wire dreq,drnw,drrdy;
  44.         wire [1:0] dbsel;
  45.         wire [15:0] drddata;
  46.         wire [15:0] dwrdata;
  47.  
  48.  
  49.         wire [9:0] ra;
  50.         tri [15:0] rd;
  51.         wire rwe_n,rucas_n,rlcas_n,rras0_n,rras1_n;
  52.  
  53.  
  54.  
  55.  
  56.         wire hsync,hblank,hpix,hsync_start,line_start;
  57.  
  58.         wire vblank,vsync,vpix,int_start;
  59.  
  60.         wire [5:0] pixel;
  61.  
  62.  
  63.         initial
  64.         begin
  65.                 clk = 1'b0;
  66.                 forever #17 clk = ~clk;
  67.         end
  68.  
  69.  
  70.         integer rst_count;
  71.         initial
  72.         begin
  73.             rst_n <= 1'b0;
  74.  
  75.                 for(rst_count=0;rst_count<=32;rst_count=rst_count+1) @(posedge clk);
  76.  
  77.                 rst_n <= 1'b1;
  78.         end
  79.  
  80.  
  81.  
  82.  
  83.         // for simulation
  84.         integer i;
  85.         initial
  86.         begin
  87.                 for(i=0;i<32768;i=i+1)
  88.                 begin
  89.                         chip0.array[i] = 16'd0;
  90.                         chip1.array[i] = 16'd0;
  91.                 end
  92.  
  93.  
  94.  
  95.                 for(i=16'h000;i<16'h1b00;i=i+2)
  96.                 begin
  97. //                      zxmemwrite(5,i,i+16'h4000); // this particular thing is to check zx-mode addressing
  98.  
  99.                         zxmemwrite(4,i,i);
  100.                         zxmemwrite(5,i,i+16'h4000);
  101.                         zxmemwrite(4,i+16'h2000,i+16'h2000);
  102.                         zxmemwrite(5,i+16'h2000,i+16'h6000);
  103.  
  104.                 end
  105.  
  106.  
  107.  
  108.         end
  109.  
  110.  
  111.         task zxmemwrite; // writes a word given zx page and page offset (must be even)
  112.  
  113.                 input [2:0] page;
  114.                 input [13:0] offset;
  115.                 input [15:0] data;
  116.  
  117.                 reg [14:0] wordaddr;
  118.                 begin
  119.                         wordaddr = { page[2:0], offset[13:2] };
  120.  
  121.                         if( !offset[1] )
  122.                                         chip0.array[wordaddr] = data;
  123.                         else
  124.                                         chip1.array[wordaddr] = data;
  125.                 end
  126.  
  127.         endtask
  128.  
  129.  
  130.  
  131.         // route data to the Z80 bus
  132.  
  133.         assign zdata = ram_ena ? ramout : 8'hZZ;
  134.         assign zdata = romdata;
  135.  
  136.  
  137.  
  138.  
  139.  
  140.         T80a z80( .RESET_n(/*rst_n*/1'b0),
  141.                   .CLK_n(zclk),
  142.                   .WAIT_n(1'b1),
  143.                   .INT_n(1'b1),
  144.                   .NMI_n(1'b1),
  145.                   .M1_n(m1_n),
  146.                   .RFSH_n(rfsh_n),
  147.                   .MREQ_n(mreq_n),
  148.                   .IORQ_n(iorq_n),
  149.                   .RD_n(rd_n),
  150.                   .WR_n(wrbad_n),
  151.                   .BUSRQ_n(1'b1),
  152.                   .A(zaddr),
  153.                   .D(zdata) );
  154.  
  155.         //correct wr_n (valid only for MEMORY operations!)
  156.         always @(negedge zclk)
  157.                 wr_n <= wrbad_n;
  158.  
  159.  
  160.  
  161.         zclock z80clock( .rst_n(rst_n),
  162.                          .fclk(clk),
  163.                          .zclk_out(zclk_out),
  164.                          .zclk(zclk),
  165.                          .turbo(2'b01),
  166.                          .pre_cend(pre_cend) );
  167.  
  168.         assign zclk = ~zclk_out; // inversion in the schematics!
  169.  
  170.  
  171.  
  172.         zmem z80memory( .rst_n(rst_n),
  173.                         .fclk(clk),
  174.                         .zpos(1'b1),
  175.                         .zneg(1'b0),
  176.  
  177.                         .cend(cend),
  178.                         .pre_cend(pre_cend),
  179.  
  180.                         .za(zaddr),
  181.                         .zd_in(zdata),
  182.                         .zd_out(ramout),
  183.                         .zd_ena(ram_ena),
  184.  
  185.                         .m1_n(m1_n),
  186.                         .rfsh_n(rfsh_n),
  187.                         .mreq_n(mreq_n),
  188.                         .iorq_n(iorq_n),
  189.                         .rd_n(rd_n),
  190.                         .wr_n(wr_n),
  191.  
  192.                         .win0_romnram(1'b1),
  193.                         .win1_romnram(1'b0),
  194.                         .win2_romnram(1'b0),
  195.                         .win3_romnram(1'b0),
  196.  
  197.                         .win0_page(8'd0),
  198.                         .win1_page(8'd1),
  199.                         .win2_page(8'd2),
  200.                         .win3_page(8'd3),
  201.  
  202.                         .dos(1'b0),
  203.  
  204.                         .rompg(rompg),
  205.                         .romoe_n(romoe_n),
  206.                         .romwe_n(romwe_n),
  207.                         .csrom(csrom),
  208.  
  209.  
  210.                         .cpu_req(cpu_req),
  211.                         .cpu_rnw(cpu_rnw),
  212.                         .cpu_wrbsel(cpu_wrbsel),
  213.                         .cpu_strobe(cpu_strobe),
  214.  
  215.                         .cpu_addr(cpu_addr),
  216.                         .cpu_wrdata(cpu_wrdata),
  217.                         .cpu_rddata(cpu_rddata) );
  218.  
  219.  
  220.         arbiter dramarb( .clk(clk),
  221.                          .rst_n(rst_n),
  222.  
  223.                          .dram_addr(daddr),
  224.                          .dram_req(dreq),
  225.                          .dram_rnw(drnw),
  226.                          .dram_cbeg(cbeg),
  227.                          .dram_rrdy(drrdy),
  228.                          .dram_bsel(dbsel),
  229.                          .dram_rddata(drddata),
  230.                          .dram_wrdata(dwrdata),
  231.  
  232.                          .cend(cend),
  233.                          .pre_cend(pre_cend),
  234.  
  235.                          .go(go),
  236.                          .bw(bw),
  237.  
  238.                          .video_addr(video_addr),
  239.                          .video_data(video_data),
  240.                          .video_strobe(video_strobe),
  241.                          .video_next(video_next),
  242.  
  243.                          .cpu_waitcyc(cpu_waitcyc),
  244.                          .cpu_stall(cpu_stall),
  245.                          .cpu_req(cpu_req),
  246.                          .cpu_rnw(cpu_rnw),
  247.                          .cpu_addr(cpu_addr),
  248.                          .cpu_wrbsel(cpu_wrbsel),
  249.                          .cpu_wrdata(cpu_wrdata),
  250.                          .cpu_rddata(cpu_rddata),
  251.                          .cpu_strobe(cpu_strobe) );
  252.  
  253.  
  254.         dram dramko( .clk(clk),
  255.                      .rst_n(rst_n),
  256.  
  257.                      .addr(daddr),
  258.                      .req(dreq),
  259.                      .rnw(drnw),
  260.                      .cbeg(cbeg),
  261.                      .rrdy(drrdy),
  262.                      .rddata(drddata),
  263.                      .wrdata(dwrdata),
  264.                      .bsel(dbsel),
  265.  
  266.                      .ra(ra),
  267.                      .rd(rd),
  268.                      .rwe_n(rwe_n),
  269.                      .rucas_n(rucas_n),
  270.                      .rlcas_n(rlcas_n),
  271.                      .rras0_n(rras0_n),
  272.                      .rras1_n(rras1_n) );
  273.  
  274.  
  275.  
  276.         drammem chip0( .ma(ra),
  277.                        .d(rd),
  278.                        .ras_n(rras0_n),
  279.                        .ucas_n(rucas_n),
  280.                        .lcas_n(rlcas_n),
  281.                        .we_n(rwe_n) );
  282.  
  283.         drammem chip1( .ma(ra),
  284.                        .d(rd),
  285.                        .ras_n(rras1_n),
  286.                        .ucas_n(rucas_n),
  287.                        .lcas_n(rlcas_n),
  288.                        .we_n(rwe_n) );
  289.  
  290.         defparam chip0._add_to_addr_=0;
  291.         defparam chip1._add_to_addr_=1;
  292.  
  293.         defparam chip0._filter_out_=0;
  294.         defparam chip1._filter_out_=0;
  295.  
  296.  
  297.  
  298.         rom romko( .addr( {rompg[1:0],zaddr[13:0]} ),
  299.                    .data(romdata),
  300.                    .ce_n( (~csrom)|romoe_n ) );
  301.  
  302.  
  303.  
  304.  
  305.         synch horiz_sync( .clk(clk), .init(1'b0), .cend(cend), .pre_cend(pre_cend),
  306.                           .hsync(hsync), .hblank(hblank), .hpix(hpix), .hsync_start(hsync_start),
  307.                           .line_start(line_start) );
  308.  
  309.  
  310.         syncv vert_sync( .clk(clk), .hsync_start(hsync_start), .line_start(line_start),
  311.                          .vblank(vblank), .vsync(vsync), .int_start(int_start),
  312.                          .vpix(vpix) );
  313.  
  314.  
  315.  
  316.         fetch fecher( .clk(clk), .cend(cend), .line_start(line_start), .vpix(vpix), .int_start(int_start),
  317.                       .vmode(1'b1), .screen(1'b0), .video_addr(video_addr), .video_data(video_data), .video_strobe(video_strobe),
  318.                       .video_next(video_next), .go(go), .bw(bw), .pixel(pixel) );
  319.  
  320.  
  321.  
  322.  
  323. `ifdef FETCH_VERBOSE
  324.  
  325.         always
  326.         begin
  327.                 @(posedge video_next);
  328.                 $write("video addr=$%h, ",video_addr); // address just before video_addr changes!
  329.                 @(posedge video_strobe); @(negedge clk);
  330.                 $write("data=$%h\n",video_data);
  331.         end
  332.  
  333.         always
  334.         begin
  335.                 @(negedge hsync)
  336.                         if( vpix )
  337.                                 $display("new line");
  338.         end
  339.  
  340.  
  341.  
  342. `endif
  343.  
  344.  
  345.  
  346.  
  347. endmodule
  348.  
  349.