Guest User

Untitled

a guest
Jun 20th, 2016
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.25 KB | None | 0 0
  1. module J1M
  2. #(parameter init_file = "forth_ram.txt")
  3. (
  4. input wire clk,
  5. input wire reset,
  6. output wire [14:0] addr,
  7. output wire [15:0] data_out,
  8. output wire write_enable,
  9. input wire [15:0] data_in
  10. );
  11.  
  12. reg [15:0] istr = 0;
  13. reg [12:0] pc = 0;
  14.  
  15. reg [15:0] RAM [8191:0];
  16. initial $readmemb(init_file, RAM, 0, 8191);
  17.  
  18. reg [15:0] RSTACK_SP = 0;
  19. reg [15:0] RSTACK [31:0];
  20. reg [5:0] DSTACK_DEPTH = 0;
  21. reg [15:0] DSTACK [31:0];
  22. reg [15:0] DSTACK_T;
  23. reg [15:0] DSTACK_N;
  24.  
  25. reg [15:0] ALU_OUT;
  26.  
  27. assign addr = DSTACK_T[14:0];
  28. assign write_enable = istr[5] && (istr[15:13] == 3'b011);
  29. assign data_out = DSTACK_N;
  30.  
  31. reg [12:0] istrAddr = 0;
  32. reg [15:0] RAM_T = 0;
  33.  
  34. always @(posedge clk) begin
  35. istr <= RAM[istrAddr];
  36. RAM_T <= RAM[DSTACK_T >> 1];
  37. if (istr[5] && (istr[15:13] == 3'b011) && DSTACK_T[15:14] == 0)
  38. RAM[DSTACK_T >> 1] <= DSTACK_N;
  39. end
  40.  
  41. always @* begin
  42. if (istr[15:13] == 3'b000) // Jump
  43. istrAddr = istr[12:0];
  44. else if (istr[15:13] == 3'b001 && DSTACK_T == 0) // Conditional jump
  45. istrAddr = istr[12:0];
  46. else if (istr[15:13] == 3'b010) // Call
  47. istrAddr = istr[12:0];
  48. else if (istr[15:13] == 3'b011 && istr[12])
  49. istrAddr = RSTACK[RSTACK_SP] >> 1;
  50. else
  51. istrAddr = pc + 1;
  52. end
  53.  
  54. always @* begin
  55. case (istr[11:8])
  56. 0: ALU_OUT = DSTACK_T; // T
  57. 1: ALU_OUT = DSTACK_N; // N
  58. 2: ALU_OUT = DSTACK_T + DSTACK_N; // T + N
  59. 3: ALU_OUT = DSTACK_T & DSTACK_N; // T and N
  60. 4: ALU_OUT = DSTACK_T | DSTACK_N; // T or N
  61. 5: ALU_OUT = {DSTACK_T[7:0], DSTACK_T[15:8]};
  62. 6: ALU_OUT = ~DSTACK_T; // ~T
  63. 7: ALU_OUT = DSTACK_T == DSTACK_N ? 16'hFFFF: 15'h0; // N == T
  64. 8: ALU_OUT = $signed(DSTACK_N) < $signed(DSTACK_T) ? 16'hFFFF: 15'h0; // N < T
  65. 9: ALU_OUT = DSTACK_T >> 1; // T >> 1
  66. 10: ALU_OUT = DSTACK_T - 1; // T - 1
  67. 11: ALU_OUT = RSTACK[RSTACK_SP]; // R
  68. 12: ALU_OUT = DSTACK_T[15:14] == 0 ? RAM_T : data_in; // [T]
  69. 13: ALU_OUT = DSTACK_T << 1; // T << 1
  70. 14: ALU_OUT = DSTACK_DEPTH; // DEPTH
  71. 15: ALU_OUT = DSTACK_N < DSTACK_T ? 16'hFFFF: 15'h0; // Nu < T
  72. endcase
  73. end
  74.  
  75. always @(posedge clk or posedge reset) begin
  76. if (reset) begin
  77. pc <= 0;
  78. RSTACK_SP <= 0;
  79. DSTACK_DEPTH <= 0;
  80. end else begin
  81. casez (istr[15:13])
  82. 3'b1??: begin
  83. // Literal
  84. DSTACK_DEPTH <= DSTACK_DEPTH + 1;
  85. DSTACK[DSTACK_DEPTH + 1] <= DSTACK_N;
  86. DSTACK_N <= DSTACK_T;
  87. DSTACK_T <= {1'b0, istr[14:0]};
  88. pc <= pc + 1;
  89. end
  90. 3'b000:
  91. pc <= istr[12:0]; // Jump
  92. 3'b001: begin
  93. // Conditional jump
  94. DSTACK_DEPTH <= DSTACK_DEPTH - 1;
  95. DSTACK_T <= DSTACK_N;
  96. DSTACK_N <= DSTACK[DSTACK_DEPTH];
  97. if (DSTACK_T == 0)
  98. pc <= istr[12:0];
  99. else
  100. pc <= pc + 1;
  101. end
  102. 3'b010: begin
  103. // Call
  104. RSTACK_SP <= RSTACK_SP + 1;
  105. RSTACK[RSTACK_SP + 1] <= {1'b0, pc + 1, 1'b0};
  106. pc <= istr[12:0];
  107. end
  108. 3'b011: begin
  109. // ALU
  110. DSTACK_T <= ALU_OUT;
  111.  
  112. case (istr[1:0]) // dstack+-
  113. 2'b00: begin
  114. if (istr[7])
  115. DSTACK_N <= DSTACK_T;
  116. end
  117. 2'b01: begin
  118. DSTACK_DEPTH <= DSTACK_DEPTH + 1;
  119. DSTACK_N <= DSTACK_T;
  120. DSTACK[DSTACK_DEPTH + 1] <= DSTACK_N;
  121. if (istr[7])
  122. DSTACK_N <= DSTACK_T;
  123. end
  124. 2'b11: begin
  125. DSTACK_DEPTH <= DSTACK_DEPTH - 1;
  126. DSTACK_N <= DSTACK[DSTACK_DEPTH];
  127. end
  128. endcase
  129.  
  130. case (istr[3:2]) // rstack+-
  131. 2'b01: begin
  132. RSTACK_SP <= RSTACK_SP + 1;
  133. RSTACK[RSTACK_SP + 1] <= DSTACK_T;
  134. end
  135. 2'b11: begin
  136. RSTACK_SP <= RSTACK_SP - 1;
  137. end
  138. endcase
  139.  
  140. if (istr[12]) begin // R -> PC
  141. pc <= RSTACK[RSTACK_SP] >> 1;
  142. end else begin
  143. pc <= pc + 1;
  144. end
  145. end
  146. endcase
  147. end
  148. end
  149. endmodule
Advertisement
Add Comment
Please, Sign In to add comment