blob: 9534432e04882d994c3df4c4f3beb023cff770dd [file] [log] [blame]
module FPU_FSM(clk,rst_l,Active_Process,Activation_Signal,Memory_Activation,PC,Instruction,Instruction_out,Multi_Cycle);
input clk,rst_l,Activation_Signal,Active_Process,Multi_Cycle;
input [31:0]Instruction;
output Memory_Activation;
//output [23:0]Output_1_Hot_Encoded_Opcode;
output reg[31:0]PC;
output [31:0]Instruction_out;
reg [1:0]State;
wire [1:0]Next_State;
wire Exception;
/*
sfpu[0] = Fadd
sfpu[1] = Fsubb
sfpu[2] = Fmul
sfpu[3] = Fdiv
sfpu[4] = Fsqrt
sfpu[5] = Fmin
sfpu[6] = Fmax
sfpu[7] = Fmvx
sfpu[8] = Fmvf
sfpu[9] = feq
sfpu[10] = flt
sfpu[11] = fle
sfpu[12] = Fmadd
sfpu[13] = Fmsubb
sfpu[14] = FCVT.W.P
sfpu[15] = FCVT.P.W
sfpu[16] = Fnmsubb
sfpu[17] = Fnmadd
sfpu[18] = fsgnj
sfpu[19] = fsgnjn
sfpu[20] = fsgnjx
sfpu[21] = fclass
sfpu[22] = unsign
sfpu[23] = sign
*/
//assign Multi_Cycle = 1'b0;
assign Memory_Activation = (((~Next_State[1]) & (Next_State[0])) & (Active_Process));
assign Next_State[0] = (((~State[0]) & (State[1] | Active_Process)) | ((State[1] & State[0]) & ((~Activation_Signal) | (Activation_Signal & (~Multi_Cycle)))));
assign Next_State[1] = (((~State[1]) & (State[0])) | ((State[1]) & (~State[0])) | (State[1] & State[0] & (~Activation_Signal)));
assign Instruction_out = (~rst_l) ? 32'h00000000 : (State == 2'b10) ? Instruction : 32'h00000000;
always @(posedge clk)
PC <= (~rst_l) ? 32'h00000000 : ((State == 2'b01) ? (PC[31:0] + 4'h4) : (Instruction == 32'h00000010) ? 32'h00000000 : PC);
//sequential State register block
always @(posedge clk)
State <= (~rst_l) ? 2'b00 : Next_State;
//combinational State assignment block
/*always @(posedge clk)
begin
if(Next_State==2'b00)
Output_1_Hot_Encoded_Opcode <= 24'h000000;
else if(State==2'b01)
Output_1_Hot_Encoded_Opcode <= Uncontrolled_Opcode;
else
Output_1_Hot_Encoded_Opcode <= Uncontrolled_Opcode;
end*/
/*initial
begin
$dumpfile("FPU_FSM.vcd");
$dumpvars(0);
end*/
endmodule