SmcRx.v 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. `timescale 1ns / 1ps
  2. //////////////////////////////////////////////////////////////////////////////////
  3. // Company:
  4. // Engineer:
  5. //
  6. // Create Date: 10.10.2018 01:07:38
  7. // Design Name:
  8. // Module Name: sram_ctrl2
  9. // Project Name:
  10. // Target Devices:
  11. // Tool Versions:
  12. // Description:
  13. //
  14. // Dependencies:
  15. //
  16. // Revision:
  17. // Revision 0.01 - File Created
  18. // Additional Comments:
  19. //
  20. //////////////////////////////////////////////////////////////////////////////////
  21. module SmcRx
  22. #(
  23. parameter DataOutWidth = 16,
  24. parameter DataInWidth = 16,
  25. parameter AddrWidth = 12
  26. )
  27. (
  28. input Clk_i,
  29. input RstN_i,
  30. input ForceRstN_i,
  31. input [DataInWidth-1:0] SmcD_i,
  32. input [AddrWidth-1:0] SmcA_i,
  33. input SmcAwe_i,
  34. input SmcAmsN_i,
  35. input SmcAoe_i,
  36. input SmcAre_i,
  37. input [1:0] SmcBe_i,
  38. output [DataOutWidth-1:0] Data_o,
  39. output [AddrWidth-1:0] Addr_o,
  40. output Val_o
  41. );
  42. //================================================================================
  43. // REG/WIRE
  44. reg [AddrWidth-1:0] smcAddr;
  45. reg [DataInWidth-1:0] smcData;
  46. reg val;
  47. reg valReg;
  48. reg smcAwe;
  49. reg smcAweR;
  50. reg smcAweRR;
  51. reg smcAmsN;
  52. reg smcAmsNR;
  53. wire smcAweNeg = (!smcAweRR&smcAweR);
  54. reg [DataOutWidth-1:0] dataOutReg;
  55. reg [AddrWidth-1:0] addrDataReg;
  56. //================================================================================
  57. // LOCALPARAM
  58. //================================================================================
  59. // ASSIGNMENTS
  60. assign Data_o = dataOutReg;
  61. assign Addr_o = addrDataReg;
  62. assign Val_o = valReg;
  63. //================================================================================
  64. // CODING
  65. always @(posedge Clk_i) begin
  66. if (RstN_i&ForceRstN_i) begin
  67. smcAmsN <= SmcAmsN_i;
  68. smcAmsNR <= smcAmsN;
  69. smcAwe <= SmcAwe_i;
  70. smcAweR <= smcAwe;
  71. smcAweRR <= smcAweR;
  72. end else begin
  73. smcAmsN <= 0;
  74. smcAmsNR <= 0;
  75. smcAwe <= 0;
  76. smcAweR <= 0;
  77. smcAweRR <= 0;
  78. end
  79. end
  80. always @(posedge Clk_i) begin
  81. if (RstN_i&ForceRstN_i) begin
  82. if (!smcAmsNR) begin
  83. if (smcAweNeg) begin
  84. smcData <= SmcD_i;
  85. smcAddr <= SmcA_i;
  86. val <= 1;
  87. end else begin
  88. val <= 0;
  89. end
  90. end
  91. end else begin
  92. smcData <= 0;
  93. smcAddr <= 0;
  94. val <= 0;
  95. end
  96. end
  97. always @(posedge Clk_i) begin
  98. if (RstN_i&ForceRstN_i) begin
  99. if (val) begin
  100. addrDataReg <= smcAddr;
  101. dataOutReg <= {dataOutReg[DataInWidth-1:0],smcData};
  102. valReg <= val;
  103. end else begin
  104. valReg <= 1'b0;
  105. end
  106. end else begin
  107. dataOutReg <= 0;
  108. addrDataReg <= 0;
  109. valReg <= 1'b0;
  110. end
  111. end
  112. endmodule