Subversion Repositories ngs

Rev

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

  1. // part of NeoGS project
  2. //
  3. // (c) NedoPC 2007-2013
  4. //
  5. // SD-card dma controller
  6.  
  7. /*
  8.  
  9.  supports yet:
  10.   1. only read of SD card (512 bytes at once)
  11.   2. only full bursing writeback of read data to memory
  12.  
  13.  SD read algo:
  14.  send FFs always. Check replies.
  15.  After first non-FF reply receive 512 bytes into FPGA mem then into RAM
  16.  
  17. */
  18.  
  19.  
  20. module dma_sd(
  21.  
  22.         input  wire clk,
  23.         input  wire rst_n,
  24.  
  25.         // control to spi module of SD-card
  26.         //
  27.         output wire       sd_start,
  28.         input  wire       sd_rdy,
  29.         input  wire [7:0] sd_recvdata,
  30.  
  31.        
  32.         // signals for ports.v
  33.         //
  34.         input  wire [7:0] din,  // input and output from ports.v
  35.         output reg  [7:0] dout,
  36.         //
  37.         input  wire       module_select, // =1 - module selected for read-write operations from ports.v
  38.         input  wire       write_strobe,  // one-cycle positive write strobe - writes to the selected registers from din
  39.         //
  40.         input  wire [1:0] regsel, // 2'b00 - high address, 2'b01 - middle address, 2'b10 - low address, 2'b11 - control register
  41.  
  42.         // signals for DMA controller/DMA sequencer
  43.         //
  44.         output reg  [21:0] dma_addr,
  45.         output wire  [7:0] dma_wd,   // data written to DMA
  46.         output wire        dma_rnw,
  47.         //
  48.         output wire        dma_req,
  49.         input  wire        dma_ack,
  50.         input  wire        dma_end
  51. );
  52.  
  53.         reg dma_on;
  54.         reg [21:0] dma_addr;
  55.  
  56.         wire dma_finish;
  57.  
  58.         reg [3:0] state, next_state;
  59.  
  60.        
  61.  
  62.         localparam _HAD = 2'b00; // high address
  63.         localparam _MAD = 2'b01; // mid address
  64.         localparam _LAD = 2'b10; // low address
  65.         localparam _CST = 2'b11; // control and status
  66.  
  67.  
  68.         // only dma writes
  69.         assign dma_rnw = 1'b0;
  70.  
  71.  
  72.         // control dout bus
  73.         always @*
  74.         case( regsel[1:0] )
  75.                 _HAD: dout = { 2'b00,  dma_addr[21:16] };
  76.                 _MAD: dout =           dma_addr[15:8];
  77.                 _LAD: dout =           dma_addr[7:0];
  78.                 _CST: dout = { dma_on, 7'bXXX_XXXX };
  79.         endcase
  80.  
  81.  
  82.         // dma_on control
  83.         always @(posedge clk, negedge rst_n)
  84.         if( !rst_n )
  85.                 dma_on <= 1'b0;
  86.         else if( dma_finish )
  87.                 dma_on <= 1'b0;
  88.         else if( module_select && write_strobe && (regsel==_CST) )
  89.                 dma_on <= din[7];
  90.  
  91.  
  92.         // dma_addr control
  93.         always @(posedge clk)
  94.         if( dma_ack && dma_on )
  95.                 dma_addr <= dma_addr + 22'd1; // increment on successfull DMA transfer
  96.         else if( module_select && write_strobe )
  97.         begin
  98.                 if( regsel==_HAD )
  99.                         dma_addr[21:16] <= din[5:0];
  100.                 else if( regsel==_MAD )
  101.                         dma_addr[15:8]  <= din[7:0];
  102.                 else if( regsel==_LAD )
  103.                         dma_addr[7:0]   <= din[7:0];
  104.         end
  105.  
  106.  
  107.  
  108.  
  109.  
  110.  
  111.         // controlling FSM
  112.  
  113.         localparam _IDLE   = 4'd0;
  114.         localparam _WRDY1  = 4'd1; // send start to SPI
  115.         localparam _WRDY2  = 4'd2; //
  116.  
  117.         always @(posedge clk, negedge dma_on)
  118.         if( !dma_on )
  119.                 sd_state = _IDLE;
  120.         else // posedge clk
  121.                 state <= next_state;
  122.  
  123.         always @*
  124.         case( sd_state )
  125.  
  126.         _IDLE: next_state = _WRDY1;
  127.        
  128.         _WRDY1:begin
  129.                 next_state = _WRDY2;
  130.         end
  131.        
  132.         _WRDY2:begin
  133.                 if( !sd_rdy )
  134.                         next_state = _WRDY2;
  135.                 else if( sd_recvdata==8'hFF )
  136.                         next_state = _WRDY1;
  137.                 else if( sd_recvdata==8'hFE )
  138.                         next_state = _RECV;
  139.                 else
  140.                         next_state = _STOP;
  141.         end
  142.  
  143.        
  144.         _STOP:begin
  145.                 next_state = _STOP; // rely on dma_on going to 0 and resetting everything
  146.         end
  147.        
  148.         endcase
  149.  
  150.  
  151.         // sd_start
  152.         assign sd_start = ( state==_WRDY1 || );
  153.  
  154.        
  155.         // dma_finish
  156.         assign dma_finish = ( state==_STOP );
  157.  
  158.        
  159.        
  160.        
  161.         always @(posedge clk, negedge rst_n)
  162.         begin
  163.                 if( !rst_n )
  164.                 begin
  165.                         sd_wr_stb   = 1'b0;
  166.                         sd_rd_stb   = 1'b0;
  167.                         sd_start    = 1'b0;
  168.                         sd_override = 1'b0;
  169.  
  170.                         sd_idle     = 1'b0;
  171.                 end
  172.                 else // posedge clk
  173.                 begin
  174.                         case( sd_next_state )
  175. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  176.                         SD_IDLE:begin
  177.                                 sd_wr_stb   <= 1'b0;
  178.                                 sd_rd_stb   <= 1'b0;
  179.                                 sd_start    <= 1'b0;
  180.                                 sd_override <= 1'b0;
  181.  
  182.                                 sd_idle     <= 1'b1;
  183.                         end
  184. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  185.                         SD_READ1:begin
  186.                                 sd_override <= 1'b1; // takeover SD card SPI iface
  187.                                 sd_start    <= 1'b0;
  188.                                 sd_wr_stb   <= 1'b0;
  189.  
  190.                                 sd_idle     <= 1'b0;
  191.                         end
  192. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  193.                         SD_READ2:begin
  194.                                 sd_start  <= 1'b1; // trigger new SPI exchange
  195.                                 sd_wr_stb <= 1'b1; // trigger FIFO write
  196.                         end
  197. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  198.                         SD_WRITE1:begin
  199.                                 sd_override <= 1'b1;
  200.                                 sd_start    <= 1'b0;
  201.                                 sd_rd_str   <= 1'b0;
  202.  
  203.                                 sd_idle     <= 1'b0;
  204.                         end
  205. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  206.                         SD_WRITE2:begin
  207.                                 sd_start  <= 1'b1;
  208.                                 sd_rd_stb <= 1'b1;
  209.                         end
  210. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  211.                         endcase
  212.                 end
  213.         end
  214.  
  215.  
  216.  
  217.  
  218.  
  219.  
  220.         // DMA-controlling FSM
  221.  
  222.         reg [3:0] dma_state, dma_next_state
  223.  
  224.         localparam DMA_IDLE
  225.         localparam DMA_PUT_WAIT
  226.         localparam DMA_PUT_RUN
  227.  
  228.         always @(posedge clk, negedge rst_n)
  229.         begin
  230.                 if( !rst_n )
  231.                 begin
  232.                         dma_state = DMA_IDLE;
  233.                 end
  234.                 else // posedge clk
  235.                 begin
  236.                         dma_state <= dma_next_state;
  237.                 end
  238.         end
  239.  
  240.         always @*
  241.         begin
  242.                 case( dma_state )
  243. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  244.                 DMA_IDLE:begin
  245.                         if( dma_go )
  246.                         begin
  247.                                 if( dma_snr )
  248.                                 begin
  249.                                         ........dma_state = DMA_GET_WAIT;
  250.                                 end
  251.                                 else // !dma_snr
  252.                                 begin
  253.                                         dma_next_state = DMA_PUT_WAIT;
  254.                                 end
  255.                         end
  256.                         else
  257.                         begin
  258.                                 dma_next_state = DMA_IDLE;
  259.                         end
  260.                 end
  261. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  262.                 DMA_PUT_WAIT:begin
  263.                         if( rdone )
  264.                         begin
  265.                                 dma_next_state = DMA_IDLE;
  266.                         end
  267.                         else // !rdone
  268.                         begin
  269.                                 if( !empty ) // fifo is not empty
  270.                                 begin
  271.                                         dma_next_state = DMA_PUT_RUN;
  272.                                 end
  273.                                 else // fifo empty
  274.                                 begin
  275.                                         dma_next_state = DMA_PUT_WAIT;
  276.                                 end
  277.                         end
  278.                 end
  279. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  280.                 DMA_PUT_RUN:begin
  281.                         if( rdone )
  282.                         begin
  283.                                 dma_next_state = DMA_IDLE;
  284.                         end
  285.                         else
  286.                         begin
  287.                                 if( empty )
  288.                                 begin
  289.                                         dma_next_state = DMA_PUT_WAIT;
  290.                                 end
  291.                                 else // !empty
  292.                                 begin
  293.                                         dma_next_state = DMA_PUT_RUN;
  294.                                 end
  295.                         end
  296.                 end
  297. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  298. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  299. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  300. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  301. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  302. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  303. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  304. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  305. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  306.                 endcase
  307.         end
  308.  
  309.         always @(posedge clk, negedge rst_n)
  310.         begin
  311.                 if( !rst_n )
  312.                 begin
  313.  
  314.                 end
  315.                 else // posedge clk
  316.                 begin
  317.                         case( dma_next_state )
  318. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  319. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  320. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  321. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  322. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  323. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  324. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  325. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  326. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  327. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  328. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  329. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  330. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  331. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  332. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  333. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  334. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  335. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  336. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  337.                         endcase
  338.                 end
  339.         end
  340.  
  341. endmodule
  342.  
  343.  
  344.  
  345.  
  346.