Advertisement
aidanozo

Untitled

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