주소 발생 업다운 카운터
module faultRecoveryCounter (
input clki,rst_n,
input modeSel,
output reg [11:0] state,
output reg [19:0] cnt
);
//localparam st0 =4'd0, st1=4'd1,st2=4'd2,st3=4'd3,st4=4'd4,st5=4'd5,st6=4'd6,st7=4'd7,st8=4'd8,st9=4'd9,stRecovery=4'd10,stIdle=4'd15;
localparam st0 =12'b1111_1111_1110, st1=12'b1111_1111_1101,st2=12'b1111_1111_1011,st3=12'b1111_1111_0111,
st4=12'b1111_1110_1111,st5=12'b1111_1101_1111,st6=12'b1111_1011_1111,st7=12'b1111_0111_1111,
st8=12'b1110_1111_1111,st9=12'b1101_1111_1111,stRecovery=12'b1011_1111_1111, stIDLE=12'b11111_1111_1111;
localparam FAIL=1'b1,pstateSuccess=1'b0;
reg [9:0] faults;
(* dont_touch ="yes" *) reg [11:0] expected_addr,fault_addr,safe_addr,safe_addr_d;
(* dont_touch ="yes" *) wire clkn;
reg [7:0] fault_cnt;
reg en_r1,en_r2,upDown_r,rst_r;
clk_wiz_0 CLOCK
(
.clk_out1(clk),
.clk_out2(clkn),
// .clk_out3(clk_out3),
.reset(1'b0),
.locked(locked),
.clk_in1(clki)
);
// BUFG G0 (.O(clk),.I(clki));
reg [19:0] cnt_r;
reg UP;
parameter TOP=(20'b1000_0000_0000_0000_0000-1);
always @(posedge clk)
begin
if(rst_n==1'b0)
begin
cnt_r<=0;
end
else if(UP==1'b1)
cnt_r<=cnt_r+1;
else
cnt_r<=cnt_r-1;
if(rst_n==1'b0)
UP=1'b1;
else if(cnt_r>=TOP)
UP<=1'b0;
else if(cnt_r<=1)
UP<=1'b1;
cnt<=cnt_r;
end
always @(posedge clk)
begin
if(rst_n==1'b0)
begin
expected_addr<=stIDLE;
fault_cnt<=0;
end
else
begin
case(expected_addr)
stIDLE: expected_addr<= expected_addr[10]!=1'b0 ? st0:stIDLE;
st0: expected_addr<=(expected_addr[10]!=1'b0 )?st1:st0;
st1: expected_addr<=(expected_addr[10]!=1'b0 )?st2:st1;
st2: expected_addr<=(expected_addr[10]!=1'b0 )?st3:st2;
st3: expected_addr<=(expected_addr[10]!=1'b0 )?st4:st3;
st4: expected_addr<=(expected_addr[10]!=1'b0 )?st5:st4;
st5: expected_addr<=(expected_addr[10]!=1'b0 )?st6:st5;
st6: expected_addr<=(expected_addr[10]!=1'b0 )?st7:st6;
st7: expected_addr<=(expected_addr[10]!=1'b0 )?st8:st7;
st8: expected_addr<=(expected_addr[10]!=1'b0 )?st9:st8;
st9: expected_addr<=(expected_addr[10]!=1'b0 )?st0:st9;
stRecovery:expected_addr <= fault_addr;
default: begin
//fault_addr <=stIDLE;
fault_addr <=(modeSel==1'b0) ?{2'b11,safe_addr_d[9:0]} : stIDLE;
expected_addr <=stRecovery;
fault_cnt<=fault_cnt+1;
end
endcase
state <= expected_addr;
end
end
always @(posedge clkn)
begin
safe_addr <= (expected_addr[10]!=1'b0 )? expected_addr : safe_addr;
safe_addr_d <= (expected_addr[10]!=1'b0) ? safe_addr : safe_addr_d;
end
endmodule
module faultRecoveryCounter (
input clki,rst_n,
input modeSel,
output reg [11:0] state,
output reg [19:0] cnt
);
//localparam st0 =4'd0, st1=4'd1,st2=4'd2,st3=4'd3,st4=4'd4,st5=4'd5,st6=4'd6,st7=4'd7,st8=4'd8,st9=4'd9,stRecovery=4'd10,stIdle=4'd15;
localparam st0 =12'b1111_1111_1110, st1=12'b1111_1111_1101,st2=12'b1111_1111_1011,st3=12'b1111_1111_0111,
st4=12'b1111_1110_1111,st5=12'b1111_1101_1111,st6=12'b1111_1011_1111,st7=12'b1111_0111_1111,
st8=12'b1110_1111_1111,st9=12'b1101_1111_1111,stRecovery=12'b1011_1111_1111, stIDLE=12'b11111_1111_1111;
localparam FAIL=1'b1,pstateSuccess=1'b0;
reg [9:0] faults;
(* dont_touch ="yes" *) reg [11:0] expected_addr,fault_addr,safe_addr,safe_addr_d;
(* dont_touch ="yes" *) wire clkn;
reg [7:0] fault_cnt;
reg en_r1,en_r2,upDown_r,rst_r;
clk_wiz_0 CLOCK
(
.clk_out1(clk),
.clk_out2(clkn),
// .clk_out3(clk_out3),
.reset(1'b0),
.locked(locked),
.clk_in1(clki)
);
// BUFG G0 (.O(clk),.I(clki));
reg [19:0] cnt_r;
reg UP;
parameter TOP=(20'b1000_0000_0000_0000_0000-1);
always @(posedge clk)
begin
if(rst_n==1'b0)
begin
cnt_r<=0;
end
else if(UP==1'b1)
cnt_r<=cnt_r+1;
else
cnt_r<=cnt_r-1;
if(rst_n==1'b0)
UP=1'b1;
else if(cnt_r>=TOP)
UP<=1'b0;
else if(cnt_r<=1)
UP<=1'b1;
cnt<=cnt_r;
end
always @(posedge clk)
begin
if(rst_n==1'b0)
begin
expected_addr<=stIDLE;
fault_cnt<=0;
end
else
begin
case(expected_addr)
stIDLE: expected_addr<= expected_addr[10]!=1'b0 ? st0:stIDLE;
st0: expected_addr<=(expected_addr[10]!=1'b0 )?st1:st0;
st1: expected_addr<=(expected_addr[10]!=1'b0 )?st2:st1;
st2: expected_addr<=(expected_addr[10]!=1'b0 )?st3:st2;
st3: expected_addr<=(expected_addr[10]!=1'b0 )?st4:st3;
st4: expected_addr<=(expected_addr[10]!=1'b0 )?st5:st4;
st5: expected_addr<=(expected_addr[10]!=1'b0 )?st6:st5;
st6: expected_addr<=(expected_addr[10]!=1'b0 )?st7:st6;
st7: expected_addr<=(expected_addr[10]!=1'b0 )?st8:st7;
st8: expected_addr<=(expected_addr[10]!=1'b0 )?st9:st8;
st9: expected_addr<=(expected_addr[10]!=1'b0 )?st0:st9;
stRecovery:expected_addr <= fault_addr;
default: begin
//fault_addr <=stIDLE;
fault_addr <=(modeSel==1'b0) ?{2'b11,safe_addr_d[9:0]} : stIDLE;
expected_addr <=stRecovery;
fault_cnt<=fault_cnt+1;
end
endcase
state <= expected_addr;
end
end
always @(posedge clkn)
begin
safe_addr <= (expected_addr[10]!=1'b0 )? expected_addr : safe_addr;
safe_addr_d <= (expected_addr[10]!=1'b0) ? safe_addr : safe_addr_d;
end
endmodule