mark RFX boards as i_and_q_swapped
[debian/gnuradio] / usrp2 / fpga / control_lib / sd_spi_wb.v
1
2 // Wishbone module for spi communications with an SD Card
3 // The programming interface is simple -- 
4 //      Write the desired clock divider to address 1 (should be 1 or higher)
5 //      Status is in address 0.  A 1 indicates the last transaction is done and it is safe to
6 //          send another
7 //      Writing a byte to address 2 sends that byte over SPI.  When it is done, 
8 //          status (addr 0) goes high again, and the received byte can be read from address 3.
9
10 module sd_spi_wb
11   (input clk,
12    input rst,
13    
14    // SD Card interface
15    output sd_clk,
16    output sd_csn,
17    output sd_mosi,
18    input sd_miso,
19
20    input wb_cyc_i,
21    input wb_stb_i,
22    input wb_we_i,
23    input [1:0] wb_adr_i,
24    input [7:0] wb_dat_i,
25    output reg [7:0] wb_dat_o,
26    output reg wb_ack_o);
27
28    localparam ADDR_STATUS = 0;
29    localparam ADDR_CLKDIV = 1;
30    localparam ADDR_WRITE = 2;
31    localparam ADDR_READ = 3;
32
33    wire [7:0] status, rcv_dat;
34    reg [7:0]  clkdiv;
35    wire       ready;
36    reg        ack_d1;
37
38    reg        cs_reg;
39    assign     sd_csn = ~cs_reg;  // FIXME
40    
41    always @(posedge clk)
42      if(rst) ack_d1 <= 0;
43      else ack_d1 <= wb_ack_o;
44    
45    always @(posedge clk)
46      if(rst) wb_ack_o <= 0;
47      else wb_ack_o <= wb_cyc_i & wb_stb_i & ~ack_d1;
48    
49    always @(posedge clk)
50      case(wb_adr_i)
51        ADDR_STATUS : wb_dat_o <= {7'd0,ready};
52        ADDR_CLKDIV : wb_dat_o <= clkdiv;
53        ADDR_READ : wb_dat_o <= rcv_dat;
54        default : wb_dat_o <= 0;
55      endcase // case(wb_adr_i)
56
57    always @(posedge clk)
58      if(rst)
59        begin
60           clkdiv <= 200;
61           cs_reg <= 0;
62        end
63      else if(wb_we_i & wb_stb_i & wb_cyc_i & wb_ack_o)
64        case(wb_adr_i)
65          ADDR_STATUS : cs_reg <= wb_dat_i;
66          ADDR_CLKDIV : clkdiv <= wb_dat_i;
67        endcase // case(wb_adr_i)
68
69    wire       go = wb_we_i & wb_stb_i & wb_cyc_i & wb_ack_o & (wb_adr_i == ADDR_WRITE);
70    
71    sd_spi sd_spi(.clk(clk),.rst(rst),
72                  .sd_clk(sd_clk),.sd_mosi(sd_mosi),.sd_miso(sd_miso),
73                  .clk_div(clkdiv),.send_dat(wb_dat_i),.rcv_dat(rcv_dat),
74                  .go(go),.ready(ready) );
75
76 endmodule // sd_spi_wb