MemCtrl.sv 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. module MemCtrl (
  2. input Clk_i,
  3. input Rst_i,
  4. input WrReq_i,
  5. input RdReq_i,
  6. output reg [5:0] AddrA_o,
  7. output reg WeA_o,
  8. output reg [5:0] AddrB_o,
  9. output reg ReB_o
  10. );
  11. reg [2:0] currState;
  12. localparam IDLE = 2'h0;
  13. localparam WRITE = 2'h1;
  14. localparam READ = 2'h2;
  15. always @(posedge Clk_i) begin
  16. if (Rst_i) begin
  17. currState <= IDLE;
  18. end else begin
  19. case (currState)
  20. IDLE: begin
  21. if (WrReq_i) begin
  22. currState <= WRITE;
  23. AddrA_o <= AddrA_o+1;
  24. WeA_o <= 1'b1;
  25. end else if (RdReq_i)begin
  26. currState <= READ;
  27. AddrB_o <= AddrB_o+1;
  28. ReB_o <= 1'b1;
  29. end else begin
  30. currState <= IDLE;
  31. AddrA_o <= 0;
  32. AddrB_o <= 0;
  33. WeA_o <= 1'b0;
  34. ReB_o <= 1'b0;
  35. end
  36. end
  37. WRITE:begin
  38. if (WrReq_i) begin
  39. currState <= WRITE;
  40. AddrA_o <= AddrA_o+1;
  41. WeA_o <= 1'b1;
  42. end else begin
  43. currState <= IDLE;
  44. AddrA_o <= 0;
  45. WeA_o <= 1'b0;
  46. end
  47. end
  48. READ:begin
  49. if (RdReq_i) begin
  50. currState <= READ;
  51. AddrB_o <= AddrB_o+1;
  52. ReB_o <= 1'b1;
  53. end else begin
  54. currState <= IDLE;
  55. AddrB_o <= 0;
  56. ReB_o <= 1'b0;
  57. end
  58. end
  59. endcase
  60. end
  61. end
  62. endmodule