aidanozo

Untitled

Dec 7th, 2025
31
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. `timescale 1ns / 1ps
  2.  
  3. module uc(
  4.         clk,
  5.         rst,
  6.         ri,
  7.         ind,
  8.         regs_addr,
  9.         regs_oe,
  10.         regs_we,
  11.         alu_oe,
  12.         alu_carry,
  13.         alu_opcode,
  14.         ram_oe,
  15.         ram_we,
  16.         io_oe,
  17.         io_we,
  18.         cp_oe,
  19.         cp_we,
  20.         ind_sel,
  21.         ind_oe,
  22.         ind_we,
  23.         am_oe,
  24.         am_we,
  25.         aie_oe,
  26.         aie_we,
  27.         t1_oe,
  28.         t1_we,
  29.         t2_oe,
  30.         t2_we,
  31.         ri_oe,
  32.         ri_we,
  33.         disp_state
  34.     );
  35.  
  36. parameter word_width =          16;
  37. parameter state_width =         16;
  38.  
  39. `define ADC                     0
  40. `define SBB1                    1
  41. `define SBB2                    2
  42. `define NOT                     3
  43. `define AND                     4
  44. `define OR                      5
  45. `define XOR                     6
  46. `define SHL                     7
  47. `define SHR                     8
  48. `define SAR                     9
  49.  
  50. `define RA                      0
  51. `define RB                      1
  52. `define RC                      2
  53. `define IS                      3
  54. `define XA                      4
  55. `define XB                      5
  56. `define BA                      6
  57. `define BB                      7
  58.  
  59. input                           clk;
  60. input                           rst;
  61. input [word_width-1 : 0]        ri;
  62. input [word_width-1 : 0]        ind;
  63. output reg                      alu_oe;
  64. output reg                      alu_carry;
  65. output reg[3 : 0]               alu_opcode;
  66. output reg                      ram_oe;
  67. output reg                      ram_we;
  68. output reg                      io_oe;
  69. output reg                      io_we;
  70. output reg[2 : 0]               regs_addr;
  71. output reg                      regs_oe;
  72. output reg                      regs_we;
  73. output reg                      cp_oe;
  74. output reg                      cp_we;
  75. output reg                      ind_sel;        // controls IND register input (0 = bus, 1 = alu flags)
  76. output reg                      ind_oe;
  77. output reg                      ind_we;
  78. output reg                      am_oe;
  79. output reg                      am_we;
  80. output reg                      aie_oe;
  81. output reg                      aie_we;
  82. output reg                      t1_oe;
  83. output reg                      t1_we;
  84. output reg                      t2_oe;
  85. output reg                      t2_we;
  86. output reg                      ri_oe;          // controls RI register output which generates the offset for Jcond instructions
  87. output reg                      ri_we;
  88. output[state_width-1 : 0]       disp_state;
  89.  
  90. wire [0:6]                      cop;
  91. wire                            d;
  92. wire [0:1]                      mod;
  93. wire [0:2]                      rg;
  94. wire [0:2]                      rm;
  95.  
  96. assign cop  = {ri[0], ri[1], ri[2], ri[3], ri[4], ri[5], ri[6]};
  97. assign d    = {ri[7]};
  98. assign mod  = {ri[8], ri[9]};
  99. assign rg   = {ri[10], ri[11], ri[12]};
  100. assign rm   = {ri[13], ri[14], ri[15]};
  101.  
  102. `define reset                   'h00            // reset state
  103. `define fetch                   'h10            // load instruction to instruction register
  104. `define decode                  'h20            // analyze loaded instruction
  105. `define load                    'h30            // load operand from register
  106. `define exec                    'h40            // execute 1 operand instructions
  107. `define store                   'h50            // store result to register
  108. `define inc_cp                  'h60            // increment program counter
  109.  
  110. reg [state_width-1 : 0] state = `reset, state_next;
  111.  
  112. // FSM - sequential part
  113. always @(posedge clk) begin
  114.     state <= `reset;
  115.  
  116.     if(!rst)
  117.         state <= state_next;
  118. end
  119.  
  120. // FSM - combinational part
  121. always @(*) begin
  122.     state_next      = `reset;
  123.     alu_oe          = 0;
  124.     alu_carry       = 0;
  125.     alu_opcode      = 0;
  126.     ram_oe          = 0;
  127.     ram_we          = 0;
  128.     io_oe           = 0;
  129.     io_we           = 0;
  130.     regs_addr       = 0;
  131.     regs_oe         = 0;
  132.     regs_we         = 0;
  133.     cp_oe           = 0;
  134.     cp_we           = 0;
  135.     ind_sel         = 0;
  136.     ind_oe          = 0;
  137.     ind_we          = 0;
  138.     am_oe           = 0;
  139.     am_we           = 0;
  140.     aie_oe          = 0;
  141.     aie_we          = 0;
  142.     t1_oe           = 0;
  143.     t1_we           = 0;
  144.     t2_oe           = 0;
  145.     t2_we           = 0;
  146.     ri_oe           = 0;
  147.     ri_we           = 0;
  148.  
  149.     case(state)
  150.         `reset: begin
  151.             state_next = `fetch;
  152.         end
  153.  
  154.         `fetch: begin
  155.             cp_oe       = 1;
  156.             am_we       = 1;
  157.             state_next  = `fetch + 1;
  158.         end
  159.  
  160.         `fetch + 'd1: begin
  161.             am_oe       = 1;
  162.             state_next  = `fetch + 2;
  163.         end
  164.  
  165.         `fetch + 'd2: begin
  166.             ram_oe      = 1;
  167.             ri_we       = 1;
  168.             state_next  = `decode;
  169.         end
  170.  
  171.         `decode: begin
  172.             if(mod == 2'b11) begin
  173.                 if(cop[0:3] == 4'b0001) begin
  174.                     state_next = `load;
  175.                 end
  176.             end
  177.         end
  178.  
  179.         `load: begin
  180.             regs_addr   = rm;
  181.             regs_oe     = 1;
  182.             t1_we       = 1;
  183.             state_next  = `exec;
  184.         end
  185.  
  186.         `exec: begin
  187.             t1_oe = 1;
  188.             case(cop[4:6])
  189.                 3'b000: begin                               // INC
  190.                     alu_carry = 1;
  191.                     alu_opcode = `ADC;
  192.                 end
  193.                 3'b001: begin                               // DEC
  194.                     alu_carry = 1;
  195.                     alu_opcode = `SBB1;
  196.                 end
  197.                 3'b010: begin                               // NEG
  198.                     alu_carry = 0;
  199.                     alu_opcode = `SBB2;
  200.                 end
  201.                 3'b011: begin                               // NOT
  202.                     alu_opcode = `NOT;
  203.                 end
  204.                 3'b100: alu_opcode = `SHL;                  // SHL/SAL
  205.                 3'b101: alu_opcode = `SHR;                  // SHR
  206.                 3'b110: alu_opcode = `SAR;                  // SAR
  207.             endcase
  208.             alu_oe      = 1;
  209.             t1_we       = 1;
  210.             ind_sel     = 1;
  211.             ind_we      = 1;
  212.             state_next  = `store;
  213.         end
  214.  
  215.         `store: begin
  216.             t1_oe       = 1;
  217.             t2_oe       = 0;
  218.             alu_opcode  = `OR;
  219.             alu_oe      = 1;
  220.             regs_addr   = rm;
  221.             regs_we     = 1;
  222.             state_next  = `inc_cp;
  223.         end
  224.  
  225.         `inc_cp: begin
  226.             cp_oe       = 1;
  227.             t1_we       = 1;
  228.             state_next  = `inc_cp + 1;
  229.         end
  230.  
  231.         `inc_cp + 'd1: begin
  232.             t1_oe       = 1;
  233.             cp_we       = 1;
  234.             alu_oe      = 1;
  235.             alu_carry   = 1;
  236.             alu_opcode  = `ADC;
  237.             state_next  = `fetch;
  238.         end
  239.  
  240.         default: ;
  241.  
  242.     endcase
  243. end
  244.  
  245. assign disp_state = state;
  246.  
  247. endmodule
Advertisement
Add Comment
Please, Sign In to add comment