Subversion Repositories ngs

Rev

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

  1. // (c) NedoPC 2013
  2. //
  3. // wrapper for T80.vhd
  4. //
  5. // fixes WR_N signal behavior, adds delays to outputs
  6.  
  7. `timescale 1ns/100ps
  8.  
  9. // as of z0840008
  10. `define DLY_DN 34.0
  11. `define DLY_UP 30.0
  12.  
  13. module z80
  14. (
  15.         input  wire rst_n,
  16.         input  wire clk,
  17.  
  18.         input  wire int_n,
  19.         input  wire nmi_n,
  20.         input  wire busrq_n,
  21.         input  wire wait_n,
  22.        
  23.         output wire [15:0] a,
  24.         inout  wire [ 7:0] d,
  25.  
  26.         output wire mreq_n,
  27.         output wire iorq_n,
  28.         output wire rd_n,
  29.         output reg  wr_n,
  30.  
  31.         output wire m1_n,
  32.         output wire rfsh_n,
  33.         output wire busak_n,
  34.         output wire halt_n
  35. );
  36.  
  37.  
  38.         wire [15:0] #(`DLY_UP,`DLY_DN) za;
  39.         wire [ 7:0] d_i;
  40.         wire [ 7:0] #(`DLY_UP,`DLY_DN) d_o;
  41.  
  42.         wire #(`DLY_UP,`DLY_DN) zmreq_n;
  43.         wire #(`DLY_UP,`DLY_DN) ziorq_n;
  44.         wire #(`DLY_UP,`DLY_DN) zrd_n;
  45.  
  46.         wire iwr_n;
  47.         wire im1_n;
  48.         wire iiorq_n;
  49.         wire ird_n;
  50.  
  51.         wire #(`DLY_UP,`DLY_DN) zm1_n;
  52.         wire #(`DLY_UP,`DLY_DN) zrfsh_n;
  53.         wire #(`DLY_UP,`DLY_DN) zbusak_n;
  54.         wire #(`DLY_UP,`DLY_DN) zhalt_n;
  55.  
  56.         reg  mreq_wr_n;
  57.         wire iorq_wr_n;
  58.         wire full_wr_n;
  59.  
  60.  
  61. /*      // attach T80 module
  62.         T80a T80a
  63.         (
  64.                 .RESET_n(rst_n),
  65.                 .CLK_n  (clk  ),
  66.  
  67.                 .INT_n  (int_n  ),
  68.                 .NMI_n  (nmi_n  ),
  69.                 .BUSRQ_n(busrq_n),
  70.                 .WAIT_n (wait_n ),
  71.                
  72.                 .A  (za ),
  73.                 .D_I(d_i),
  74.                 .D_O(d_o),
  75.                
  76.                 .MREQ_n(zmreq_n),
  77.                 .IORQ_n(iiorq_n),
  78.                 .RD_n  (ird_n  ),
  79.                 .WR_n  (iwr_n  ),
  80.  
  81.                 .M1_n   (im1_n   ),
  82.                 .RFSH_n (zrfsh_n ),
  83.                 .BUSAK_n(zbusak_n),
  84.                 .HALT_n (zhalt_n )
  85.         );
  86. */
  87.  
  88.         // tv80 module
  89.         tv80s tv80s
  90.         (
  91.                 .reset_n(rst_n),
  92.                 .clk    (clk  ),
  93.                
  94.                 .int_n  (int_n  ),
  95.                 .nmi_n  (nmi_n  ),
  96.                 .busrq_n(busrq_n),
  97.                 .wait_n (wait_n ),
  98.                
  99.                 .A      (za ),
  100.                 .di     (d_i),
  101.                 .dout   (d_o),
  102.                
  103.                 .mreq_n (zmreq_n),
  104.                 .iorq_n (iiorq_n),
  105.                 .rd_n   (ird_n  ),
  106.                 .wr_n   (iwr_n  ),
  107.                
  108.                 .m1_n   (im1_n   ),
  109.                 .rfsh_n (zrfsh_n ),
  110.                 .busak_n(zbusak_n),
  111.                 .halt_n (zhalt_n )
  112.         );
  113.  
  114.  
  115.  
  116.         assign ziorq_n = iiorq_n;
  117.         assign zrd_n   = ird_n;
  118.         assign zm1_n   = im1_n;
  119.  
  120.  
  121.         assign a = busak_n ? za : 16'hZZZZ;
  122.  
  123.         assign mreq_n = zmreq_n;
  124.         assign iorq_n = ziorq_n;
  125.         assign rd_n   = zrd_n  ;
  126.  
  127.         assign m1_n    = zm1_n   ;
  128.         assign rfsh_n  = zrfsh_n ;
  129.         assign busak_n = zbusak_n;
  130.         assign halt_n  = zhalt_n ;
  131.  
  132.  
  133.         // fix broken wr_n of T80
  134.         always @(negedge clk)
  135.                 mreq_wr_n <= iwr_n;
  136.         //
  137.         assign iorq_wr_n = iiorq_n | (~ird_n) | (~im1_n);
  138.         assign full_wr_n = mreq_wr_n & iorq_wr_n;
  139.         //
  140.         always @(full_wr_n)
  141.                 if( !full_wr_n )
  142.                         #`DLY_DN wr_n <= full_wr_n;
  143.                 else
  144.                         #`DLY_UP wr_n <= full_wr_n;
  145.  
  146.  
  147.         // data bus
  148.         assign d_i =  d;
  149.         assign d  = !wr_n ? d_o : 8'bZZZZ_ZZZZ;
  150.  
  151.  
  152.  
  153.  
  154.  
  155. endmodule
  156.  
  157.