Subversion Repositories ngs

Rev

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

  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.         assign ziorq_n = iiorq_n;
  88.         assign zrd_n   = ird_n;
  89.         assign zm1_n   = im1_n;
  90.  
  91.  
  92.         assign a = za;
  93.  
  94.         assign mreq_n = zmreq_n;
  95.         assign iorq_n = ziorq_n;
  96.         assign rd_n   = zrd_n  ;
  97.  
  98.         assign m1_n    = zm1_n   ;
  99.         assign rfsh_n  = zrfsh_n ;
  100.         assign busak_n = zbusak_n;
  101.         assign halt_n  = zhalt_n ;
  102.  
  103.  
  104.         // fix broken wr_n of T80
  105.         always @(negedge clk)
  106.                 mreq_wr_n <= iwr_n;
  107.         //
  108.         assign iorq_wr_n = iiorq_n | (~ird_n) | (~im1_n);
  109.         assign full_wr_n = mreq_wr_n & iorq_wr_n;
  110.         //
  111.         always @(full_wr_n)
  112.                 if( !full_wr_n )
  113.                         #`DLY_DN wr_n <= full_wr_n;
  114.                 else
  115.                         #`DLY_UP wr_n <= full_wr_n;
  116.  
  117.  
  118.         // data bus
  119.         assign d_i =  d;
  120.         assign d  = d_o;
  121.  
  122.  
  123.  
  124.  
  125.  
  126. endmodule
  127.  
  128.