Advertisement
Guest User

dev_new.sv

a guest
Apr 30th, 2017
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //command bit definitions
  2. import cmd_bits::*;
  3.  
  4. module dev_new
  5. #(
  6.     // parameter declaration
  7.     parameter DW = 8    // data width
  8. )
  9. (
  10.     // inputs
  11.     input logic clk, rst, cs,
  12.     input logic [DW - 1:0] din,
  13.  
  14.     // outputs
  15.     output logic busy, drdy,
  16.     output logic [DW - 1:0] dout
  17. );
  18.    
  19.     // state register and next state value
  20.     enum logic [4:0] {ST_IDLE, ST_RCV_1, ST_RCV_2, ST_PROC, ST_TX} state, next_state;
  21.    
  22.     // data and status registers
  23.     logic [DW - 1:0] result;
  24.     logic [DW - 1:0] op_1;
  25.     logic [DW - 1:0] op_2;
  26.     logic [DW - 1:0] cmd;
  27.  
  28.     // read flag
  29.     logic read;
  30.    
  31.     // state register
  32.     always_ff @ (posedge clk or negedge rst)
  33.     begin
  34.         if (~rst) state <= ST_IDLE;
  35.         else state <= next_state;
  36.     end
  37.  
  38.     //next state logic
  39.     always_comb
  40.     begin
  41.         next_state = state;
  42.         case (state)
  43.         ST_IDLE:
  44.             if (cs)
  45.             begin
  46.                 if (din[b_op_1]) next_state = ST_RCV_1;
  47.                 else next_state = ST_PROC;
  48.             end
  49.            
  50.             else if (read)
  51.             begin
  52.                 next_state = ST_PROC;
  53.             end
  54.         ST_RCV_1:
  55.             next_state = ST_RCV_2;
  56.         ST_RCV_2:
  57.             next_state = ST_IDLE;
  58.         ST_PROC:
  59.             next_state = ST_TX;
  60.         ST_TX:
  61.             next_state = ST_IDLE;
  62.         default:
  63.             next_state = ST_IDLE;
  64.         endcase
  65.     end
  66.  
  67.     // data and status registers
  68.     always_ff @ (posedge clk or negedge rst)
  69.     begin
  70.         if (~rst)
  71.         begin
  72.             drdy <= 0;
  73.             busy <= 0;
  74.             result <= 0;
  75.             op_1 <= 0;
  76.             op_2 <= 0;
  77.             cmd <= 0;
  78.             read <= 0;
  79.         end
  80.         else
  81.         begin
  82.             //since drdy is registered, set to 1 at the clock edge when state changes to ST_TX
  83.             drdy<=(next_state==ST_TX);
  84.             //we set busy to 0 at reset and when we enter idle
  85.             busy<=!(next_state==ST_IDLE);
  86.             //latching data in registers
  87.             case (state)
  88.             ST_IDLE:
  89.                 //store command in register when we leave idle
  90.                 if (cs) cmd<=din;
  91.             ST_RCV_1:
  92.                 begin
  93.                     read <= 1;
  94.                     //store operand 1
  95.                     op_1<=din;
  96.                 end
  97.             ST_RCV_2:
  98.                 begin
  99.                     read <= 1;
  100.                     //store operand 2
  101.                     op_2<=din;
  102.                 end
  103.             ST_PROC:
  104.                 begin
  105.                     read <= 0;
  106.                
  107.                     //change result register according to opcode
  108.                     case (cmd[DW - 1:DW - 4])
  109.                         4'b1000: result <= op_1 + op_2;
  110.                         4'b0100: result <= op_1 - op_2;
  111.                         4'b0010: result <= result + op_1;
  112.                         4'b0001: result <= result - op_1;
  113.                     endcase
  114.                 end
  115.             endcase
  116.         end
  117.     end
  118.  
  119.     assign dout = result;
  120.    
  121. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement