Subversion Repositories zxusbnet

Rev

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

  1. // initially part of ZXiznet project (c) NedoPC 2012
  2. //
  3. // Simple Simulator of Z80
  4. //  performs only some Z80 cycles as tasks, no /WAIT etc.
  5.  
  6. module ssz80
  7. (
  8.         input  wire       clk,
  9.         input  wire       rst_n,
  10.  
  11.         output reg        mreq_n,
  12.         output reg        iorq_n,
  13.         output reg        wr_n,
  14.         output reg        rd_n,
  15.  
  16.         output reg  [15:0] a,
  17.  
  18.         inout  wire [ 7:0] d
  19. );
  20.  
  21.  
  22.         reg [7:0] dout;
  23.         reg       oena;
  24.  
  25.  
  26.         assign d = oena ? dout : 8'bZZZZ_ZZZZ;
  27.  
  28.  
  29.  
  30.  
  31.         initial
  32.         begin
  33.                 a='d0;
  34.  
  35.                 dout = 'd0;
  36.                 oena = 1'b0;
  37.  
  38.                 mreq_n = 1'bZ;
  39.                 iorq_n = 1'bZ;
  40.                 rd_n   = 1'bZ;
  41.                 wr_n   = 1'bZ;
  42.         end
  43.  
  44.  
  45.  
  46.  
  47.         task memrd;
  48.  
  49.                 input  [15:0] addr;
  50.                 output [ 7:0] data;
  51.  
  52.                 begin
  53.                         @(posedge clk);
  54.                         mreq_n <= 1'b1;
  55.                         iorq_n <= 1'b1;
  56.                         rd_n   <= 1'b1;
  57.                         wr_n   <= 1'b1;
  58.                         oena <= 1'b0;
  59.                         a <= addr;
  60.  
  61.                         @(negedge clk);
  62.  
  63.                         mreq_n <= 1'b0;
  64.                         rd_n   <= 1'b0;
  65.  
  66.                         @(negedge clk);
  67.                         @(negedge clk);
  68.  
  69.                         data = d;
  70.                         mreq_n <= 1'b1;
  71.                         rd_n   <= 1'b1;
  72.  
  73.                         @(posedge clk);
  74.                 end
  75.         endtask
  76.  
  77.  
  78.         task memwr;
  79.  
  80.                 input  [15:0] addr;
  81.                 input  [ 7:0] data;
  82.  
  83.                 begin
  84.                         @(posedge clk);
  85.  
  86.                         mreq_n <= 1'b1;
  87.                         iorq_n <= 1'b1;
  88.                         rd_n   <= 1'b1;
  89.                         wr_n   <= 1'b1;
  90.                         a <= addr;
  91.                         dout <= data;
  92.                         oena <= 1'b1;
  93.  
  94.                         @(negedge clk);
  95.  
  96.                         mreq_n <= 1'b0;
  97.                         @(negedge clk);
  98.                         wr_n   <= 1'b0;
  99.                         @(negedge clk);
  100.  
  101.                         mreq_n <= 1'b1;
  102.                         wr_n   <= 1'b1;
  103.                         //wait(wr_n==1'b1); // delta-cycle delay!!!
  104.  
  105.                         @(posedge clk);
  106.                         oena <= 1'b0;
  107.                 end
  108.         endtask
  109.  
  110.  
  111.         task iord;
  112.  
  113.                 input [15:0] addr;
  114.  
  115.                 output [7:0] data;
  116.  
  117.                 begin
  118.  
  119.                         @(posedge clk);
  120.  
  121.                         mreq_n <= 1'b1;
  122.                         iorq_n <= 1'b1;
  123.                         rd_n   <= 1'b1;
  124.                         wr_n   <= 1'b1;
  125.  
  126.                         oena <= 1'b0;
  127.                         a <= addr;
  128.  
  129.                         @(negedge clk);
  130.  
  131.                         iorq_n <= 1'b0;
  132.                         rd_n   <= 1'b0;
  133.  
  134.                         @(negedge clk);
  135.                         @(negedge clk);
  136.  
  137.                         data = d;
  138.  
  139.                         iorq_n <= 1'b1;
  140.                         rd_n   <= 1'b1;
  141.  
  142.                         @(posedge clk);
  143.                 end
  144.  
  145.         endtask
  146.  
  147.  
  148.         task iowr;
  149.  
  150.                 input [15:0] addr;
  151.                 input [ 7:0] data;
  152.  
  153.                 begin
  154.  
  155.                         @(posedge clk);
  156.  
  157.                         mreq_n <= 1'b1;
  158.                         iorq_n <= 1'b1;
  159.                         rd_n   <= 1'b1;
  160.                         wr_n   <= 1'b1;
  161.  
  162.                         a <= addr;
  163.                         dout <= data;
  164.                         oena <= 1'b1;
  165.  
  166.                         @(negedge clk);
  167.  
  168.                         iorq_n <= 1'b0;
  169.                         wr_n   <= 1'b0;
  170.  
  171.                         @(negedge clk);
  172.                         @(negedge clk);
  173.  
  174.                         iorq_n <= 1'b1;
  175.                         wr_n   <= 1'b1;
  176.  
  177.                         //wait(wr_n==1'b1); // delta-cycle delay!!!
  178.  
  179.                        
  180.                         @(posedge clk);
  181.                         oena <= 1'b0;
  182.                 end
  183.  
  184.         endtask
  185.  
  186.  
  187.  
  188.  
  189. endmodule
  190.  
  191.