Guest User

Untitled

a guest
Oct 16th, 2018
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.22 KB | None | 0 0
  1. module processor(DIN, Resetn, Clock, Run, Done, BusWires);
  2. input [15:0] DIN;
  3. input Resetn, Clock, Run;
  4. output Done;
  5. output [15:0] BusWires;
  6.  
  7. parameter T0 = 2'b00, T1 = 2'b01, T2 = 2'b10, T3 = 2'b11;
  8. reg [15:0] BusWires;
  9. reg [0:7] Rin, Rout;
  10. reg [15:0] Sum;
  11. reg IRin, Done, DINout, Ain, Gin, Gout, AddSub;
  12. reg [1:0] Tstep_Q, Tstep_D;
  13. wire [2:0] I;
  14. wire [0:7] Xreg, Yreg;
  15. wire [15:0] R0, R1, R2, R3, R4, R5, R6, R7, A, G;
  16. wire [1:9] IR;
  17. wire [1:10] Sel;
  18.  
  19. assign I = IR[1:3];
  20. dec3to8 decX (IR[4:6], 1'b1, Xreg);
  21. dec3to8 decY (IR[7:9], 1'b1, Yreg);
  22.  
  23. always @(Tstep_Q, Run, Done)
  24. begin
  25. case (Tstep_Q)
  26. T0:
  27. if (~Run) Tstep_D = T0;
  28. else Tstep_D = T1;
  29. T1:
  30. if (Done) Tstep_D = T0;
  31. else Tstep_D = T2;
  32. T2:
  33. Tstep_D = T3;
  34. T3:
  35. Tstep_D = T0;
  36. endcase
  37. end
  38.  
  39. parameter mv=4'b0000, mvi=4'b0001, add=4'b0010, sub=4'b0011, andk=4'b0111, ork=4'b1001, storek=4'b0100, loodk=4'b0101, mvnzk=4'b0110;
  40.  
  41. always @(Tstep_Q or I or Xreg or Yreg)
  42. begin
  43. Done = 1'b0; Ain = 1'b0; Gin = 1'b0; Gout = 1'b0; AddSub = 1'b0;
  44. IRin = 1'b0; DINout = 1'b0; Rin = 8'b0; Rout = 8'b0;
  45. case (Tstep_Q)
  46. T0:
  47. begin
  48. IRin = 1'b1;
  49. end
  50.  
  51. T1:
  52. case (I)
  53. mv:
  54. begin
  55. Rout = Yreg;
  56. Rin = Xreg;
  57. Done = 1'b1;
  58. end
  59.  
  60. mvi:
  61. begin
  62.  
  63. DINout = 1'b1;
  64. Rin = Xreg;
  65. Done = 1'b1;
  66. end
  67.  
  68. add, sub:
  69. begin
  70. Rout = Xreg;
  71. Ain = 1'b1;
  72. end
  73.  
  74. storek:
  75. begin
  76. Rout = Xreg;
  77. Rin = Yreg;
  78. Done = 1'b1;
  79. end
  80.  
  81. loodk:
  82. begin
  83. Rout = Xreg;
  84. Rin = Yreg;
  85. Done = 1'b1;
  86. end
  87.  
  88. mvnzk:
  89. begin
  90. if (!G)
  91. Rout = Yreg;
  92. Rin = Xreg;
  93. Done = 1'b1;
  94. end
  95.  
  96. default: ;
  97. endcase
  98. T2:
  99. case (I)
  100. add, sub:
  101. begin
  102. Rout = Yreg;
  103. Gin = 1'b1;
  104. end
  105.  
  106.  
  107. andk:
  108. begin
  109. Rout = Yreg;
  110. AddSub = 1'b1;
  111. Gin = 1'b1;
  112. end
  113.  
  114. ork:
  115. begin
  116. Rout = Yreg;
  117. Gin = 1'b1;
  118. end
  119.  
  120. default: ;
  121. endcase
  122. T3:
  123. case (I)
  124. add, sub:
  125. begin
  126. Gout = 1'b1;
  127. Rin = Xreg;
  128. Done = 1'b1;
  129. end
  130. default: ;
  131. endcase
  132. endcase
  133. end
  134.  
  135.  
  136. always @(posedge Clock, negedge Resetn)
  137. if (!Resetn)
  138. Tstep_Q <= T0;
  139. else
  140. Tstep_Q <= Tstep_D;
  141.  
  142. regn reg_0 (BusWires, Rin[0], Clock, R0);
  143. regn reg_1 (BusWires, Rin[1], Clock, R1);
  144. regn reg_2 (BusWires, Rin[2], Clock, R2);
  145. regn reg_3 (BusWires, Rin[3], Clock, R3);
  146. regn reg_4 (BusWires, Rin[4], Clock, R4);
  147. regn reg_5 (BusWires, Rin[5], Clock, R5);
  148. regn reg_6 (BusWires, Rin[6], Clock, R6);
  149. regn reg_7 (BusWires, Rin[7], Clock, R7);
  150. regn reg_A (BusWires, Ain, Clock, A);
  151. regn #(.n(9)) reg_IR (DIN[15:7], IRin, Clock, IR);
  152.  
  153. // alu
  154. always @(AddSub or A or BusWires)
  155. begin
  156. if (!AddSub)
  157. Sum = A + BusWires;
  158. else
  159. Sum = A - BusWires;
  160. end
  161.  
  162. always @(andk or A or BusWires)
  163. if (!andk)
  164. Sum = A & BusWires;
  165. always @(ork or A or BusWires)
  166. if (!ork)
  167. Sum = A | BusWires;
  168.  
  169.  
  170. regn reg_G (Sum, Gin, Clock, G);
  171.  
  172. assign Sel = {Rout, Gout, DINout};
  173.  
  174. always @(*)
  175. begin
  176. if (Sel == 10'b1000000000)
  177. BusWires = R0;
  178. else if (Sel == 10'b0100000000)
  179. BusWires = R1;
  180. else if (Sel == 10'b0010000000)
  181. BusWires = R2;
  182. else if (Sel == 10'b0001000000)
  183. BusWires = R3;
  184. else if (Sel == 10'b0000100000)
  185. BusWires = R4;
  186. else if (Sel == 10'b0000010000)
  187. BusWires = R5;
  188. else if (Sel == 10'b0000001000)
  189. BusWires = R6;
  190. else if (Sel == 10'b0000000100)
  191. BusWires = R7;
  192. else if (Sel == 10'b0000000010)
  193. BusWires = G;
  194. else BusWires = DIN;
  195. end
  196. endmodule
  197.  
  198. module dec3to8(W, En, Y);
  199. input [2:0] W;
  200. input En;
  201. output [0:7] Y;
  202. reg [0:7] Y;
  203.  
  204. always @(W or En)
  205. begin
  206. if (En == 1)
  207. case (W)
  208. 3'b000: Y = 8'b10000000;
  209. 3'b001: Y = 8'b01000000;
  210. 3'b010: Y = 8'b00100000;
  211. 3'b011: Y = 8'b00010000;
  212. 3'b100: Y = 8'b00001000;
  213. 3'b101: Y = 8'b00000100;
  214. 3'b110: Y = 8'b00000010;
  215. 3'b111: Y = 8'b00000001;
  216. endcase
  217. else
  218. Y = 8'b00000000;
  219. end
  220. endmodule
  221.  
  222. module regn(R, Rin, Clock, Q);
  223. parameter n = 16;
  224. input [n-1:0] R;
  225. input Rin, Clock;
  226. output [n-1:0] Q;
  227. reg [n-1:0] Q;
  228.  
  229. always @(posedge Clock)
  230. if (Rin)
  231. Q <= R;
  232. endmodule
Add Comment
Please, Sign In to add comment