Subversion Repositories ngs

Rev

Rev 62 | Rev 97 | 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-2009
  4. //
  5. // SD-card dma controller
  6. //
  7. // includes dma address regs, dma control reg
  8. /*
  9.  
  10.  Read from sd-card modes:
  11.  
  12.   1. Full burst: first all 512 bytes are read into 512b buffer, then dma-bursted into main memory.
  13.      Not as fast in latency, but steals minimum of CPU cycles, though stops cpu for 1024+ clocks (if no other DMAs are active)
  14.  
  15.   2. As soon as possible: initiates DMA as soon as new byte is arrived into 512b buffer.
  16.      Makes bursts of 2-3 bytes, when applicable (more bytes arriven since beginning of dma_req up to acknowledge in dma_ack)
  17.  
  18.  Write to sd-card modes:
  19.  
  20.   1. Full burst: all 512 bytes are read in one burst, transmission starts as soon as first byte arrives to the buffer.
  21.      Uses minimum of CPU cycles (1024+) but in one chunk.
  22.  
  23.   2. DMA initiated as soon as spi is again ready to initiate new transfer (kind a throttling). Probably DMA pulls 2 or 4 bytes at once.
  24.  
  25. Structure:
  26.  
  27.  - FIFO based on mem512b and two pointers
  28.  
  29.  - SD controller - FSM which either reads or writes SD-card SPI iface
  30.  
  31.  - DMA controller - FSM which either reads or writes DMA iface
  32.  
  33.  - overall control - Controls operation of everything above, controls muxing of data to the
  34.    SD write port and FIFO write port, tracks operation end, maintains DMA_ADDRESS registers.
  35.  
  36. */
  37.  
  38.  
  39. module dma_sd(
  40.  
  41.         input  wire clk,
  42.         input  wire rst_n,
  43.  
  44.         // control to spi module of SD-card
  45.         //
  46.         output reg        sd_start,
  47.         input  wire       sd_rdy,
  48.         input  wire [7:0] sd_receiveddata,
  49.         output wire [7:0] sd_datatosend,
  50.         //
  51.         output reg        sd_override, // when 1, override sd_start and sd_datatosend to the sd spi module
  52.  
  53.  
  54.  
  55.         // signals for ports.v
  56.         //
  57.         input  wire [7:0] din,  // input and output from ports.v
  58.         output reg  [7:0] dout,
  59.         //
  60.         input  wire       module_select, // =1 - module selected for read-write operations from ports.v
  61.         input  wire       write_strobe,  // one-cycle positive write strobe - writes to the selected registers from din
  62.         //
  63.         input  wire [1:0] regsel, // 2'b00 - high address, 2'b01 - middle address, 2'b10 - low address, 2'b11 - control register
  64.  
  65.         // signals for DMA controller/DMA sequencer
  66.         //
  67.         output reg  [21:0] dma_addr,
  68.         output wire  [7:0] dma_wd,   // data written to DMA
  69.         input  wire  [7:0] dma_rd,   // data read from DMA
  70.         output reg         dma_rnw,
  71.         //
  72.         output wire        dma_req,
  73.         input  wire        dma_ack,
  74.         input  wire        dma_end
  75. );
  76.         localparam _HAD = 2'b00; // high address
  77.         localparam _MAD = 2'b01; // mid address
  78.         localparam _LAD = 2'b10; // low address
  79.         localparam _CST = 2'b11; // control and status
  80.  
  81.  
  82.         reg dma_snr;   // Send-NotReceive. Send to SDcard (==1) or Receive (==0) from it.
  83.         reg dma_burst; // whether burst transfers are on
  84.  
  85.  
  86.  
  87.  
  88.  
  89.         // control dout bus
  90.         always @*
  91.         case( regsel[1:0] )
  92.                 _HAD: dout = { 2'b00,  dma_addr[21:16] };
  93.                 _MAD: dout =           dma_addr[15:8];
  94.                 _LAD: dout =           dma_addr[7:0];
  95.                 _CST: dout = { dma_on, 5'bXXXXX, dma_burst, dma_snr};
  96.         endcase
  97.  
  98.         // ports.v write access & dma_addr control
  99.         always @(posedge clk, negedge rst_n)
  100.         if( !rst_n ) // async reset
  101.         begin
  102.                 dma_on    <= 1'b0;
  103.                 dma_snr   <= 1'b0; // receive is less dangerous since it won't destroy SDcard info
  104.                 dma_burst <= 1'b0;
  105.         end
  106.         else // posedge clk
  107.         begin
  108.                 // dma_on control
  109.                 if( module_select && write_strobe && (regsel==_CST) )
  110.                 begin
  111.                         dma_on    <= din[7];
  112.                         dma_burst <= din[1];
  113.                         dma_snr   <= din[0];
  114.                 end
  115.                 else if( dma_finish )
  116.                 begin
  117.                         dma_on <= 1'b0;
  118.                 end
  119.  
  120.                 // dma_addr control
  121.                 if( dma_ack && dma_on )
  122.                         dma_addr <= dma_addr + 22'd1; // increment on beginning of DMA transfer
  123.                 else if( module_select && write_strobe )
  124.                 begin
  125.                         if( regsel==_HAD )
  126.                                 dma_addr[21:16] <= din[5:0];
  127.                         else if( regsel==_MAD )
  128.                                 dma_addr[15:8]  <= din[7:0];
  129.                         else if( regsel==_LAD )
  130.                                 dma_addr[7:0]   <= din[7:0];
  131.                 end
  132.         end
  133.  
  134.  
  135.  
  136. // fifo,dma,sd control FSMs/etc.
  137.  
  138.         reg init;
  139.         wire wr_stb,rd_stb;
  140.         wire wdone,rdone,empty;
  141.  
  142.         wire [7:0] fifo_wd; // data for FIFO to be written
  143.         wire [7:0] fido_rd; // data read from FIFO
  144.  
  145.         // MUX data to FIFO
  146.         assign fifo_wd       = dma_snr ? dma_rd  : sd_receiveddata;
  147.         // MUX data to SDcard
  148.         assign sd_datatosend = dma_snr ? fifo_rd : 8'hFF;
  149.  
  150.         // connect dma in to fifo out without muxing
  151.         assign dma_wd = fifo_rd;
  152.  
  153.         dma_fifo_oneshot sd_fifo(
  154.                 .clk(clk),
  155.                 .rst_n(rst_n),
  156.  
  157.                 .init(init),
  158.  
  159.                 .wr_stb(wr_stb),
  160.                 .rd_stb(rd_stb),
  161.  
  162.                 .wdone(wdone),
  163.                 .rdone(rdone),
  164.                 .empty(empty),
  165.  
  166.                 .wd(fifo_wd),
  167.                 .rd(fifo_rd)
  168.         );
  169.  
  170.         // fifo control
  171.         reg sd_wr_stb,sd_rd_stb;   // set in SD FSM
  172.         reg dma_wr_stb,dma_rd_stb; // set in DMA FSM
  173.         //
  174.         assign wr_stb = sd_wr_stb | dma_wr_stb;
  175.         assign rd_stb = sd_rd_stb | dma_rd_stb;
  176.  
  177.         // dma control
  178.         wire dma_put_req;
  179.         wire dma_get_req;
  180.  
  181.         assign dma_req = dma_put_req | dma_get_req;
  182.  
  183.  
  184.  
  185.         reg sd_go; // start strobe for SD FSM
  186.         reg sd_idle; // whether SD FSM is idle
  187.  
  188.         reg dma_go;
  189.         reg dma_idle;
  190.  
  191.  
  192.  
  193.  
  194.  
  195.  
  196.         // SD-card controlling FSM
  197.  
  198.         reg [2:0] sd_state, sd_next_state;
  199.  
  200.         localparam SD_IDLE   = 3'b000;
  201.         localparam SD_READ1  = 3'b100;
  202.         localparam SD_READ2  = 3'b101;
  203.         localparam SD_WRITE1 = 3'b110;
  204.         localparam SD_WRITE2 = 3'b111;
  205.  
  206.         always @(posedge clk, negedge rst_n)
  207.         begin
  208.                 if( !rst_n )
  209.                 begin
  210.                         sd_state = SD_IDLE;
  211.                 end
  212.                 else // posedge clk
  213.                 begin
  214.                         sd_state <= sd_next_state;
  215.                 end
  216.         end
  217.  
  218.         always @*
  219.         begin
  220.                 case( sd_state )
  221. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  222.                 SD_IDLE:begin
  223.                         if( sd_go )
  224.                         begin
  225.                                 if( sd_snr ) // send to SD
  226.                                 begin
  227.                                         sd_next_state = SD_WRITE1;
  228.                                 end
  229.                                 else // !sd_snr: read from SD
  230.                                 begin
  231.                                         sd_next_state = SD_READ1;
  232.                                 end
  233.                         end
  234.                         else
  235.                         begin
  236.                                 sd_next_state = SD_IDLE;
  237.                         end
  238.                 end
  239. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  240.                 SD_READ1:begin
  241.                         if( wdone )
  242.                         begin
  243.                                 sd_next_state = SD_IDLE;
  244.                         end
  245.                         else // !wdone - can still send bytes to the fifo
  246.                         begin
  247.                                 if( !sd_rdy ) // not ready with previous byte - wait here
  248.                                 begin
  249.                                         sd_next_state = SD_READ1;
  250.                                 end
  251.                                 else // sd_rdy - can proceed further
  252.                                 begin
  253.                                         sd_next_state = SD_READ2;
  254.                                 end
  255.                         end
  256.                 end
  257. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  258.                 SD_READ2:begin
  259.                         sd_next_state = SD_READ1;
  260.                 end
  261. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  262.                 SD_WRITE1:begin
  263.                         if( rdone )
  264.                         begin
  265.                                 sd_next_state = SD_IDLE;
  266.                         end
  267.                         else
  268.                         begin
  269.                                 if( sd_rdy && !empty ) // whether sd ready and we can take next byte from fifo
  270.                                 begin
  271.                                         sd_next_state = SD_WRITE2;
  272.                                 end
  273.                                 else // can't start next byte: wait
  274.                                 begin
  275.                                         sd_next_state = SD_WRITE1;
  276.                                 end
  277.                         end
  278.                 end
  279. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  280.                 SD_WRITE2:begin
  281.                         sd_next_state = SD_WRITE1;
  282.                 end
  283. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  284.                 default:begin
  285.                         sd_next_state = SD_IDLE;
  286.                 end
  287. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  288.                 endcase
  289.         end
  290.  
  291.         always @(posedge clk, negedge rst_n)
  292.         begin
  293.                 if( !rst_n )
  294.                 begin
  295.                         sd_wr_stb   = 1'b0;
  296.                         sd_rd_stb   = 1'b0;
  297.                         sd_start    = 1'b0;
  298.                         sd_override = 1'b0;
  299.  
  300.                         sd_idle     = 1'b0;
  301.                 end
  302.                 else // posedge clk
  303.                 begin
  304.                         case( sd_next_state )
  305. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  306.                         SD_IDLE:begin
  307.                                 sd_wr_stb   <= 1'b0;
  308.                                 sd_rd_stb   <= 1'b0;
  309.                                 sd_start    <= 1'b0;
  310.                                 sd_override <= 1'b0;
  311.  
  312.                                 sd_idle     <= 1'b1;
  313.                         end
  314. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  315.                         SD_READ1:begin
  316.                                 sd_override <= 1'b1; // takeover SD card SPI iface
  317.                                 sd_start    <= 1'b0;
  318.                                 sd_wr_stb   <= 1'b0;
  319.  
  320.                                 sd_idle     <= 1'b0;
  321.                         end
  322. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  323.                         SD_READ2:begin
  324.                                 sd_start  <= 1'b1; // trigger new SPI exchange
  325.                                 sd_wr_stb <= 1'b1; // trigger FIFO write
  326.                         end
  327. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  328.                         SD_WRITE1:begin
  329.                                 sd_override <= 1'b1;
  330.                                 sd_start    <= 1'b0;
  331.                                 sd_rd_str   <= 1'b0;
  332.  
  333.                                 sd_idle     <= 1'b0;
  334.                         end
  335. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  336.                         SD_WRITE2:begin
  337.                                 sd_start  <= 1'b1;
  338.                                 sd_rd_stb <= 1'b1;
  339.                         end
  340. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  341.                         endcase
  342.                 end
  343.         end
  344.  
  345.  
  346.  
  347.  
  348.  
  349.  
  350.         // DMA-controlling FSM
  351.  
  352.         reg [3:0] dma_state, dma_next_state
  353.  
  354.         localparam DMA_IDLE
  355.         localparam DMA_PUT_WAIT
  356.         localparam DMA_PUT_RUN
  357.  
  358.         always @(posedge clk, negedge rst_n)
  359.         begin
  360.                 if( !rst_n )
  361.                 begin
  362.                         dma_state = DMA_IDLE;
  363.                 end
  364.                 else // posedge clk
  365.                 begin
  366.                         dma_state <= dma_next_state;
  367.                 end
  368.         end
  369.  
  370.         always @*
  371.         begin
  372.                 case( dma_state )
  373. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  374.                 DMA_IDLE:begin
  375.                         if( dma_go )
  376.                         begin
  377.                                 if( dma_snr )
  378.                                 begin
  379.                                         ........dma_state = DMA_GET_WAIT;
  380.                                 end
  381.                                 else // !dma_snr
  382.                                 begin
  383.                                         dma_next_state = DMA_PUT_WAIT;
  384.                                 end
  385.                         end
  386.                         else
  387.                         begin
  388.                                 dma_next_state = DMA_IDLE;
  389.                         end
  390.                 end
  391. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  392.                 DMA_PUT_WAIT:begin
  393.                         if( rdone )
  394.                         begin
  395.                                 dma_next_state = DMA_IDLE;
  396.                         end
  397.                         else // !rdone
  398.                         begin
  399.                                 if( !empty ) // fifo is not empty
  400.                                 begin
  401.                                         dma_next_state = DMA_PUT_RUN;
  402.                                 end
  403.                                 else // fifo empty
  404.                                 begin
  405.                                         dma_next_state = DMA_PUT_WAIT;
  406.                                 end
  407.                         end
  408.                 end
  409. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  410.                 DMA_PUT_RUN:begin
  411.                         if( rdone )
  412.                         begin
  413.                                 dma_next_state = DMA_IDLE;
  414.                         end
  415.                         else
  416.                         begin
  417.                                 if( empty )
  418.                                 begin
  419.                                         dma_next_state = DMA_PUT_WAIT;
  420.                                 end
  421.                                 else // !empty
  422.                                 begin
  423.                                         dma_next_state = DMA_PUT_RUN;
  424.                                 end
  425.                         end
  426.                 end
  427. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  428. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  429. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  430. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  431. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  432. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  433. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  434. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  435. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  436.                 endcase
  437.         end
  438.  
  439.         always @(posedge clk, negedge rst_n)
  440.         begin
  441.                 if( !rst_n )
  442.                 begin
  443.  
  444.                 end
  445.                 else // posedge clk
  446.                 begin
  447.                         case( dma_next_state )
  448. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  449. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  450. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  451. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  452. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  453. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  454. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  455. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  456. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  457. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  458. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  459. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  460. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  461. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  462. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  463. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  464. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  465. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  466. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  467.                         endcase
  468.                 end
  469.         end
  470.  
  471. endmodule
  472.  
  473.  
  474.  
  475.  
  476.