第三章 研究方法
3.5 硬體模擬結果
3.5.3 Main Control 模擬測試
a. 由時序圖中可以見得,在控制電路中,p_state 路徑為:
0 → 1 → 2 → 3 → 6 → 0 正確無誤。
CASE 3、P_state 路徑為 0 → 1 → 4 → 0:
圖 3.5.3- 3、CASE 3 電路時序圖 a. 由時序圖中可以見得,在控制電路中,p_state 路徑為:
0 → 1 → 4 → 0 正確無誤。
CASE 4、P_state 路徑為 0 → 1 → 4 → 5 → 0:
圖 3.5.3- 4、CASE 4 電路時序圖 a. 由時序圖中可以見得,在控制電路中,p_state 路徑為:
0 → 1 → 4 → 5 → 0 正確無誤。
CASE 5、P_state 路徑為 0 → 1 → 4 → 5 → 6 → 0:
圖 3.5.3- 5、CASE 5 電路時序圖
a. 由時序圖中可以見得,在控制電路中,p_state 路徑為:
0 → 1 → 4 → 5 → 6 → 0 正確無誤。
3.5.4 完整電路模擬與測試結果
我們經由上述小節的模擬與結果,確認每塊電路皆能正常動作,最後我們將所有 電路連接,測試本篇論文之方法是能準確的找出我們所要得最頻繁項目。
CASE 1、IP 個數為 30 個,總票數為 320 票,TOP 5 總票數為 215 票:
TOP 1、IP:135.13.216.191 → 870dd8bf (16 進位) TOP 2、IP:172.16.115.5 → ac107305 (16 進位) TOP 3、IP:207.46.130.139 → cf2e828b (16 進位) TOP 4、IP:172.16.117.52 → ac107534 (16 進位) TOP 5、IP:172.16.114.148 → ac107294 (16 進位)
圖 3.5.4- 1、CASE 1 電路時序圖
a. 測試資料為非 Zipf 分佈票數,可以看到我們的結果是完全相符的 TOP 1、IP:135.13.216.191 → 870dd8bf (16 進位)
TOP 2、IP:172.16.115.5 → ac107305 (16 進位) TOP 3、IP:207.46.130.139 → cf2e828b (16 進位) TOP 4、IP:172.16.117.52 → ac107534 (16 進位) TOP 5、IP:172.16.114.148 → ac107294 (16 進位)
CASE 2、IP 個數為 200 個,總票數為 4528 票,TOP 5 總票數為 2264 票:
TOP 1、IP:135.13.216.0 → 870dd800 (16 進位) TOP 2、IP:135.13.216.1 → 870dd801 (16 進位) TOP 3、IP:135.13.216.2 → 870dd802 (16 進位) TOP 4、IP:135.13.216.3 → 870dd803 (16 進位) TOP 5、IP:135.13.216.4 → 870dd804 (16 進位)
圖 3.5.4- 2、CASE 2 電路時序圖
a. 測試資料為非 Zipf 分佈票數,可以看到我們的結果是完全相符的 TOP 1、IP:135.13.216.0 → 870dd800 (16 進位)
TOP 2、IP:135.13.216.1 → 870dd801 (16 進位) TOP 3、IP:135.13.216.2 → 870dd802 (16 進位) TOP 4、IP:135.13.216.3 → 870dd803 (16 進位) TOP 5、IP:135.13.216.4 → 870dd804 (16 進位)
經由上述幾個小節的模擬與測試,我們在 Change Table、Rank Table 中,模擬了 Lookup_change、Lookup_rank,見表 3.5.4-1,Add_change、Add_rank,見表 3.5.4-2,
此 4 根主要信號並且確認它們在時間點確實有開始動作。
lookup TOP 1 lookup TOP 10 lookup no found
Rank Table
排名不動 排名不動 TOP 10 排名不動
上升 1 名 上升 1 名 TOP 10 上升 1 名
上升至 TOP 1 上升至 TOP 1 TOP 10 上升至 TOP 1
lookup TOP 1 lookup TOP 5 lookup no found
Change Table
原排名 TOP 2→TOP 1 原排名 TOP 1→TOP 1 原排名 TOP 1→TOP 1 原排名 TOP 3→TOP 2 原排名 TOP 2→TOP 2 原排名 TOP 2→TOP 2 原排名 TOP 4→TOP 3 原排名 TOP 3→TOP 3 原排名 TOP 3→TOP 3 原排名 TOP 5→TOP 4 原排名 TOP 4→TOP 4 原排名 TOP 4→TOP 4
Add TOP 1 Add TOP 10 Add fail
Rank Table
原排名 TOP 1→TOP 2 原排名 TOP 1→TOP 1 原排名 TOP 1→TOP 1 原排名 TOP 2→TOP 3 原排名 TOP 2→TOP 2 原排名 TOP 2→TOP 2
. . .
. . .
. . .
原排名 TOP 9→TOP 10 新資料 → TOP 10 原排名 TOP 10→TOP 10
Add TOP 1 Add TOP 5 Add fail
Change Table
新資料 → TOP 1 原排名 TOP 1→TOP 1 原排名 TOP 1→TOP 1 原排名 TOP 1→TOP 2 原排名 TOP 2→TOP 2 原排名 TOP 2→TOP 2 原排名 TOP 2→TOP 3 原排名 TOP 3→TOP 3 原排名 TOP 3→TOP 3 原排名 TOP 3→TOP 4 原排名 TOP 4→TOP 4 原排名 TOP 4→TOP 4 原排名 TOP 4→TOP 5 新資料 → TOP 5 原排名 TOP 5→TOP 5 表 3.5.4- 2、控制 add_rank、add_change 信號模擬統計表
改進後方法,在電路上的使用,也能完全符合我們的預期,並且我們最後電路使 用 Xilinx ISE,來做合成的部份,在 Main Control 的部份使用 260 個 register、280 個 LUTs、工作頻率在 594.669 MHz,在 Rank Table 的部份使用 1260 個 register、4328 個 LUTs、工作頻率在 243.798 MHz,在 Change Table 的部份使用 695 個 register、280 個 LUTs、工作頻率在 247.706 MHz,最後我們把 3 塊電路做合成,所得到的工作頻 率在 179.134 MHz,而處理每筆資料,耗費 44 個時脈週期,大約是 245 ns 時間,所 以每秒大約能處理 4 百萬個封包。而 2 Gbps 的乙太網路上,每秒傳輸的最大封包數 大約在 3 百萬的封包,所以我們一組電路可以處理超過兩條 1 Gbps 的乙太網路。
第四章 結論
4.1 結論
最後我們經由軟體模擬與電路模擬,證實我們的方法,是可行的,並且可以正確 的找出網路串流中最頻繁出現的項目,並且使用少量的記憶體空間。我們改進原始 SS 演算法,也證實我們改進之後的方法克服了,SS 演算法在非 Zipf 分佈時,無法正 確尋找出真正的 TOP N,並且我們最後的 K 值(真實票數),是可以非常接近 TOP N 的真實票數。
4.2 未來展望
未來我們將可以利用在真實網路上的封包,作為驗證環境,進一步透視我們改進 的演算法在實際網路上的應用與成效,此外也可將我們的方法繼續拓展到 change detection,並可以實際應用於入侵偵測,DDos 與蠕蟲攻擊等範疇,對於日後的高速 網路更可使用於網路還原,讓原始網路裏的真相得以一清二楚。
參考文獻
[1] R. S. Boyer and J. S. Moore.MJRTY - a fast majority vote algorithm. In Automated
Reasoning: Essays in Honor of Woody Bledsoe,Automated Reasoning
Series,pages105-117.Kluwer Academic Publishers,1991.
[2] N. Alon, Y. Matias, and M. Szegedy. The space complexity of approximating the frequency moments. In ACM Symposium on Theory of Computing,page 20-29 1996.
[3] E. Demaine, A. L´opez-Ortiz, and J. I. Munro. Frequency estimation of internet packet streams with limited space. In European Symposium on Algorithms (ESA), 2002.
[4] R. Karp, C. Papadimitriou, and S. Shenker. A simple algorithm for finding frequent elements in sets and bags. ACM Transactions on Database Systems, 28:51-55, 2003.
[5] A. Metwally, D. Agrawal, and A. E. Abbadi. Efficient computation of frequent and top-k elements in data streams. In International Conference on Database Theory, 2005.
[6] M. Charikar, K. Chen, and M. Farach-Colton. Finding frequent items in data streams.
In Procedings of the International Colloquium on Automata, Languages and
Programming (ICALP), 2002.
[7] 吳延鵬、楊峪寬、謝坤融、高曜煌,“Finding Frequent Items from Network Streams,”
2010 電子工程技術研討會,2010.
[8] 楊峪寬, “在網路環境中有效率地尋找最常出現的項目,”中華大學碩士論 文,2010.
[9] 施威銘研究室,【最新網路概論 2008】,旗標出版股份有限公司,2008,ISBN:
978-957-442-468-9
[10] 黃明祥,林詠章,【資訊與網路安全概論 第二版】,美商麥格羅.希爾國際股份有
限公司 台灣分公司,2007,ISBN:978-986-157-364-9
[11] SAMIR PALNITKAR,翻譯:黃英叡,黃稚存,【Verilog 硬體描述語言(第二版)】, 全華圖書,2009,ISBN:978-986-154-104-4
[12] 具再熙,【Verilog2001 及 SystemVerilog 入門指引】,全華圖書,2007,ISBN:
978-957-21-5719-0
[13] 鄭群星,【FPGA/CPLD 數位晶片設計入門-使用 Xilinx ISE 發展系統】,全華圖 書,2005,ISBN:957-21-4856-7
附錄 電路程式碼
module main_control
(clk,reset,trigger,ip,rdy_rank,rdy_change,re ad_rank_data,
read_change_data,add_rank,add_change,lo okup_rank,
lookup_change,rank_n,found_change, found_rank, rank_in,
write_rank_data,write_change_data,ip_cha nge_out,ip_rank_out,rdy_control);
input
clk,reset,trigger,rdy_rank,rdy_change,foun d_change, found_rank;
input [3:0] rank_in;
input [31:0] ip;
input [95:0]
read_rank_data,read_change_data;
//[31:0] ip //[63:32] ticket //[95:64] cb
//read_rank_data = rank tb Result //read_change_data = change tb Result output reg [95:0]
write_rank_data,write_change_data;//write _rank_data = send to rank tb
//wirte_change_data = send to change tb output reg
add_rank,add_change,lookup_rank,lookup _change;
output reg [31:0]
ip_change_out,ip_rank_out;
output reg [3:0] rank_n;
output reg rdy_control;
//output reg [31:0] ip_out;
localparam idle = 0;
localparam r_change = 1;
localparam add_rank_state = 2;
localparam decide_RK = 3;
localparam r_rank = 4;
localparam decide_K = 5;
localparam add_change_state = 6;
reg rdy_control_next;
reg [4:0] n_state;
reg [95:0]
write_change_data_next,write_rank_data_
next;
reg [31:0]
ip_change_out_next,ip_rank_out_next;
always @*
begin
lookup_rank = 0;
lookup_change = 0;
add_rank = 0;
add_change = 0;
rank_n = rank_in;
n_state = p_state;
write_rank_data_next = write_rank_data;
write_change_data_next = write_change_data;
ip_change_out_next = ip_change_out;
ip_rank_out_next = ip_rank_out;
rdy_control_next = 0;
case (p_state) idle: //0
if (trigger == 1) begin
n_state = r_change;
end
r_change: //1 begin
begin
lookup_change = 1;
ip_change_out_next[31:0] = ip[31:0];
end
if (rdy_change == 1) if (found_change == 1) begin
write_rank_data_next[31:0] = read_change_data[31:0];
write_rank_data_next[63:32] =
read_change_data[63:32] +1; //ticket+1 write_rank_data_next[95:64] =
same
n_state = add_rank_state;
add_rank = 1;
end else begin
n_state = r_rank;
end end
add_rank_state: //2 begin
if (rdy_rank == 1) begin
n_state = decide_RK;
end end
decide_RK://3 begin
if
(read_rank_data[63:32]-read_rank_data[95 :64] > 6)
begin
write_change_data_next[95:0] = read_rank_data[95:0];
n_state = add_change_state;
add_change = 1;
end else begin
n_state = idle;
rdy_control_next = 1;
end end
r_rank: //4 begin begin
ip_rank_out_next[31:0] = ip[31:0];
lookup_rank = 1;
rank_n = rank_in;
end begin
if (rdy_rank == 1) if (found_rank == 1) begin
else begin
write_change_data_next[95:0] = read_rank_data[95:0];
n_state = decide_K;
end end end
decide_K: //5 begin
if
(read_rank_data[63:32]-read_rank_data[95 :64] >6)
begin
n_state = add_change_state;
add_change = 1;
end else begin
n_state = idle;
rdy_control_next = 1;
end end
add_change_state: //6 begin
if (rdy_change == 1) begin
rdy_control_next = 1;
n_state = idle;
end end endcase end
always @(posedge clk, negedge reset) if (reset == 0)
begin
p_state <= idle;
write_change_data <= 0;
write_rank_data <= 0;
ip_change_out <= 0;
ip_rank_out <= 0;
rdy_control <= 0;
end else
write_change_data <=
write_change_data_next;
ip_change_out <= ip_change_out_next;
ip_rank_out <= ip_rank_out_next;
rdy_control <= rdy_control_next;
end
endmodule
module
changetb(clk,reset,add_change,lookup_cha
nge,write_change_data,rdy_change, read_change_data,found_change,addra,cha nge_tb_in,ip,change_tb_out,wea,ena);
input
clk,reset,add_change,lookup_change;
input [31:0] ip;
input [95:0] write_change_data;
input [95:0] change_tb_in; //ip [31:0]
//ticket[63:32]
//cb [95:64]
output reg
rdy_change,found_change,wea,ena;
output wire [3:0] addra;
output reg [95:0] read_change_data;
output reg [95:0] change_tb_out; //ip [31:0]
//ticket[63:32]
//cb [95:64]
localparam idle = 0;
localparam read_tbd = 1;
localparam write_de = 2;
localparam read_tba = 3;
localparam write_tb = 4;
reg found_change_next;
reg [2:0] p_state,n_state;
reg [15:0]
k1,k2,k3,k4,k5,k1_next,k2_next,k3_next,k 4_next,k5_next;
reg [2:0] addr_cnt,addr_cnt_next;
reg [95:0]
top1,top1_next,top2,top2_next,top3,top3_n ext,top4,top4_next,top5,top5_next;
reg [95:0] read_change_data_next;
reg [31:0] ip_reg,ip_next;
wire [15:0] add_k =
write_change_data[63:32] - write_change_data[95:64];
always @*
begin
rdy_change = 0;
wea = 0;
ena = 1;
found_change_next = found_change;
n_state = p_state;
addr_cnt_next = addr_cnt;
read_change_data_next = read_change_data;
ip_next = ip_reg;
change_tb_out = 0;
k1_next = k1;
k2_next = k2;
k3_next = k3;
k4_next = k4;
k5_next = k5;
top1_next = top1;
top2_next = top2;
top3_next = top3;
top4_next = top4;
top5_next = top5;
case(p_state) idle:
if (lookup_change == 1) begin
ip_next = ip;
n_state = read_tbd;
end
else if (add_change == 1) n_state = read_tba;
read_tbd:
begin begin ena = 1;
wea = 0;
ip_next = ip;
end
if (addr_cnt == 1) begin
begin
top1_next[95:0] = change_tb_in[95:0];
end
if (ip_reg == top1_next[31:0])
read_change_data_next[95:0] = top1_next[95:0];
found_change_next = 1;
n_state = read_tbd;
end end
else if (addr_cnt == 2) begin
begin
top2_next[95:0] = change_tb_in[95:0];
end
if (ip_reg == top2_next[31:0]) begin
read_change_data_next[95:0] = top2_next[95:0];
found_change_next = 1;
n_state = read_tbd;
end end
else if (addr_cnt == 3) begin
begin
top3_next[95:0] = change_tb_in[95:0];
end
if (ip_reg == top3_next[31:0]) begin
read_change_data_next[95:0] = top3_next[95:0];
found_change_next = 1;
n_state = read_tbd;
end end
else if (addr_cnt == 4) begin
begin
top4_next[95:0] = change_tb_in[95:0];
end
if (ip_reg == top4_next[31:0]) begin
read_change_data_next[95:0] = top4_next[95:0];
found_change_next = 1;
n_state = read_tbd;
end end
else if (addr_cnt == 5) begin
if (ip_reg == top5_next[31:0]) begin
read_change_data_next[95:0] = top5_next[95:0];
found_change_next = 1;
n_state = read_tbd;
end end
else if (addr_cnt == 6) begin
if (found_change == 1) begin
found_change_next = 1;
n_state = write_de;
end else begin
n_state = idle;
rdy_change = 1;
end end end write_de:
if (ip_reg == top1[31:0]) //lookup top1 begin
if (addr_cnt == 0) begin
wea = 1;
change_tb_out[95:0] = top2[95:0];
end
else if (addr_cnt == 1) begin
wea = 1;
change_tb_out[95:0] = top3[95:0];
end
else if (addr_cnt == 2) begin
wea = 1;
change_tb_out[95:0] = top4[95:0];
end
else if (addr_cnt == 3) begin
wea = 1;
change_tb_out[95:0] = top5[95:0];
end
else if (addr_cnt == 4)
rdy_change = 1;
n_state = idle;
found_change_next = 0;
end end
else if (ip_reg == top2[31:0])//lookup top2 begin
if (addr_cnt == 0) begin
wea = 1;
change_tb_out[95:0] = top1[95:0];
end
else if (addr_cnt == 1) begin
wea = 1;
change_tb_out[95:0] = top3[95:0];
end
else if (addr_cnt == 2) begin
wea = 1;
change_tb_out[95:0] = top4[95:0];
end
else if (addr_cnt == 3) begin
wea = 1;
change_tb_out[95:0] = top5[95:0];
end
else if (addr_cnt == 4) begin
wea = 1;
change_tb_out[95:0] = 96'b0;
rdy_change = 1;
n_state = idle;
found_change_next = 0;
end end
else if (ip_reg == top3[31:0])//lookup top3 begin
if (addr_cnt == 0) begin
wea = 1;
change_tb_out[95:0] = top1[95:0];
end
else if (addr_cnt == 1) begin
wea = 1;
change_tb_out[95:0] = top2[95:0];
end
else if (addr_cnt == 2)
wea = 1;
change_tb_out[95:0] = top4[95:0];
end
else if (addr_cnt == 3) begin
wea = 1;
change_tb_out[95:0] = top5[95:0];
end
else if (addr_cnt == 4) begin
wea = 1;
change_tb_out[95:0] = 96'b0;
rdy_change = 1;
n_state = idle;
found_change_next = 0;
end end
else if (ip_reg == top4[31:0])//lookup top4 begin
if (addr_cnt == 0) begin
wea = 1;
change_tb_out[95:0] = top1[95:0];
end
else if (addr_cnt == 1) begin
wea = 1;
change_tb_out[95:0] = top2[95:0];
end
else if (addr_cnt == 2) begin
wea = 1;
change_tb_out[95:0] = top3[95:0];
end
else if (addr_cnt == 3) begin
wea = 1;
change_tb_out[95:0] = top5[95:0];
end
else if (addr_cnt == 4) begin
wea = 1;
change_tb_out[95:0] = 96'b0;
rdy_change = 1;
n_state = idle;
found_change_next = 0;
end end
else if (ip_reg == top5[31:0])//lookup top5
if (addr_cnt == 0) begin
wea = 1;
change_tb_out[95:0] = top1[95:0];
end
else if (addr_cnt == 1) begin
wea = 1;
change_tb_out[95:0] = top2[95:0];
end
else if (addr_cnt == 2) begin
wea = 1;
change_tb_out[95:0] = top3[95:0];
end
else if (addr_cnt == 3) begin
wea = 1;
change_tb_out[95:0] = top4[95:0];
end
else if (addr_cnt == 4) begin
wea = 1;
change_tb_out[95:0] = 96'b0;
rdy_change = 1;
n_state = idle;
found_change_next = 0;
end end read_tba:
begin begin ena = 1;
wea = 0;
end
if (addr_cnt == 1) begin
top1_next[95:0] = change_tb_in[95:0];
k1_next = top1_next[63:32] - top1_next[95:64];
n_state = read_tba;
end
else if (addr_cnt == 2) begin
top2_next[95:0] = change_tb_in[95:0];
k2_next = top2_next[63:32] -
else if (addr_cnt == 3) begin
top3_next[95:0] = change_tb_in[95:0];
k3_next = top3_next[63:32] - top3_next[95:64];
n_state = read_tba;
end
else if (addr_cnt == 4) begin
top4_next[95:0] = change_tb_in[95:0];
k4_next = top4_next[63:32] - top4_next[95:64];
n_state = read_tba;
end
else if (addr_cnt == 5) begin
top5_next[95:0] = change_tb_in[95:0];
k5_next = top5_next[63:32] - top5_next[95:64];
n_state = write_tb;
end end write_tb:
if (add_k >= k1) //add in top1 begin
if (addr_cnt == 0) begin
wea = 1;
change_tb_out[95:0] = write_change_data[95:0];
end
else if (addr_cnt == 1) begin
wea = 1;
change_tb_out[95:0] = top1[95:0];
end
else if (addr_cnt == 2) begin
wea = 1;
change_tb_out[95:0] = top2[95:0];
end
else if (addr_cnt == 3) begin
wea = 1;
change_tb_out[95:0] = top3[95:0];
end
change_tb_out[95:0] = top4[95:0];
rdy_change = 1;
n_state = idle;
end end
else if ((add_k >= k2) && (add_k <
k1))//add in top2 begin
if (addr_cnt == 0) begin
wea = 1;
change_tb_out[95:0] = top1[95:0];
end
else if (addr_cnt == 1) begin
wea = 1;
change_tb_out[95:0] = write_change_data[95:0];
end
else if (addr_cnt == 2) begin
wea = 1;
change_tb_out[95:0] = top2[95:0];
end
else if (addr_cnt == 3) begin
wea = 1;
change_tb_out[95:0] = top3[95:0];
end
else if (addr_cnt == 4) begin
wea = 1;
change_tb_out[95:0] = top4[95:0];
rdy_change = 1;
n_state = idle;
end end
else if ((add_k >= k3) && (add_k <
k2))//add in top3 begin
if (addr_cnt == 0) begin
wea = 1;
change_tb_out[95:0] = top1[95:0];
end
else if (addr_cnt == 1) begin
wea = 1;
change_tb_out[95:0] = top2[95:0];
else if (addr_cnt == 2) begin
wea = 1;
change_tb_out[95:0] = write_change_data[95:0];
end
else if (addr_cnt == 3) begin
wea = 1;
change_tb_out[95:0] = top3[95:0];
end
else if (addr_cnt == 4) begin
wea = 1;
change_tb_out[95:0] = top4[95:0];
rdy_change = 1;
n_state = idle;
end end
else if ((add_k >= k4) && (add_k <
k3))//add in top4 begin
if (addr_cnt == 0) begin
wea = 1;
change_tb_out[95:0] = top1[95:0];
end
else if (addr_cnt == 1) begin
wea = 1;
change_tb_out[95:0] = top2[95:0];
end
else if (addr_cnt == 2) begin
wea = 1;
change_tb_out[95:0] = top3[95:0];
end
else if (addr_cnt == 3) begin
wea = 1;
change_tb_out[95:0] = write_change_data[95:0];
end
else if (addr_cnt == 4) begin
wea = 1;
change_tb_out[95:0] = top4[95:0];
rdy_change = 1;
n_state = idle;
end
else if ((add_k >= k5) && (add_k <
k4))//add in top5 begin
if (addr_cnt == 0) begin
wea = 1;
change_tb_out[95:0] = top1[95:0];
end
else if (addr_cnt == 1) begin
wea = 1;
change_tb_out[95:0] = top2[95:0];
end
else if (addr_cnt == 2) begin
wea = 1;
change_tb_out[95:0] = top3[95:0];
end
else if (addr_cnt == 3) begin
wea = 1;
change_tb_out[95:0] = top4[95:0];
end
else if (addr_cnt == 4) begin
wea = 1;
change_tb_out[95:0] = write_change_data[95:0];
rdy_change = 1;
n_state = idle;
end end
else if (add_k < k5) begin
rdy_change = 1;
n_state = idle;
end endcase end
always @(posedge clk or negedge reset) if (!reset)
addr_cnt <= #1 0;
else if (p_state==idle &&
n_state==read_tbd) addr_cnt <= #1 0;
else if (p_state==read_tba &&
n_state==read_tba) addr_cnt <= #1 0;
else if (p_state==read_tbd && n_state
==write_de) addr_cnt <= #1 0;
else if (addr_cnt == 3'b110) addr_cnt <= #1 0;
else if (addr_cnt < 3'b110)
addr_cnt <= #1 addr_cnt_next + 1'b1;
always @(posedge clk,negedge reset) if (reset == 0)
begin
read_change_data <= 0;
change_tb_out <= 0;
p_state <= idle;
found_change <= 0;
ip_reg <= 0;
k1 <= 0;
k2 <= 0;
k3 <= 0;
k4 <= 0;
k5 <= 0;
top1 <= 0;
top2 <= 0;
top3 <= 0;
top4 <= 0;
top5 <= 0;
end else begin
read_change_data <=
read_change_data_next;
//change_tb_out <= change_tb_out_next;
p_state <= n_state;
found_change <= found_change_next;
ip_reg <=#1 ip_next;
k1 <=#1 k1_next;
k2 <=#1 k2_next;
k3 <=#1 k3_next;
k4 <=#1 k4_next;
k5 <=#1 k5_next;
top1 <=#1 top1_next;
top2 <=#1 top2_next;
top3 <=#1 top3_next;
top4 <=#1 top4_next;
top5 <=#1 top5_next;
end