Subversion Repositories ngs

Rev

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

  1. /*
  2.   read sequence
  3.  
  4. clk   ``\____/````\____/` ..... _/````\____/````\____/` ..... _/````\____/````\____/`
  5.              |         |         |         |         |         |         |
  6. start XXXX```````````\__ ....... ____________________________________________________
  7.              |         |         |         |         |         |         |
  8. rnw   XXXXXX```XXXXXXXXX ....... XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  9.              |         | some    |         |         |         |         |
  10. ready XXXXXXX\__________ clocks __/``````````````````  ....... ```````````\__________
  11.                          before                                |         |
  12. rdat  ------------------ ready  -< cell 0  | cell 1  | ....... |last cell>-----------
  13.              |         |         |         |         |         |         |
  14. stop  XXXXXXX\__________ ....... _____________________ ....... ___________/``````````
  15.                                                                             ^all operations stopped until next start strobe
  16.  
  17.  
  18.  
  19.   write sequence
  20.  
  21. clk   ``\____/````\____/` ..... _/````\____/````\____/````\____/````\____/````\____/````\____/````\____/
  22.              |         | some    |         | some    |         |         |         |         |         |
  23. start XXXX```````````\__ ....... _____________ .... ______________ .... ________________________________
  24.              |         | clocks  |         | clocks  |         |         |         |         |         |
  25. rnw   XXXXXX___XXXXXXXXX ....... XXXXXXXXXXXXX .... XXXXXXXXXXXXXX .... XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  26.              |         | before  |         | before  |         |         |         |         |         |
  27. ready XXXXXXX\__________ ....... _/`````````\_ .... __/`````````\_ .... __/`````````\___________________
  28.              |         | first   |         | next    |         |         |         |         |         |
  29. wdat  XXXXXXXXXXXXXXXXXXXXXXXXXXXX< cell 0  >X .... XX< cell 1  >X .... XX<last cell>XXXXXXXXXXXXXXXXXXX
  30.              |         | ready   |         | ready   |         |         |         |         |         |
  31. stop  XXXXXXX\__________ ....... _____________ .... ______________ .... ____________/```````````````````
  32.              |         | strobe  |         | strobe  |         |         |         |         |         |
  33.  
  34.  
  35.  
  36.  
  37. clk   ``\____/````\____/````\____/````\____/````\____/````\____/````\____/````\____/````\____/````\____/````\____/````\____/``
  38.              |         |         |         |         |         |         |         |         |         |         |         |
  39. ready __________________/`````````\___________________/`````````\___________________/`````````\___________________/`````````\_
  40.              |         |         |         |         |         |         |         |         |         |         |         |
  41. wdat           cell 0             | cell 1                      | cell 2                      | cell 3                      |
  42.              |         |         |         |         |         |         |         |         |         |         |         |
  43. sram_adr XXXXXXXXXXXXXXXXXXXXXXXXX| 0                           | 1                           | 2                           |
  44.              |         |         |         |         |         |         |         |         |         |         |         |
  45. sram_dat XXXXXXXXXXXXXXXXXXXXXXXXX| cell 0                      | cell 1                      | cell 2                      |
  46.              |         |         |         |         |         |         |         |         |         |         |         |
  47. sram_we_n```````````````````````````````````\_________/```````````````````\_________/```````````````````\_________/``````````
  48.              | BEG     | PRE1    | PRE2    |         |         |         |         |         |         |         |         |
  49.              |         |         | CYC1    | CYC2    | CYC3    | CYC1    | CYC2    | CYC3    | CYC1    | CYC2    | CYC3    |
  50.  
  51.  
  52.  
  53.  
  54.  
  55.  
  56. */
  57.  
  58.  
  59. module sram_control(
  60.  
  61.         clk,
  62.         clk2, //latching of SRAM data out
  63.  
  64.         start, // initializing input, address=0
  65.  
  66.         stop, // when all addresses are done, nothing will happen after stop is set, need another start signal
  67.  
  68.         rnw, // 1 - read, 0 - write sequence (latched when start=1)
  69.  
  70.         ready, // strobe. when writing, one mean that data from wdat written to the memory (2^SRAM_ADDR_SIZE strobes total)
  71.                // when reading, one mean that data read from memory is on rdat output (2^SRAM_ADDR_SIZE strobes total)
  72.  
  73.  
  74.         wdat, // input, data to be written to memory
  75.         rdat, // output, data last read from memory
  76.  
  77.  
  78.  
  79.         SRAM_DQ,   // sram inout databus
  80.  
  81.         SRAM_ADDR, // sram address bus
  82.  
  83.         SRAM_UB_N, // sram control signals
  84.         SRAM_LB_N, //
  85.         SRAM_WE_N, //
  86.         SRAM_CE_N, //
  87.         SRAM_OE_N  //
  88. );
  89.  
  90. parameter SRAM_DATA_SIZE = 16;
  91. parameter SRAM_ADDR_SIZE = 18;
  92.  
  93.  
  94.         input clk;
  95.         input clk2;
  96.  
  97.         input start,rnw;
  98.  
  99.         output stop;
  100.         reg    stop;
  101.  
  102.         output ready;
  103.         reg    ready;
  104.  
  105.         input [SRAM_DATA_SIZE-1:0] wdat;
  106.  
  107.         output [SRAM_DATA_SIZE-1:0] rdat;
  108.         reg    [SRAM_DATA_SIZE-1:0] rdat;
  109.  
  110.  
  111.         inout [SRAM_DATA_SIZE-1:0] SRAM_DQ;
  112.         wire  [SRAM_DATA_SIZE-1:0] SRAM_DQ;
  113.  
  114.         output [SRAM_ADDR_SIZE-1:0] SRAM_ADDR;
  115.         wire   [SRAM_ADDR_SIZE-1:0] SRAM_ADDR;
  116.  
  117.         output SRAM_UB_N,SRAM_LB_N,SRAM_WE_N,SRAM_CE_N,SRAM_OE_N;
  118.         reg    SRAM_UB_N,SRAM_LB_N, /*SRAM_WE_N,*/ SRAM_CE_N,SRAM_OE_N;
  119.         wire SRAM_WE_N;
  120.  
  121.         reg SRAM_WE_N_reg;
  122.  
  123.         assign SRAM_WE_N = SRAM_WE_N_reg; // | clk;
  124.  
  125.         reg [SRAM_DATA_SIZE-1:0] wdat2;
  126.         reg dbin; //data bus direction control
  127.  
  128.         reg  [SRAM_ADDR_SIZE:0] sram_addr_ctr; // one bit bigger to have stop flag
  129.         wire [SRAM_ADDR_SIZE:0] sram_addr_nxt; // next sram address
  130.  
  131.  
  132.         reg [SRAM_DATA_SIZE-1:0] rdat2;
  133.  
  134.         assign SRAM_ADDR = sram_addr_ctr[SRAM_ADDR_SIZE-1:0];
  135.  
  136.         assign sram_addr_nxt = sram_addr_ctr + 1;
  137.  
  138.  
  139.  
  140.  
  141.         // data bus control
  142.         assign SRAM_DQ = dbin ? 'hZ : wdat2;
  143.  
  144.  
  145.         always @(posedge clk)
  146.         begin
  147.                 rdat <= SRAM_DQ;
  148.         end
  149.  
  150.  
  151.         always @(posedge clk)
  152.         begin
  153.                 if( ready ) wdat2 <= wdat;
  154.         end
  155.  
  156.  
  157.  
  158.  
  159.  
  160.         reg [4:0] curr_state,next_state;
  161.  
  162.         parameter START_STATE = 5'h00; // reset state
  163.  
  164.         parameter INIT_STATE  = 5'h01; // initialization state
  165.  
  166.         parameter READ_BEG    = 5'h02; // read branch: prepare signals
  167.         parameter READ_PRE    = 5'h03;
  168.         parameter READ_CYCLE1 = 5'h04; // read in progress: increment address, set ready, out data, do so until all addresses done
  169.         parameter READ_CYCLE2 = 5'h05; // read in progress: increment address, set ready, out data, do so until all addresses done
  170.         parameter READ_POST   = 5'h06;
  171.         parameter READ_END    = 5'h07; // read end: deassert some signals, go to stop state
  172.  
  173.         parameter WRITE_BEG   = 5'h10; // prepare signals
  174.         parameter WRITE_PRE1  = 5'h11; // assert ready
  175.         parameter WRITE_PRE2  = 5'h12; // capture wdat, negate ready, NO INCREMENT address, next state is WRITE_CYC2
  176.         parameter WRITE_CYC1  = 5'h13; // capture wdat, negate ready, increment address
  177.         parameter WRITE_CYC1E = 5'h14;
  178.         parameter WRITE_CYC2  = 5'h15; // assert SRAM_WE_N, go to WRITE_END if sram_addr_nxt is out of memory region
  179.         parameter WRITE_CYC3  = 5'h16; // negate SRAM_WE_N, assert ready (wdat will be captured in WRITE_CYC1)
  180.         parameter WRITE_END   = 5'h17; // deassert sram control signals, go to STOP_STATE
  181.  
  182.  
  183.         parameter STOP_STATE  = 5'h1F; // full stop state
  184.  
  185.  
  186.  
  187.         // FSM states
  188.         always @*
  189.         begin
  190.                 case( curr_state )
  191.  
  192. ////////////////////////////////////////////////////////////////////////
  193.                 START_STATE:
  194.                         next_state = INIT_STATE;
  195.  
  196.  
  197. ////////////////////////////////////////////////////////////////////////
  198.                 INIT_STATE:
  199.                 begin
  200.                         if( rnw ) // read
  201.                                 next_state = READ_BEG;
  202.                         else // !rnw - write
  203.                                 next_state = WRITE_BEG;
  204.                 end
  205.  
  206.  
  207.  
  208.  
  209. ////////////////////////////////////////////////////////////////////////
  210.                 READ_BEG:
  211.                         next_state = READ_PRE;
  212.  
  213.                 READ_PRE:
  214.                         next_state = READ_CYCLE1;
  215.  
  216.  
  217.                 READ_CYCLE1:
  218.                         next_state = READ_CYCLE2;
  219.  
  220.                 READ_CYCLE2:
  221.                         if( !sram_addr_ctr[SRAM_ADDR_SIZE] )
  222.                                 next_state = READ_CYCLE1;
  223.                         else
  224.                                 next_state = READ_POST;
  225.  
  226.  
  227.                 READ_POST:
  228.                         next_state = READ_END;
  229.  
  230.                 READ_END:
  231.                         next_state = STOP_STATE;
  232.  
  233.  
  234.  
  235. ////////////////////////////////////////////////////////////////////////
  236.                 WRITE_BEG:
  237.                         next_state = WRITE_PRE1;
  238.  
  239.                 WRITE_PRE1:
  240.                         next_state = WRITE_PRE2;
  241.  
  242.                 WRITE_PRE2:
  243.                         next_state = WRITE_CYC1E;
  244.  
  245.  
  246.                 WRITE_CYC1:
  247.                         next_state = WRITE_CYC1E;
  248.  
  249.                 WRITE_CYC1E:
  250.                         next_state = WRITE_CYC2;
  251.  
  252.                 WRITE_CYC2:
  253.                         if( !sram_addr_nxt[SRAM_ADDR_SIZE] )
  254.                                 next_state = WRITE_CYC3;
  255.                         else
  256.                                 next_state = WRITE_END;
  257.  
  258.                 WRITE_CYC3:
  259.                         next_state = WRITE_CYC1;
  260.  
  261.                 WRITE_END:
  262.                         next_state = STOP_STATE;
  263.  
  264.  
  265.  
  266. ////////////////////////////////////////////////////////////////////////
  267.                 STOP_STATE:
  268.                         next_state = STOP_STATE;
  269.  
  270.  
  271.  
  272.  
  273. ////////////////////////////////////////////////////////////////////////
  274.                 default:
  275.                         next_state = STOP_STATE;
  276.  
  277.                 endcase
  278.  
  279.         end
  280.  
  281.  
  282.  
  283.         // FSM flip-flops
  284.         always @(posedge clk)
  285.         begin
  286.                 if( start )
  287.                         curr_state <= START_STATE;
  288.                 else
  289.                         curr_state <= next_state;
  290.         end
  291.  
  292.  
  293.         // FSM outputs
  294.         always @(posedge clk)
  295.         begin
  296.                 case( next_state )
  297.  
  298. ////////////////////////////////////////////////////////////////////////
  299.                 INIT_STATE:
  300.                 begin
  301.                         stop <= 1'b0;
  302.  
  303.                         SRAM_UB_N <= 1'b1;
  304.                         SRAM_LB_N <= 1'b1;
  305.                         SRAM_CE_N <= 1'b1;
  306.                         SRAM_OE_N <= 1'b1;
  307.                         SRAM_WE_N_reg <= 1'b1;
  308.  
  309.                         dbin <= 1'b1;
  310.  
  311.                         sram_addr_ctr <= 0;
  312.  
  313.                         ready <= 1'b0;
  314.                 end
  315.  
  316.  
  317.  
  318. ////////////////////////////////////////////////////////////////////////
  319.                 READ_BEG:
  320.                 begin
  321.                         SRAM_UB_N <= 1'b0;
  322.                         SRAM_LB_N <= 1'b0;
  323.                         SRAM_CE_N <= 1'b0;
  324.                         SRAM_OE_N <= 1'b0;
  325.                 end
  326.  
  327.                 READ_PRE:
  328.                 begin
  329. //                      sram_addr_ctr <= sram_addr_nxt;
  330.                 end
  331.  
  332.  
  333.                 READ_CYCLE1:
  334.                 begin
  335.                         ready <= 1'b1;
  336.  
  337.                   sram_addr_ctr <= sram_addr_nxt;
  338.                 end
  339.  
  340.                 READ_CYCLE2:
  341.                 begin
  342.                         ready <= 1'b0;
  343.                 end
  344.  
  345.  
  346.                 READ_POST:
  347.                 begin
  348.                         ready <= 1'b0; // in read sequence, ready and data are 2 cycles past the actual read.
  349.                 end
  350.  
  351.                 READ_END:
  352.                 begin
  353.                         SRAM_UB_N <= 1'b1;
  354.                         SRAM_LB_N <= 1'b1;
  355.                         SRAM_CE_N <= 1'b1;
  356.                         SRAM_OE_N <= 1'b1;
  357.  
  358.                         ready <= 1'b0;
  359.                 end
  360.  
  361.  
  362.  
  363.  
  364. ////////////////////////////////////////////////////////////////////////
  365.                 WRITE_BEG:
  366.                 begin
  367.                         SRAM_UB_N <= 1'b0;
  368.                         SRAM_LB_N <= 1'b0;
  369.                         SRAM_CE_N <= 1'b0;
  370.  
  371.                         dbin <= 1'b0;
  372.                 end
  373.  
  374.                 WRITE_PRE1:
  375.                 begin
  376.                         ready <= 1'b1;
  377.                 end
  378.  
  379.                 WRITE_PRE2:
  380.                 begin
  381.                         ready <= 1'b0;
  382.                 end
  383.  
  384.  
  385.                 WRITE_CYC1:
  386.                 begin
  387.                         ready <= 1'b0;
  388.  
  389.                         sram_addr_ctr <= sram_addr_nxt;
  390.                 end
  391.  
  392.                 WRITE_CYC2:
  393.                 begin
  394.                         SRAM_WE_N_reg <= 1'b0;
  395.                 end
  396.  
  397.                 WRITE_CYC3:
  398.                 begin
  399.                         SRAM_WE_N_reg <= 1'b1;
  400.  
  401.                         ready <= 1'b1;
  402.                 end
  403.  
  404.                 WRITE_END:
  405.                 begin
  406.                         ready <= 1'b0;
  407.  
  408.                         SRAM_WE_N_reg <= 1'b1;
  409.                         SRAM_UB_N <= 1'b1;
  410.                         SRAM_LB_N <= 1'b1;
  411.                         SRAM_CE_N <= 1'b1;
  412.                 end
  413.  
  414.  
  415. ////////////////////////////////////////////////////////////////////////
  416.                 STOP_STATE:
  417.                 begin
  418.                         stop <= 1'b1;
  419.                 end
  420.  
  421.                 endcase
  422.         end
  423.  
  424.  
  425. endmodule
  426.  
  427.