• 沒有找到結果。

Main Control 模擬測試

在文檔中 中 華 大 學 (頁 43-60)

第三章  研究方法

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

在文檔中 中 華 大 學 (頁 43-60)

相關文件