Subversion Repositories zxusbnet

Rev

Rev 60 | 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.                         wr_n   <= 1'b0;
  98.  
  99.                         @(negedge clk);
  100.                         @(negedge clk);
  101.  
  102.                         mreq_n <= 1'b1;
  103.                         wr_n   <= 1'b1;
  104.                         //wait(wr_n==1'b1); // delta-cycle delay!!!
  105.  
  106.                         @(posedge clk);
  107.                         oena <= 1'b0;
  108.                 end
  109.         endtask
  110.  
  111.  
  112.         task iord;
  113.  
  114.                 input [15:0] addr;
  115.  
  116.                 output [7:0] data;
  117.  
  118.                 begin
  119.  
  120.                         @(posedge clk);
  121.  
  122.                         mreq_n <= 1'b1;
  123.                         iorq_n <= 1'b1;
  124.                         rd_n   <= 1'b1;
  125.                         wr_n   <= 1'b1;
  126.  
  127.                         oena <= 1'b0;
  128.                         a <= addr;
  129.  
  130.                         @(negedge clk);
  131.  
  132.                         iorq_n <= 1'b0;
  133.                         rd_n   <= 1'b0;
  134.  
  135.                         @(negedge clk);
  136.                         @(negedge clk);
  137.  
  138.                         data = d;
  139.  
  140.                         iorq_n <= 1'b1;
  141.                         rd_n   <= 1'b1;
  142.  
  143.                         @(posedge clk);
  144.                 end
  145.  
  146.         endtask
  147.  
  148.  
  149.         task iowr;
  150.  
  151.                 input [15:0] addr;
  152.                 input [ 7:0] data;
  153.  
  154.                 begin
  155.  
  156.                         @(posedge clk);
  157.  
  158.                         mreq_n <= 1'b1;
  159.                         iorq_n <= 1'b1;
  160.                         rd_n   <= 1'b1;
  161.                         wr_n   <= 1'b1;
  162.  
  163.                         a <= addr;
  164.                         dout <= data;
  165.                         oena <= 1'b1;
  166.  
  167.                         @(negedge clk);
  168.  
  169.                         iorq_n <= 1'b0;
  170.                         wr_n   <= 1'b0;
  171.  
  172.                         @(negedge clk);
  173.                         @(negedge clk);
  174.  
  175.                         iorq_n <= 1'b1;
  176.                         wr_n   <= 1'b1;
  177.  
  178.                         //wait(wr_n==1'b1); // delta-cycle delay!!!
  179.  
  180.                        
  181.                         @(posedge clk);
  182.                         oena <= 1'b0;
  183.                 end
  184.  
  185.         endtask
  186.  
  187.  
  188.  
  189.  
  190. endmodule
  191.  
  192.