module TlogicState5
(
input clk,rst_n,mode, // mode:0 pLogic, 1:nLogic
output reg sync_n,
input ctrl_i,
output wire ctrl_o
);
reg [1:0] st,nst,rst;
wire [2:0] conn_w;
wire p;
wire p_1,p_2,p_3;
wire clk_o;
reg [7:0] timer;
reg time_out;
always @(posedge clk_o or negedge rst_n)
begin
if(rst_n==1'b0)
begin
st<=2'b00;
timer<=0;
end
else if(time_out==1'b1)
begin
st<=2'b00;
timer<=0;
end
else if(!p_1||!p_2||!p_3)
begin
st<=nst;
rst<=st;
timer<=0;
ctrl_r= ctrl_o;
end
else
begin
st<=rst;
timer<=timer+1'b1;
end
time_out = timer==8'b1000_0000;
end
reg rstN;
always @(posedge clk)
begin
sync_n<=time_out;
end
always @(posedge clk)
rstN = (time_out==1'b0) ? rst_n & ~sync_n:rst_n & sync_n;
wire so,so1;
wire ctrl_o1,ctrl_o2,ctrl_o3;
reg ctrl_r;
wire d = (mode==1'b0) ? ctrl_i : ~ctrl_i;
TlogicEn3 U0 (.clk(clk),.rst_n(rstN),.d(d),.dn(),.p(),.out(conn_w),.so() );
TlogicDe3 U1 (.clk(clk),.rst_n(rstN),.in(conn_w),.si(),.clk_o(clk_o),.d(ctrl_o1),.dn(),.p(p_1));
TlogicEn4 U2 (.clk(clk),.rst_n(rstN),.d(d),.dn(),.p(),.out(),.so(so) );
TlogicDe4 U3 (.clk(clk),.rst_n(rstN),.in(),.si(so),.clk_o(),.d(ctrl_o2),.dn(),.p(p_2));
TlogicEn4 U4 (.clk(clk),.rst_n(rstN),.d(d),.dn(),.p(),.out(),.so(so1) );
TlogicDe4 U5 (.clk(clk),.rst_n(rstN),.in(),.si(so1),.clk_o(),.d(ctrl_o3),.dn(),.p(p_3));
assign ctrl_o = (p_1==1'b0) ? ctrl_o1 : (p_2==1'b0) ? ctrl_o2 : (p_3==1'b0) ? ctrl_o3 : ctrl_r;
always @(*)
begin:Combi
case({mode,st})
3'b0_00: begin
if(ctrl_o==1'b0 )
nst<=2'b01;
else
nst<=2'b11;
end
3'b0_01: begin
if(ctrl_o==1'b0)
nst<=2'b10;
else
nst<=2'b00;
end
3'b0_10: begin
if(ctrl_o==1'b0)
nst<=2'b11;
else
nst<=2'b01;
end
3'b0_11: begin
if(ctrl_o==1'b0)
nst<=2'b00;
else
nst<=2'b10;
end
3'b1_00: begin
if(ctrl_o==1'b1 )
nst<=2'b01;
else
nst<=2'b11;
end
3'b1_01: begin
if(ctrl_o==1'b1)
nst<=2'b10;
else
nst<=2'b00;
end
3'b1_10: begin
if(ctrl_o==1'b1)
nst<=2'b11;
else
nst<=2'b01;
end
3'b1_11: begin
if(ctrl_o==1'b1)
nst<=2'b00;
else
nst<=2'b10;
end
endcase
end
endmodule