Advertisement
aidanozo

Untitled

Dec 11th, 2024
48
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
VeriLog 12.92 KB | None | 0 0
  1.  
  2. module uc(
  3.         clk,
  4.         rst,
  5.         ri,
  6.         ind,
  7.         regs_addr,
  8.         regs_oe,
  9.         regs_we,
  10.         alu_oe,
  11.         alu_carry,
  12.         alu_opcode,
  13.         ram_oe,
  14.         ram_we,
  15.         io_oe,
  16.         io_we,
  17.         cp_oe,
  18.         cp_we,
  19.         ind_sel,
  20.         ind_oe,
  21.         ind_we,
  22.         am_oe,
  23.         am_we,
  24.         aie_oe,
  25.         aie_we,
  26.         t1_oe,
  27.         t1_we,
  28.         t2_oe,
  29.         t2_we,
  30.         ri_oe,
  31.         ri_we,
  32.         disp_state
  33.     );
  34.  
  35. parameter word_width =          16;
  36. parameter state_width =         16;
  37.  
  38. `define ADC                     0
  39. `define SBB1                    1
  40. `define SBB2                    2
  41. `define NOT                     3
  42. `define AND                     4
  43. `define OR                      5
  44. `define XOR                     6
  45. `define SHL                     7
  46. `define SHR                     8
  47. `define SAR                     9
  48.  
  49. `define RA                      0
  50. `define RB                      1
  51. `define RC                      2
  52. `define IS                      3
  53. `define XA                      4
  54. `define XB                      5
  55. `define BA                      6
  56. `define BB                      7
  57.  
  58. input                           clk;
  59. input                           rst;
  60. input [word_width-1 : 0]        ri;
  61. input [word_width-1 : 0]        ind;
  62. output reg                      alu_oe;
  63. output reg                      alu_carry;
  64. output reg[3 : 0]               alu_opcode;
  65. output reg                      ram_oe;
  66. output reg                      ram_we;
  67. output reg                      io_oe;
  68. output reg                      io_we;
  69. output reg[2 : 0]               regs_addr;
  70. output reg                      regs_oe;
  71. output reg                      regs_we;
  72. output reg                      cp_oe;
  73. output reg                      cp_we;
  74. output reg                      ind_sel;        // controls IND register input (0 = bus, 1 = alu flags)
  75. output reg                      ind_oe;
  76. output reg                      ind_we;
  77. output reg                      am_oe;
  78. output reg                      am_we;
  79. output reg                      aie_oe;
  80. output reg                      aie_we;
  81. output reg                      t1_oe;
  82. output reg                      t1_we;
  83. output reg                      t2_oe;
  84. output reg                      t2_we;
  85. output reg                      ri_oe;          // controls RI register output which generates the offset for Jcond instructions
  86. output reg                      ri_we;
  87. output[state_width-1 : 0]       disp_state;
  88.  
  89. wire [0:6]                      cop;
  90. wire                            d;
  91. wire [0:1]                      mod;
  92. wire [0:2]                      rg;
  93. wire [0:2]                      rm;
  94.  
  95. assign cop  = {ri[0], ri[1], ri[2], ri[3], ri[4], ri[5], ri[6]};
  96. assign d    = {ri[7]};
  97. assign mod  = {ri[8], ri[9]};
  98. assign rg   = {ri[10], ri[11], ri[12]};
  99. assign rm   = {ri[13], ri[14], ri[15]};
  100.  
  101. `define reset                   'h00            // reset state
  102. `define fetch                   'h10            // load instruction to instruction register
  103. `define decode                  'h20            // analyze loaded instruction
  104. `define addr_sum                'h30            // computes address of the form [By+Xz] with y,z in {A, B}
  105. `define addr_reg                'h34            // computes address of the form [yz] with y in {X, B} and z in {A, B}
  106. `define load_src_reg            'h40            // load source operand from register
  107. `define load_src_mem            'h44            // load source operand from memory
  108. `define load_dst_reg            'h50            // load destination operand from register
  109. `define load_dst_mem            'h54            // load destination operand from memory
  110. `define exec_1op                'h60            // execute 1 operand instructions
  111. `define exec_2op                'h64            // execute 2 operand instructions
  112. `define store_reg               'h70            // store result to register
  113. `define store_mem               'h74            // store result to memory
  114. `define inc_cp                  'h80            // increment program counter
  115.  
  116. reg [state_width-1 : 0] state = `reset, state_next;
  117. reg [state_width-1 : 0] decoded_src, decoded_src_next;      // stores decoded source operand load state
  118. reg [state_width-1 : 0] decoded_dst, decoded_dst_next;      // stores decoded destination operand load state
  119. reg [state_width-1 : 0] decoded_exec, decoded_exec_next;    // stores decoded execute state
  120. reg [state_width-1 : 0] decoded_store, decoded_store_next;  // stores decoded store state
  121. reg decoded_d, decoded_d_next;                              // stores decoded direction bit
  122.  
  123. // FSM - sequential part
  124. always @(posedge clk) begin
  125.     state <= `reset;
  126.  
  127.     if(!rst) begin
  128.         state <= state_next;
  129.  
  130.         if(state == `decode) begin
  131.             decoded_src <= decoded_src_next;
  132.             decoded_dst <= decoded_dst_next;
  133.             decoded_exec <= decoded_exec_next;
  134.             decoded_store <= decoded_store_next;
  135.             decoded_d <= decoded_d_next;
  136.         end
  137.     end
  138. end
  139.  
  140. // FSM - combinational part
  141. always @(*) begin
  142.     state_next = `reset;
  143.     decoded_src_next = `reset;
  144.     decoded_dst_next = `reset;
  145.     decoded_exec_next = `reset;
  146.     decoded_store_next = `reset;
  147.     decoded_d_next = 0;
  148.     alu_oe = 0;
  149.     alu_carry = 0;
  150.     alu_opcode = 0;
  151.     ram_oe = 0;
  152.     ram_we = 0;
  153.     io_oe = 0;
  154.     io_we = 0;
  155.     regs_addr = 0;
  156.     regs_oe = 0;
  157.     regs_we = 0;
  158.     cp_oe = 0;
  159.     cp_we = 0;
  160.     ind_sel = 0;
  161.     ind_oe = 0;
  162.     ind_we = 0;
  163.     am_oe = 0;
  164.     am_we = 0;
  165.     aie_oe = 0;
  166.     aie_we = 0;
  167.     t1_oe = 0;
  168.     t1_we = 0;
  169.     t2_oe = 0;
  170.     t2_we = 0;
  171.     ri_oe = 0;
  172.     ri_we = 0;
  173.  
  174.     case(state)
  175.         `reset: begin
  176.             state_next = `fetch;
  177.         end
  178.  
  179.         `fetch: begin
  180.             cp_oe = 1;
  181.             am_we = 1;
  182.  
  183.             state_next = `fetch + 1;
  184.         end
  185.  
  186.         `fetch + 'd1: begin
  187.             am_oe = 1;
  188.  
  189.             state_next = `fetch + 2;
  190.         end
  191.  
  192.         `fetch + 'd2: begin
  193.             ram_oe = 1;
  194.             ri_we = 1;
  195.  
  196.             state_next = `decode;
  197.         end
  198.  
  199.         `decode: begin
  200.             // decode location of operands and operation
  201.             if(cop[0:3] == 4'b0001) begin           // one operand instructions
  202.                 decoded_d_next      = 0;
  203.                 decoded_dst_next    = mod == 2'b11 ? `load_dst_reg : `load_dst_mem;
  204.                 decoded_src_next    = decoded_dst_next;
  205.                 decoded_exec_next   = `exec_1op;
  206.                 decoded_store_next  = mod == 2'b11 ? `store_reg : `store_mem;
  207.             end
  208.             else if(cop[0:2] == 3'b010) begin       // two operand instructions
  209.                 decoded_d_next      = d;
  210.                 decoded_dst_next    = (mod == 2'b11) || (d == 1) ? `load_dst_reg : `load_dst_mem;
  211.                 decoded_src_next    = (mod == 2'b11) || (d == 0) ? `load_src_reg : `load_src_mem;
  212.                 decoded_exec_next   = `exec_2op;
  213.                 decoded_store_next  = !cop[3] ? `inc_cp : ((mod == 2'b11) || (d == 1) ? `store_reg : `store_mem);
  214.             end
  215.            
  216.             // decode address calculation mode
  217.             case(mod)
  218.                 2'b00: begin
  219.                     state_next = rm[0] ? `addr_reg : `addr_sum;
  220.                 end
  221.                
  222.                 2'b11: begin
  223.                     state_next = decoded_src_next;
  224.                 end
  225.             endcase
  226.         end
  227.        
  228.         `addr_sum: begin
  229.             regs_addr = rm[1] ? `BB : `BA;
  230.             regs_oe = 1;
  231.             t1_we = 1;
  232.  
  233.             state_next = `addr_sum + 1;
  234.         end
  235.  
  236.         `addr_sum + 'd1: begin
  237.             regs_addr = rm[2] ? `XB : `XA;
  238.             regs_oe = 1;
  239.             t2_we = 1;
  240.  
  241.             state_next = `addr_sum + 2;
  242.         end
  243.  
  244.         `addr_sum + 'd2: begin
  245.             t1_oe = 1;
  246.             t2_oe = 1;
  247.             alu_carry = 0;
  248.             alu_opcode = `ADC;
  249.             alu_oe = 1;
  250.             if(decoded_d)
  251.                 t2_we = 1;
  252.             else
  253.                 t1_we = 1;
  254.  
  255.             state_next = decoded_src;
  256.         end
  257.        
  258.         `addr_reg: begin
  259.             regs_addr = rm;
  260.             regs_oe = 1;
  261.             if(decoded_d)
  262.                 t2_we = 1;
  263.             else
  264.                 t1_we = 1;
  265.  
  266.             state_next = decoded_src;
  267.         end
  268.        
  269.         `load_src_reg: begin
  270.             regs_addr = decoded_d ? rm : rg;
  271.             regs_oe = 1;
  272.             t2_we = 1;
  273.  
  274.             state_next = decoded_dst;
  275.         end
  276.        
  277.         `load_src_mem: begin
  278.             t1_oe = 0;
  279.             t2_oe = 1;
  280.             alu_opcode = `OR;
  281.             alu_oe = 1;
  282.             am_we = 1;
  283.  
  284.             state_next = `load_src_mem + 1;
  285.         end
  286.  
  287.         `load_src_mem + 'd1: begin
  288.             am_oe = 1;
  289.  
  290.             state_next = `load_src_mem + 2;
  291.         end
  292.  
  293.         `load_src_mem + 'd2: begin
  294.             ram_oe = 1;
  295.             t2_we = 1;
  296.  
  297.             state_next = decoded_dst;
  298.         end
  299.  
  300.         `load_dst_reg: begin
  301.             regs_addr = decoded_d ? rg : rm;
  302.             regs_oe = 1;
  303.             t1_we = 1;
  304.  
  305.             state_next = decoded_exec;
  306.         end
  307.        
  308.         `load_dst_mem: begin
  309.             t1_oe = 1;
  310.             t2_oe = 0;
  311.             alu_opcode = `OR;
  312.             alu_oe = 1;
  313.             am_we = 1;
  314.  
  315.             state_next = `load_dst_mem + 1;
  316.         end
  317.  
  318.         `load_dst_mem + 'd1: begin
  319.             am_oe = 1;
  320.  
  321.             state_next = `load_dst_mem + 2;
  322.         end
  323.  
  324.         `load_dst_mem + 'd2: begin
  325.             ram_oe = 1;
  326.             t1_we = 1;
  327.  
  328.             state_next = decoded_exec;
  329.         end
  330.  
  331.         `exec_1op: begin
  332.             t1_oe = 1;
  333.             case(cop[4:6])
  334.                 3'b000: begin                               // INC
  335.                     alu_carry = 1;
  336.                     alu_opcode = `ADC;
  337.                 end
  338.                 3'b001: begin                               // DEC
  339.                     alu_carry = 1;
  340.                     alu_opcode = `SBB1;
  341.                 end
  342.                 3'b010: begin                               // NEG
  343.                     alu_carry = 0;
  344.                     alu_opcode = `SBB2;
  345.                 end
  346.                 3'b011: begin                               // NOT
  347.                     alu_opcode = `NOT;
  348.                 end
  349.                 3'b100: alu_opcode = `SHL;                  // SHL/SAL
  350.                 3'b101: alu_opcode = `SHR;                  // SHR
  351.                 3'b110: alu_opcode = `SAR;                  // SAR
  352.             endcase
  353.             alu_oe = 1;
  354.             t1_we = 1;
  355.             ind_sel = 1;
  356.             ind_we = 1;
  357.  
  358.             state_next = decoded_store;
  359.         end
  360.        
  361.         `exec_2op: begin
  362.             t1_oe = 1;
  363.             t2_oe = 1;
  364.             case(cop[4:6])
  365.                 3'b000: begin                               // ADD
  366.                     alu_carry = 0;
  367.                     alu_opcode = `ADC;
  368.                 end
  369.                 3'b001: begin                               // ADC
  370.                     alu_carry = ind[0];
  371.                     alu_opcode = `ADC;
  372.                 end
  373.                 3'b010: begin                               // SUB/CMP
  374.                     alu_carry = 0;
  375.                     alu_opcode = `SBB1;
  376.                 end
  377.                 3'b011: begin                               // SBB
  378.                     alu_carry = ind[0];
  379.                     alu_opcode = `SBB1;
  380.                 end
  381.                 3'b100: alu_opcode = `AND;                  // AND/TEST
  382.                 3'b101: alu_opcode = `OR;                   // OR
  383.                 3'b110: alu_opcode = `XOR;                  // XOR
  384.             endcase
  385.             alu_oe = 1;
  386.             t1_we = 1;
  387.             ind_sel = 1;
  388.             ind_we = 1;
  389.  
  390.             state_next = decoded_store;
  391.         end
  392.        
  393.         `store_reg: begin
  394.             t1_oe = 1;
  395.             t2_oe = 0;
  396.             alu_opcode = `OR;
  397.             alu_oe = 1;
  398.             regs_addr = decoded_d ? rg : rm;
  399.             regs_we = 1;
  400.  
  401.             state_next = `inc_cp;
  402.         end
  403.        
  404.         `store_mem: begin
  405.             t1_oe = 1;
  406.             t2_oe = 0;
  407.             alu_opcode = `OR;
  408.             alu_oe = 1;
  409.             am_oe = 1;
  410.             ram_we = 1;
  411.  
  412.             state_next = `store_mem + 1;
  413.         end
  414.  
  415.         `store_mem + 'd1: begin
  416.             state_next = `inc_cp;
  417.         end
  418.  
  419.         `inc_cp: begin
  420.             cp_oe = 1;
  421.             t1_we = 1;
  422.  
  423.             state_next = `inc_cp + 1;
  424.         end
  425.  
  426.         `inc_cp + 'd1: begin
  427.             t1_oe = 1;
  428.             cp_we = 1;
  429.             alu_oe = 1;
  430.             alu_carry = 1;
  431.             alu_opcode = `ADC;
  432.  
  433.             state_next = `fetch;
  434.         end
  435.  
  436.         default: ;
  437.     endcase
  438. end
  439.  
  440. assign disp_state = state;
  441.  
  442. endmodule
  443.  
  444.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement