Subversion Repositories pentevo

Rev

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

  1. // PentEvo project (c) NedoPC 2012
  2. //
  3. // SPI hub: arbitrating between AVR and Z80 accesses to SDcard via SPI.
  4.  
  5. `include "../include/tune.v"
  6.  
  7. module spihub(
  8.  
  9.         input  wire       fclk,
  10.         input  wire       rst_n,
  11.  
  12.         // pins to SDcard
  13.         output reg        sdcs_n,
  14.         output wire       sdclk,
  15.         output wire       sddo,
  16.         input  wire       sddi,
  17.  
  18.         // zports SDcard iface
  19.         input  wire       zx_sdcs_n_val,
  20.         input  wire       zx_sdcs_n_stb,
  21.         input  wire       zx_sd_start,
  22.         input  wire [7:0] zx_sd_datain,
  23.         output wire [7:0] zx_sd_dataout,
  24.  
  25.         // slavespi SDcard iface
  26.         input  wire       avr_lock_in,
  27.         output reg        avr_lock_out,
  28.         input  wire       avr_sdcs_n,
  29.         input  wire       avr_sd_start,
  30.         input  wire [7:0] avr_sd_datain,
  31.         output wire [7:0] avr_sd_dataout
  32. );
  33.  
  34.         // spi2 module control
  35.         wire [7:0] sd_datain;
  36.         wire [7:0] sd_dataout;
  37.         wire       sd_start;
  38.  
  39.  
  40.         // single dataout to all ifaces
  41.         assign zx_sd_dataout  = sd_dataout;
  42.         assign avr_sd_dataout = sd_dataout;
  43.  
  44.  
  45.         // spi2 module itself
  46.         spi2 spi2(
  47.                 .clock(fclk),
  48.  
  49.                 .sck(sdclk),
  50.                 .sdo(sddo ),
  51.                 .sdi(sddi ),
  52.  
  53.                 .start(sd_start  ),
  54.                 .din  (sd_datain ),
  55.                 .dout (sd_dataout),
  56.  
  57.                 .speed(2'b00)
  58.         );
  59.  
  60.  
  61.         // control locking/arbitrating between ifaces
  62.         always @(posedge fclk, negedge rst_n)
  63.         if( !rst_n )
  64.                 avr_lock_out <= 1'b0;
  65.         else // posedge fclk
  66.         begin
  67.                 if( sdcs_n )
  68.                         avr_lock_out <= avr_lock_in;
  69.         end
  70.  
  71.  
  72.  
  73.         // control cs_n to SDcard
  74.         always @(posedge fclk, negedge rst_n)
  75.         if( !rst_n )
  76.                 sdcs_n <= 1'b1;
  77.         else // posedge fclk
  78.         begin
  79.                 if( avr_lock_out )
  80.                         sdcs_n <= avr_sdcs_n;
  81.                 else // !avr_lock_out
  82.                         if( zx_sdcs_n_stb )
  83.                                 sdcs_n <= zx_sdcs_n_val;
  84.         end
  85.  
  86.  
  87.         // control start and outgoing data to spi2
  88.         assign sd_start = avr_lock_out ? avr_sd_start : zx_sd_start;
  89.         //
  90.         assign sd_datain = avr_lock_out ? avr_sd_datain : zx_sd_datain;
  91.  
  92.  
  93. endmodule
  94.  
  95.