Subversion Repositories ngs

Rev

Rev 3 | 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.         reg   [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.  
  120.  
  121.         reg [SRAM_DATA_SIZE-1:0] wdat2;
  122.         reg dbin; //data bus direction control
  123.  
  124.         reg  [SRAM_ADDR_SIZE:0] sram_addr_ctr; // one bit bigger to have stop flag
  125.         wire [SRAM_ADDR_SIZE:0] sram_addr_nxt; // next sram address
  126.  
  127.  
  128.         reg [SRAM_DATA_SIZE-1:0] rdat2;
  129.  
  130.         assign SRAM_ADDR = sram_addr_ctr[SRAM_ADDR_SIZE-1:0];
  131.  
  132.         assign sram_addr_nxt = sram_addr_ctr + 1;
  133.  
  134.  
  135.         // data bus control
  136.         always @*
  137.         begin
  138.                 if( dbin )
  139.                         SRAM_DQ <= 'hZ;
  140.                 else // !dbin
  141.                         SRAM_DQ <= wdat2;
  142.         end
  143.  
  144.         always @(posedge clk2) // clk2!!!! late latching
  145.         begin
  146.                 rdat2 <= SRAM_DQ;
  147.         end
  148.  
  149.         always @(posedge clk)
  150.         begin
  151.                 rdat <= rdat2;
  152.         end
  153.  
  154.  
  155.         always @(posedge clk)
  156.         begin
  157.                 if( ready ) wdat2 <= wdat;
  158.         end
  159.  
  160.  
  161.  
  162.  
  163.  
  164.         reg [3:0] curr_state,next_state;
  165.  
  166.         parameter START_STATE = 4'd00; // reset state
  167.  
  168.         parameter INIT_STATE  = 4'd01; // initialization state
  169.  
  170.         parameter READ_BEG    = 4'd02; // read branch: prepare signals
  171.         parameter READ_PRE    = 4'd13;
  172.         parameter READ_CYCLE  = 4'd03; // read in progress: increment address, set ready, out data, do so until all addresses done
  173.         parameter READ_POST   = 4'd14;
  174.         parameter READ_END    = 4'd04; // read end: deassert some signals, go to stop state
  175.  
  176.         parameter WRITE_BEG   = 4'd05; // prepare signals
  177.         parameter WRITE_PRE1  = 4'd06; // assert ready
  178.         parameter WRITE_PRE2  = 4'd07; // capture wdat, negate ready, NO INCREMENT address, next state is WRITE_CYC2
  179.         parameter WRITE_CYC1  = 4'd08; // capture wdat, negate ready, increment address
  180.         parameter WRITE_CYC2  = 4'd09; // assert SRAM_WE_N, go to WRITE_END if sram_addr_nxt is out of memory region
  181.         parameter WRITE_CYC3  = 4'd10; // negate SRAM_WE_N, assert ready (wdat will be captured in WRITE_CYC1)
  182.         parameter WRITE_END   = 4'd11; // deassert sram control signals, go to STOP_STATE
  183.  
  184.  
  185.         parameter STOP_STATE  = 4'd12; // full stop state
  186.  
  187.  
  188.  
  189.         // FSM states
  190.         always @*
  191.         begin
  192.                 case( curr_state )
  193.  
  194. ////////////////////////////////////////////////////////////////////////
  195.                 START_STATE:
  196.                         next_state = INIT_STATE;
  197.  
  198.  
  199. ////////////////////////////////////////////////////////////////////////
  200.                 INIT_STATE:
  201.                 begin
  202.                         if( rnw ) // read
  203.                                 next_state = READ_BEG;
  204.                         else // !rnw - write
  205.                                 next_state = WRITE_BEG;
  206.                 end
  207.  
  208.  
  209.  
  210.  
  211. ////////////////////////////////////////////////////////////////////////
  212.                 READ_BEG:
  213.                         next_state = READ_PRE;
  214.  
  215.                 READ_PRE:
  216.                         next_state = READ_CYCLE;
  217.  
  218.                 READ_CYCLE:
  219.                         if( !sram_addr_ctr[SRAM_ADDR_SIZE] )
  220.                                 next_state = READ_CYCLE;
  221.                         else
  222.                                 next_state = READ_POST;
  223.  
  224.                 READ_POST:
  225.                         next_state = READ_END;
  226.  
  227.                 READ_END:
  228.                         next_state = STOP_STATE;
  229.  
  230.  
  231.  
  232. ////////////////////////////////////////////////////////////////////////
  233.                 WRITE_BEG:
  234.                         next_state = WRITE_PRE1;
  235.  
  236.                 WRITE_PRE1:
  237.                         next_state = WRITE_PRE2;
  238.  
  239.                 WRITE_PRE2:
  240.                         next_state = WRITE_CYC2;
  241.  
  242.  
  243.                 WRITE_CYC1:
  244.                         next_state = WRITE_CYC2;
  245.  
  246.                 WRITE_CYC2:
  247.                         if( !sram_addr_nxt[SRAM_ADDR_SIZE] )
  248.                                 next_state = WRITE_CYC3;
  249.                         else
  250.                                 next_state = WRITE_END;
  251.  
  252.                 WRITE_CYC3:
  253.                         next_state = WRITE_CYC1;
  254.  
  255.                 WRITE_END:
  256.                         next_state = STOP_STATE;
  257.  
  258.  
  259.  
  260. ////////////////////////////////////////////////////////////////////////
  261.                 STOP_STATE:
  262.                         next_state = STOP_STATE;
  263.  
  264.  
  265.  
  266.  
  267. ////////////////////////////////////////////////////////////////////////
  268.                 default:
  269.                         next_state = STOP_STATE;
  270.  
  271.                 endcase
  272.  
  273.         end
  274.  
  275.  
  276.  
  277.         // FSM flip-flops
  278.         always @(posedge clk)
  279.         begin
  280.                 if( start )
  281.                         curr_state <= START_STATE;
  282.                 else
  283.                         curr_state <= next_state;
  284.         end
  285.  
  286.  
  287.         // FSM outputs
  288.         always @(posedge clk)
  289.         begin
  290.                 case( next_state )
  291.  
  292. ////////////////////////////////////////////////////////////////////////
  293.                 INIT_STATE:
  294.                 begin
  295.                         stop <= 1'b0;
  296.  
  297.                         SRAM_UB_N <= 1'b1;
  298.                         SRAM_LB_N <= 1'b1;
  299.                         SRAM_CE_N <= 1'b1;
  300.                         SRAM_OE_N <= 1'b1;
  301.                         SRAM_WE_N <= 1'b1;
  302.  
  303.                         dbin <= 1'b1;
  304.  
  305.                         sram_addr_ctr <= 0;
  306.  
  307.                         ready <= 1'b0;
  308.                 end
  309.  
  310.  
  311.  
  312. ////////////////////////////////////////////////////////////////////////
  313.                 READ_BEG:
  314.                 begin
  315.                         SRAM_UB_N <= 1'b0;
  316.                         SRAM_LB_N <= 1'b0;
  317.                         SRAM_CE_N <= 1'b0;
  318.                         SRAM_OE_N <= 1'b0;
  319.                 end
  320.  
  321.                 READ_PRE:
  322.                 begin
  323.                   sram_addr_ctr <= sram_addr_nxt;
  324.                 end
  325.  
  326.                 READ_CYCLE:
  327.                 begin
  328.                         ready <= 1'b1;
  329.  
  330.                   sram_addr_ctr <= sram_addr_nxt;
  331.                 end
  332.  
  333.                 READ_POST:
  334.                 begin
  335.                         ready <= 1'b0; // in read sequence, ready and data are 2 cycles past the actual read.
  336.                 end
  337.  
  338.                 READ_END:
  339.                 begin
  340.                         SRAM_UB_N <= 1'b1;
  341.                         SRAM_LB_N <= 1'b1;
  342.                         SRAM_CE_N <= 1'b1;
  343.                         SRAM_OE_N <= 1'b1;
  344.  
  345.                         ready <= 1'b0;
  346.                 end
  347.  
  348.  
  349.  
  350.  
  351. ////////////////////////////////////////////////////////////////////////
  352.                 WRITE_BEG:
  353.                 begin
  354.                         SRAM_UB_N <= 1'b0;
  355.                         SRAM_LB_N <= 1'b0;
  356.                         SRAM_CE_N <= 1'b0;
  357.  
  358.                         dbin <= 1'b0;
  359.                 end
  360.  
  361.                 WRITE_PRE1:
  362.                 begin
  363.                         ready <= 1'b1;
  364.                 end
  365.  
  366.                 WRITE_PRE2:
  367.                 begin
  368.                         ready <= 1'b0;
  369.                 end
  370.  
  371.  
  372.                 WRITE_CYC1:
  373.                 begin
  374.                         ready <= 1'b0;
  375.  
  376.                         sram_addr_ctr <= sram_addr_nxt;
  377.                 end
  378.  
  379.                 WRITE_CYC2:
  380.                 begin
  381.                         SRAM_WE_N <= 1'b0;
  382.                 end
  383.  
  384.                 WRITE_CYC3:
  385.                 begin
  386.                         SRAM_WE_N <= 1'b1;
  387.  
  388.                         ready <= 1'b1;
  389.                 end
  390.  
  391.                 WRITE_END:
  392.                 begin
  393.                         ready <= 1'b0;
  394.  
  395.                         SRAM_WE_N <= 1'b1;
  396.                         SRAM_UB_N <= 1'b1;
  397.                         SRAM_LB_N <= 1'b1;
  398.                         SRAM_CE_N <= 1'b1;
  399.                 end
  400.  
  401.  
  402. ////////////////////////////////////////////////////////////////////////
  403.                 STOP_STATE:
  404.                 begin
  405.                         stop <= 1'b1;
  406.                 end
  407.  
  408.                 endcase
  409.         end
  410.  
  411.  
  412. endmodule
  413.  
  414.