Advertisement
aidanozo

Untitled

Dec 18th, 2024
37
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. module control_unit_sol(
  2.  
  3. always @(*) begin
  4.     next_state = state + 1;
  5.     t1_oe = 0;
  6.     t1_we = 0;
  7.     t2_oe = 0;
  8.     t2_we = 0;
  9.     regs_oe = 0;
  10.     regs_we = 0;
  11.     regs_addr = 0;
  12.     alu_carry = 0;
  13.     alu_opcode = 0;
  14.     ram_we = 0;
  15.     ram_oe = 0;
  16.     ma_oe = 0;
  17.     ma_we = 0;
  18.     pc_oe = 0;
  19.     pc_we = 0;
  20.     flags_we = 0;
  21.     case(state)
  22.     INIT: next_state = LOAD;
  23.     LOAD_DONE: begin
  24.         verify_t2 = opc[0:6] == 7'b0000000 || opc[1] == 1'b1;
  25.         next_state = EXEC;
  26.     end
  27.     EXEC_DONE: begin
  28.         if ((opc[0:3] == 4'b0100)||(opc[0:3] == 4'b0000 && opc[4:6])) next_state = STORE_DONE;
  29.         else next_state = STORE;
  30.     end
  31.     STORE_DONE: next_state = STORE_DONE;
  32.     // TODO define LOAD, EXEC, STORE here
  33.     LOAD: begin
  34.         t1_we = 1;
  35.         regs_addr = rm[2] ? XB : XA;
  36.         regs_oe = 1;
  37.     end
  38.     LOAD + 1: begin
  39.         t2_we = 1;
  40.         regs_addr = rm[1] ? BB : BA;
  41.         regs_oe = 1;
  42.     end
  43.     LOAD + 2: begin
  44.         alu_opcode = ADC;
  45.         alu_oe = 1;
  46.         t1_oe = 1;
  47.         t2_oe = 1;
  48.         t1_we = 1;
  49.  
  50.     end
  51.     LOAD + 3: begin
  52.         pc_oe = 1;
  53.         t2_we = 1;
  54.     end
  55.     LOAD + 4: begin
  56.         alu_opcode = ADC;
  57.         alu_oe = 1;
  58.         t2_oe = 1;
  59.         pc_we = 1;
  60.         alu_carry = 1;
  61.         ma_we = 1;
  62.     end
  63.     LOAD + 5: begin
  64.         ma_oe = 1;
  65.     end
  66.     LOAD + 6: begin
  67.         ram_oe = 1;
  68.         t2_we = 1;
  69.     end
  70.     LOAD + 7: begin
  71.         alu_opcode = ADC;
  72.         alu_oe = 1;
  73.         t1_oe = 1;
  74.         t2_oe = 1;
  75.         ma_we = 1;
  76.     end
  77.     LOAD + 8: begin
  78.         ma_oe = 1;
  79.     end
  80.     LOAD + 9: begin
  81.         ram_oe = 1;
  82.         if (d) t2_we = 1;
  83.         else t1_we = 1;
  84.         if (opc[1] == 0 && opc[0:6] != 7'b0000000) next_state = LOAD_DONE;
  85.     end
  86.     LOAD + 10: begin
  87.         regs_oe = 1;
  88.         regs_addr = rg;
  89.         if (d == 0) t2_we = 1;
  90.         else t1_we = 1;
  91.         next_state = LOAD_DONE;
  92.     end
  93.     EXEC: begin
  94.  
  95.         if (opc[1]) begin
  96.             alu_oe = opc[3];
  97.             casex (opc[4:6])
  98.                 3'b00x: alu_opcode = ADC;
  99.                 3'b01x: alu_opcode = SBB1;
  100.                 3'b100: alu_opcode = AND;
  101.                 3'b101: alu_opcode = OR;
  102.                 3'b110: alu_opcode = XOR;
  103.                 default: alu_opcode = 1'bx;
  104.             endcase
  105.             flags_we = 1;
  106.             t1_oe = 1;
  107.             t2_oe = 1;
  108.             alu_carry = (opc[4:6] == 3'b001 || opc[4:6] == 3'b011) ?
  109.                     flags[FLAG_C] : 0;
  110.             t1_we = opc[3];
  111.             next_state = EXEC_DONE;
  112.         end else begin
  113.  
  114.             if(opc[3]) begin
  115.                 casex (opc[4:6])
  116.                     3'b000: alu_opcode = ADC;
  117.                     3'b001: alu_opcode = SBB1;
  118.                     3'b010: alu_opcode = SBB2;
  119.                     3'b011: alu_opcode = NOT;
  120.                     3'b100: alu_opcode = SHL;
  121.                     3'b101: alu_opcode = SHR;
  122.                     3'b110: alu_opcode = SAR;
  123.                     default: alu_opcode = 1'bx;
  124.                 endcase
  125.                 alu_carry = opc[4:6] == 3'b000 || opc[4:6] == 3'b001;
  126.                 flags_we = 1;
  127.                 alu_oe = 1;
  128.                 t1_oe = 1;
  129.                 t1_we = 1;
  130.                 next_state = EXEC_DONE;
  131.  
  132.             end else begin
  133.                 case (opc[4:6])
  134.                     3'b000: begin
  135.                         t1_we = 1;
  136.                         t2_oe = 1;
  137.                         alu_opcode = ADC;
  138.                         alu_oe = 1;
  139.                         next_state = EXEC_DONE;
  140.                     end
  141.                     3'b010, 3'b100: begin
  142.                         regs_addr = SP;
  143.                         regs_oe = 1;
  144.                         t2_we = 1;
  145.                         next_state = PUSH;
  146.                     end
  147.                     3'b101: begin
  148.                         pc_we = 1;
  149.                         t1_oe = 1;
  150.                         alu_opcode = OR;
  151.                         alu_oe = 1;
  152.                         next_state = EXEC_DONE;
  153.                     end
  154.                 endcase
  155.             end
  156.         end
  157.        
  158.     end
  159.     PUSH: begin
  160.         t2_oe = 1;
  161.         alu_opcode = SBB2;
  162.         alu_carry = 1;
  163.         alu_oe = 1;
  164.         regs_we = 1;
  165.         regs_addr = SP;
  166.         ma_we = 1;
  167.     end
  168.     PUSH + 1: begin
  169.         if (opc[4:6] == 3'b100) begin
  170.             pc_oe = 1;
  171.             t2_we = 1;
  172.             next_state = CALL;
  173.         end
  174.         else begin
  175.             ram_we = 1;
  176.             ma_oe = 1;
  177.             t1_oe = 1;
  178.             alu_opcode = OR;
  179.             alu_oe = 1;
  180.             next_state = EXEC_DONE;
  181.         end
  182.     end
  183.  
  184.     CALL: begin
  185.         ram_we = 1;
  186.         ma_oe = 1;
  187.         alu_opcode = ADC;
  188.         alu_carry = 1;
  189.         alu_oe = 1;
  190.         t2_oe = 1;
  191.     end
  192.     CALL + 1: begin
  193.         t1_oe = 1;
  194.         alu_opcode = OR;
  195.         alu_oe = 1;
  196.         pc_we = 1;
  197.         next_state = EXEC_DONE;
  198.     end
  199.    
  200.     STORE: begin
  201.         next_state = STORE_DONE;
  202.         alu_opcode = OR;
  203.         alu_oe = 1;
  204.         t1_oe = 1;
  205.         if (d) begin
  206.             regs_addr = rg;
  207.             regs_we = 1;
  208.         end else begin
  209.             ma_oe = 1;
  210.             ram_we = 1;
  211.         end
  212.     end
  213.     default: next_state = INIT;
  214.     endcase
  215. end
  216.  
  217. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement