OpenFPGA/openfpga_flow/benchmarks/micro_benchmark/SAPone/rtl/Controller.v

119 lines
1.8 KiB
Verilog

module Controller(
output reg [11:0] control_signals,
input [3:0] opcode,
input clk,
input clr_
);
reg [3:0] ps, ns;
always @(posedge clk)
begin
if(~clr_) ps <= 4'd0;
else ps <= ns;
end
always @(*)
begin
case(ps)
0:
begin
control_signals = 12'h3e3;
ns = 4'd1;
end
1: //T1
begin
control_signals = 12'h5e3;
ns = 4'd2;
end
2: //T2
begin
// control_signals = 12'hbe3;
control_signals = 12'h863;
ns = 4'd3;
end
3: //T3
begin
// control_signals = 12'h263;
control_signals = 12'h3e3;
if(opcode == 4'd0) //LDA
ns = 4'd4;
else if(opcode == 4'd1) //ADD
ns = 4'd6;
else if(opcode == 4'd2) //SUB
ns = 4'd9;
else if(opcode == 4'd14) //OUT
ns = 4'd12;
else if(opcode == 4'd15) //HLT
ns = 4'd13;
end
4: //LDA
begin
control_signals = 12'h1a3;
ns = 4'd5;
end
5: //LDA
begin
control_signals = 12'h2c3;
ns = 4'd1;
end
6: //ADD
begin
control_signals = 12'h1a3;
ns = 4'd7;
end
7: //ADD
begin
control_signals = 12'h2e1;
ns = 4'd8;
end
8: //ADD
begin
control_signals = 12'h3c7;
ns = 4'd1;
end
9: //SUB
begin
control_signals = 12'h1a3;
ns = 4'd10;
end
10: //SUB
begin
control_signals = 12'h2e1;
ns = 4'd11;
end
11: //SUB
begin
control_signals = 12'h3cf;
ns = 4'd1;
end
12: //OUT
begin
control_signals = 12'h3f2;
ns = 4'd1;
end
13: //HLT
ns = 4'd13;
default:
begin
ns = 4'd0;
control_signals = 12'h3e3;
end
endcase
end
endmodule