Advertisement
Guest User

Untitled

a guest
Jun 16th, 2019
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // for MEM
  2. `define M_NOP   2'b00
  3. `define M_PUSH  2'b01
  4. `define M_POP   2'b10
  5.  
  6. // for SM - instr
  7. `define PUSH  3'b000
  8. `define ADD   3'b001
  9. `define SUB   3'b010
  10. `define MUL   3'b011
  11.  
  12. // for SM - state
  13. `define S_LEN   3'b000
  14. `define S_PRE   3'b001
  15. `define S_POP1  3'b010
  16. `define S_POP2  3'b011
  17. `define S_PUSH  3'b100
  18. `define S_ERR   3'b101
  19.  
  20. // for error
  21. `define NOERR     3'b000
  22. `define FULLPUSH  3'b001
  23. `define UNDEFINE  3'b010
  24. `define INVALID   3'b100
  25.  
  26.  
  27. module SM(clk, rst_n, instr, pc, d_valid, out_data, err_code, fin);
  28.     input clk;
  29.     input rst_n;
  30.     input [12:0] instr;
  31.     output [9:0] pc;
  32.     output reg d_valid;
  33.     output reg [19:0] out_data;
  34.     output reg [2:0] err_code;
  35.     output fin;
  36.     reg fin1;
  37.    
  38.     reg [1:0] mem_ctrl1;
  39.     reg [19:0] mw_data1;
  40.     wire signed [19:0] mr_data;
  41.     wire mFull;
  42.     wire mEmpty;
  43.    
  44.     wire [3:0] mem_count;
  45.     wire [3:0] next_memCount;
  46.     reg [3:0] mem_count1;
  47.    
  48.     SM_Mem mem(clk, rst_n, mem_ctrl1, mw_data1, mr_data, mFull, mEmpty);
  49.    
  50.     reg [9:0] length;
  51.    
  52.     wire signed [19:0] cal;
  53.     wire signed [19:0] next_cal;
  54.     reg signed [19:0] cal1;
  55.    
  56.     wire [9:0] next_pc;
  57.     reg [9:0] pc1;
  58.    
  59.     wire [2:0] state;
  60.     wire [2:0] next_state;
  61.     reg [2:0] state1;
  62.    
  63.     DFF #(10) dff_pc(clk, next_pc, pc);
  64.     DFF #(3) dff_st(clk, next_state, state);
  65.     DFF #(4) dff_cnt(clk, next_memCount, mem_count);  
  66.     DFF #(20) dff_cal(clk, next_cal, cal);  
  67.    
  68.     always @(*) begin
  69.         pc1 = pc;
  70.         state1 = state;
  71.         cal1 = cal;
  72.         d_valid = 0;
  73.         err_code = `NOERR;
  74.         case (state)
  75.             `S_LEN: begin
  76.                 length = instr[9:0];
  77.                 fin1 = 0;
  78.                 out_data = 'hz;
  79.                 mem_ctrl1 = `M_NOP;
  80.                 mw_data1 = 'hz;
  81.                 pc1 = pc + 1;
  82.                 state1 = `S_PRE;
  83.             end
  84.             `S_PRE: begin
  85.                 out_data = 'hz;
  86.                 mem_ctrl1 = `M_NOP;
  87.                 mw_data1 = 'hz;
  88.                 if (instr[12:10] == `PUSH) begin
  89.                     if (mFull == 1) begin
  90.                         state1 = `S_ERR;
  91.                     end
  92.                     else begin
  93.                         state1 = `S_PUSH;
  94.                         cal1 = $signed(instr[9:0]);
  95.                     end
  96.                 end
  97.                 else if (instr[12:10] == `ADD || instr[12:10] == `SUB || instr[12:10] == `MUL) begin
  98.                     if (mem_count < 4'd2) begin
  99.                         state1 = `S_ERR;
  100.                     end
  101.                     else begin
  102.                         state1 = `S_POP1;
  103.                         cal1 = 0;
  104.                     end
  105.                 end
  106.                 else begin
  107.                     state1 = `S_ERR;
  108.                 end
  109.             end
  110.             `S_POP1: begin
  111.                 mem_ctrl1 = `M_POP;
  112.                 cal1 = mr_data;
  113.                 state1 = `S_POP2;
  114.             end
  115.             `S_POP2: begin
  116.                 mem_ctrl1 = `M_POP;
  117.                 if (instr[12:10] == `ADD) begin
  118.                     cal1 = cal + mr_data;
  119.                 end
  120.                 else if (instr[12:10] == `SUB) begin
  121.                     cal1 = cal - mr_data;
  122.                 end
  123.                 else if (instr[12:10] == `MUL) begin
  124.                     cal1 = cal * mr_data;
  125.                 end
  126.                 else begin end
  127.                 state1 = `S_PUSH;
  128.             end
  129.             `S_PUSH: begin
  130.                 mem_ctrl1 = `M_PUSH;
  131.                 mw_data1 = cal;
  132.                 case (instr[12:10])
  133.                     `ADD: begin
  134.                         d_valid = 1;
  135.                         out_data = cal;            
  136.                     end
  137.                     `SUB: begin
  138.                         d_valid = 1;
  139.                         out_data = cal;            
  140.                     end
  141.                     `MUL: begin
  142.                         d_valid = 1;
  143.                         out_data = cal;            
  144.                     end
  145.                     default: begin
  146.                         out_data = 'hz;
  147.                     end
  148.                 endcase
  149.                 pc1 = pc + 1;
  150.                 state1 = `S_PRE;
  151.             end
  152.             `S_ERR: begin
  153.                 d_valid = 1;
  154.                 out_data = 0;
  155.                 if (instr[12:10] == `PUSH) begin
  156.                     err_code = `FULLPUSH;
  157.                 end
  158.                 else if (instr[12:10] == `ADD || instr[12:10] == `SUB || instr[12:10] == `MUL) begin
  159.                     err_code = `INVALID;
  160.                 end
  161.                 else begin
  162.                     err_code = `UNDEFINE;
  163.                 end
  164.                 mem_ctrl1 = `M_NOP;
  165.                 pc1 = pc + 1;
  166.                 state1 = `S_PRE;
  167.             end
  168.             default: begin end
  169.         endcase
  170.        
  171.         if (pc == length) begin
  172.             fin1 = 1;
  173.         end
  174.         else begin end    
  175.     end
  176.    
  177.     always @(*) begin
  178.         mem_count1 = mem_count;
  179.         case (state)
  180.             `S_POP1: begin
  181.                 mem_count1 = mem_count - 1;
  182.             end
  183.             `S_POP2: begin
  184.                 mem_count1 = mem_count - 1;
  185.             end
  186.             `S_PUSH: begin
  187.                 mem_count1 = mem_count + 1;
  188.             end
  189.             default: begin end
  190.         endcase
  191.     end
  192.    
  193.     assign next_pc = (rst_n == 0)? 10'd1023 : pc1;
  194.     assign next_state = (rst_n == 0)? `S_LEN : state1;
  195.     assign next_cal = (rst_n == 0)? 0 : cal1;
  196.     assign next_memCount = (rst_n == 0)? 4'd0 : mem_count1;
  197.     assign fin = (rst_n == 0)? 0 : fin1;
  198. endmodule
  199.  
  200. module SM_Mem(clk, rst_n, cntrl, w_data, r_data, full, empty);
  201.     input clk;
  202.     input rst_n;
  203.     input [1:0] cntrl;
  204.     input [19:0] w_data;
  205.     output [19:0] r_data;
  206.     output full;
  207.     output empty;
  208.    
  209.     reg [19:0] stack[7:0];
  210.     reg [3:0] top1;
  211.     wire [3:0] top;
  212.     wire [3:0] next_top;
  213.    
  214.     wire [19:0] next_Rdata;
  215.     reg [19:0] r_data1;
  216.    
  217.     DFF #(4) dff_t(clk, next_top, top);
  218.    
  219.     always @(*) begin
  220.         top1 = top;
  221.         case (cntrl)
  222.             `M_NOP: begin
  223.                 r_data1 = 0;
  224.             end
  225.             `M_PUSH: begin
  226.                 stack[top] = w_data;
  227.                 top1 = top + 1;
  228.                 r_data1 = 0;
  229.             end
  230.             `M_POP: begin
  231.                 r_data1 = stack[top - 1];
  232.                 top1 = top - 1;
  233.             end
  234.             default: begin end
  235.         endcase    
  236.     end
  237.    
  238.     assign next_top = (rst_n == 0)? 0 : top1;
  239.     assign r_data = (rst_n == 0)? 0 : r_data1;
  240.     assign empty = (top == 4'd0)? 1 : 0;
  241.     assign full = (top == 4'd8)? 1 : 0;
  242. endmodule
  243.  
  244. module DFF (clk, next_out, out);
  245.     parameter n = 1;
  246.     input clk;
  247.     input [n-1:0] next_out;
  248.     output reg [n-1:0] out;
  249.     always @(posedge clk) begin
  250.         out <= next_out;
  251.     end
  252. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement