Advertisement
aidanozohor1810

Untitled

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