Advertisement
Guest User

Untitled

a guest
Mar 5th, 2015
186
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.89 KB | None | 0 0
  1. module CPU(input clk, input reset, inout wire[7:0] Databus,
  2. output wire [7:0] AdrsBus, output reg CS, output reg RW);
  3.  
  4. reg[3:0] ps, ns;
  5.  
  6. reg[7:0] PC, IR, IR2, AC, CC, MA, MD;
  7. wire[7:0] ABus,DBus;
  8. reg PC_IR2 ,PC_ld, PC_inc, PC_clr,
  9. IR_ld, IR_dec, IR2_lc,
  10. AC_clr, AC_ld, AC_MD,
  11. CC_clr, CC_cf, CC_zf,
  12. MA_ld, MA_clr,
  13. MD_ld, MD_rcv, MD_snd;
  14.  
  15. assign AdrsBus = MA;
  16. assign DataBus = MD_snd ? MD : 8'dz;
  17. assign ABus = PC_IR2 ? PC : IR2;
  18. assign DBus = AC_MD ? AC: MD;
  19.  
  20. reg[2:0] ALU_cmd;
  21. wire[7:0] Result;
  22. ALU alu(AC, IR2, CC[7], ALU_cmd, Result, CF, ZF);
  23.  
  24. always@(posedge clk)
  25. if (reset) ps = 0;
  26. else ps <= ns;
  27.  
  28. always@* begin
  29. PC_IR2 = 0; PC_ld = 0; PC_inc = 0; PC_clr = 0;
  30. IR_ld = 0; IR_dec = 0; IR2_ld = 0;
  31. AC_clr = 0; AC_ld = 0; AC_MD = 0;
  32. CC_clr = 0; CC_cf = 0; CC_zf = 0;
  33. MA_ld = 0; MA_clr = 0;
  34. MD_ld = 0; MD_rcv=0; MD_snd = 0;
  35. ALU_cmd = 0;
  36. ns = 1;
  37. case (ps)
  38. 0: begin
  39. PC_clr =1, MA_clr = 1, AC_clr = 1, CC_clr = 1;
  40. end
  41. 1: begin
  42. PC_inc = 1;MA_ld = 1;ns = 2;
  43. end
  44. 2: begin
  45. PC.inc = 1; MA_ld = 1; MD_rcv= 1;ns = 3;
  46. end
  47. 3: begin
  48. IR_ld = 1; MD_rcv = 1;ns = 4;
  49. end
  50. 4: begin
  51. IR2_ld.h;
  52. if ( IR[7:5] == 001 || IR[7:5] == 010 || IR[7:5] == 011)
  53. if (IR[4:3] == 10)
  54. case(IR[7:5])
  55. 3'd0 : ns = 7;
  56. 3'd1 : ns = 8;
  57. 3'd2 : ns = 9;
  58. 3'd3 : ns = 10;
  59. 3'd4 : ns = 11;
  60. 3'd5 : ns = 12;
  61. 3'd6 : ns = 13;
  62. 3'd7 :
  63. if (CC[6]) ns = 14;
  64. else ns = 1;
  65. endcase
  66. else ns = 5;
  67. else if (IR[4:3] ==01)
  68. case (IR[7:5])
  69. 3'd0 : ns = 7;
  70. 3'd1 : ns = 8;
  71. 3'd2 : ns = 9;
  72. 3'd3 : ns = 10;
  73. 3'd4 : ns = 11;
  74. 3'd5 : ns = 12;
  75. 3'd6 : ns = 13;
  76. 3'd7 :
  77. if (CC[6]) ns = 14;
  78. else ns = 1;
  79. endcase
  80. else ns = 5;
  81. end
  82. 5: begin
  83. MA_ld.h; IR_dec.h;ns = 6;
  84. end
  85. 6: begin
  86. MD_rcv.h; ns = 4;
  87. end
  88. 7: begin
  89. ALU_cmd = 3'd0; CC_zf.h;
  90. end
  91. 8: begin
  92. MA_ld.h;MD_ld.h;
  93. end
  94. 9: begin
  95. ALU_cmd = 3'd1;CC_cf.h; CC_zf.h;
  96. end
  97. 10: begin
  98. PC_ld.h;
  99. end
  100. 11: begin
  101. ALU_cmd = 3'd2;CC_zf.h;
  102. end
  103. 12: begin
  104. ALU_cmd = 3'd3; CC_zf.h;
  105. end
  106. 13: begin
  107. ALU_cmd = 3'd4;CC_zf.h;
  108. end
  109. 14:
  110. PC_ld.h;
  111. 15:
  112. MD_snd.h;
  113. endcase
  114. end
  115.  
  116. always@(posedge clk)
  117. if (PC_clr) PC <= 0;
  118. else if (PC_ld) PC<=ABus;
  119. else if (PC_inc) PC <= PC+1;
  120. always@(posedge clk)
  121. if (IR_ld) IR<= DBus;
  122. else if (IR_dec) IR[4:3]<= IR[4:3] - 1;
  123. always@(posedge clk)
  124. if (IR2_ld) IR2<=DBus;
  125. always@(posedge clk)
  126. if(AC_clr) AC<=0;
  127. else if (AC_ld) AC<=Result;
  128.  
  129. always@(posedge clk)
  130. if (CC_clr) CC<=0;
  131. else if (CC_cf) CC[7] <= CF;
  132. else if (CC_zf) CC[6] <= ZF;
  133.  
  134. always@(posedge clk)
  135. if(MA_ld) MA<= ABus;
  136. else if (MA_clr) MA<= 0;
  137.  
  138. always@(posedge clk)
  139. if(MD_ld) MD<=DBus;
  140. else if (MD_rcv) MD <= DataBus;
  141.  
  142. always@(posedge clk)
  143. case(ps)
  144. 1: CS<= 1;
  145. 2: CS<= 1;
  146. 5: CS<= 1;
  147. 6: CS<= 1;
  148. default: CS<= 0;
  149. endcase
  150.  
  151. always@(posedge clk)
  152. case(ps)
  153. 8: RW<= 0;
  154. default: RW<=1;
  155. endcase
  156.  
  157. endmodule
  158.  
  159.  
  160. module ALU(input[7:0] A, input[7:0] B, input Ci, input[3:0] cmd,
  161. output reg[7:0] R, output reg Co, output Z);
  162.  
  163. always@* begin
  164. Co = 0; R = 0;
  165. case(cmd)
  166. 3'd0: begin
  167. R = B; Co = Ci;
  168. end
  169. 3'd1: begin
  170. {Co,R} = A+B;
  171. end
  172. 3'd2: R = A|B;
  173. 3'd3: R = A&B;
  174. 3'd4: R = A^B;
  175. endcase
  176. end
  177.  
  178. assign Z = (R==0);
  179. endmodule
  180.  
  181. module TestCPU;
  182. reg clk; reg reset; wire [7:0] AdrsBus; wire [7:0] DataBus;
  183. wire CS; wire RW;
  184. CPU uut (.clk(clk), .reset(reset), .AdrsBus(AdrsBus), .DataBus(DataBus),
  185. .CS(CS), .RW(RW));
  186. initial
  187. forever begin
  188. #50; CLOCK = ~CLOCK;
  189. end
  190.  
  191. reg [7:0] Buffer;
  192. assign DataBus = Buffer;
  193.  
  194. reg [7:0] Core [0:255];
  195. always@*
  196. if (CS==1) // Chip enabled
  197. if (RW==1) begin
  198. #75; Buffer = Core[AdrsBus]; // Read from RAM
  199. end
  200. else begin
  201. Buffer = 8'dZ; #75; Core[AdrsBus] = DataBus; // Write to RAM
  202. end
  203. else
  204. Buffer = 8'dZ;
  205.  
  206. initial begin
  207. clk = 0; reset = 0;
  208. #1000; $readmemh("C:\Users\Tea\Downloads\CPU2.txt", Core);
  209. #25; reset = 1; #100; reset = 0;
  210. $monitor("RAM[30] =%d", Core[30]);
  211. #100000; $stop;
  212. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement