a一级爱做片免费观看欧美,久久国产一区二区,日本一二三区免费,久草视频手机在线观看

新聞中心

EEPW首頁 > 模擬技術 > 設計應用 > cpld fpga 區別

cpld fpga 區別

作者: 時間:2011-09-21 來源:網絡 收藏

系統的比較,與大家共享:
盡管FPGA和CPLD都是可編程ASIC器件,有很多共同特點,但由于CPLD和FPGA結構上的差異,具有各自的特點:
①CPLD更適合完成各種算法和組合邏輯,FP GA更適合于完成時序邏輯。換句話說,FPGA更適合于觸發器豐富的結構,而CPLD更適合于觸發器有限而乘積項豐富的結構。
②CPLD的連續式布線結構決定了它的時序延遲是均勻的和可預測的,而FPGA的分段式布線結構決定了其延遲的不可預測性。

③在編程上FPGA比CPLD具有更大的靈活性。CPLD通過修改具有固定內連電路的邏輯功能來編程,FPGA主要通過改變內部連線的布線來編程;FP GA可在邏輯門下編程,而CPLD是在邏輯塊下編程。

④FPGA的集成度比CPLD高,具有更復雜的布線結構和邏輯實現。

⑤CPLD比FPGA使用起來更方便。CPLD的編程采用E2PROM或FASTFLASH技術,無需外部存儲器芯片,使用簡單。而FPGA的編程信息需存放在外部存儲器上,使用方法復雜。

⑥CPLD的速度比FPGA快,并且具有較大的時間可預測性。這是由于FPGA是門級編程,并且CLB之間采用分布式互聯,而CPLD是邏輯塊級編程,并且其邏輯塊之間的互聯是集總式的。

⑦在編程方式上,CPLD主要是基于E2PROM或FLASH存儲器編程,編程次數可達1萬次,優點是系統斷電時編程信息也不丟失。CPLD又可分為在編程器上編程和在系統編程兩類。FPGA大部分是基于SRAM編程,編程信息在系統斷電時丟失,每次上電時,需從器件外部將編程數據重新寫入SRAM中。其優點是可以編程任意次,可在工作中快速編程,從而實現板級和系統級的動態配置。

⑧CPLD保密性好,FPGA保密性差。

⑨一般情況下,CPLD的功耗要比FPGA大,且集成度越高越明顯。
隨著復雜可編程邏輯器件(CPLD)密度的提高,數字器件設計人員在進行大型設計時,既靈活又容易,而且產品可以很快進入市場。許多設計人員已經感受到CPLD容易使用、時序可預測和速度高等優點,然而,在過去由于受到CPLD密度的限制,他們只好轉向FPGA和ASIC?,F在,設計人員可以體會到密度高達數十萬門的CPLD所帶來的好處。
CPLD結構在一個邏輯路徑上采用1至16個乘積項,因而大型復雜設計的運行速度可以預測。因此,原有設計的運行可以預測,也很可靠,而且修改設計也很容易。CPLD在本質上很靈活、時序簡單、路由性能極好,用戶可以改變他們的設計同時保持引腳輸出不變。與FPGA相比,CPLD的I/O更多,尺寸更小。
如今,通信系統使用很多標準,必須根據客戶的需要配置設備以支持不同的標準。CPLD可讓設備做出相應的調整以支持多種協議,并隨著標準和協議的演變而改變功能。這為系統設計人員帶來很大的方便,因為在標準尚未完全成熟之前他們就可以著手進行硬件設計,然后再修改代碼以滿足最終標準的要求。CPLD的速度和延遲特性比純軟件方案更好,它的NRE費用低於ASIC,更靈活,產品也可以更快入市。CPLD可編程方案的優點如下:
●邏輯和存儲器資源豐富(Cypress Delta39K200的RAM超過480 Kb)
●帶冗余路由資源的靈活時序模型
●改變引腳輸出很靈活
●可以裝在系統上后重新編程
●I/O數目多
●具有可保證性能的集成存儲器控制邏輯
●提供單片CPLD和可編程PHY方案
由于有這些優點,設計建模成本低,可在設計過程的任一階段添加設計或改變引腳輸出,可以很快上市
CPLD的結構
CPLD是屬於粗粒結構的可編程邏輯器件。它具有豐富的邏輯資源(即邏輯門與寄存器的比例高)和高度靈活的路由資源。CPLD的路由是連接在一起的,而FPGA的路由是分割開的。FPGA可能更靈活,但包括很多跳線,因此速度較CPLD慢。
CPLD以群陣列(array of clusters)的形式排列,由水平和垂直路由通道連接起來。這些路由通道把信號送到器件的引腳上或者傳進來,并且把CPLD內部的邏輯群連接起來。


CPLD之所以稱作粗粒,是因為,與路由數量相比,邏輯群要大得到。CPLD的邏輯群比FPGA的基本單元大得多,因此FPGA是細粒的。
CPLD的功能塊
CPLD最基本的單元是宏單元。一個宏單元包含一個寄存器(使用多達16個乘積項作為其輸入)及其它有用特性。
因為每個宏單元用了16個乘積項,因此設計人員可部署大量的組合邏輯而不用增加額外的路徑。這就是為何CPLD被認為是“邏輯豐富”型的。

宏單元以邏輯模塊的形式排列(LB),每個邏輯模塊由16個宏單元組成。宏單元執行一個AND操作,然后一個OR操作以實現組合邏輯。

每個邏輯群有8個邏輯模塊,所有邏輯群都連接到同一個可編程互聯矩陣。
每個群還包含兩個單端口邏輯群存儲器模塊和一個多端口通道存儲器模塊。前者每模塊有8,192b存儲器,后者包含4,096b專用通信存儲器且可配置為單端口、多端口或帶專用控制邏輯的FIFO。
CPLD有什麼好處?
I/O數量多
CPLD的好處之一是在給定的器件密度上可提供更多的I/O數,有時甚至高達70%。
時序模型簡單
CPLD優于其它可編程結構之處在于它具有簡單且可預測的時序模型。這種簡單的時序模型主要應歸功于CPLD的粗粒度特性。
CPLD可在給定的時間內提供較寬的相等狀態,而與路由無關。這一能力是設計成功的關鍵,不但可加速初始設計工作,而且可加快設計調試過程。
粗粒CPLD結構的優點
CPLD是粗粒結構,這意味著進出器件的路徑經過較少的開關,相應地延遲也小。因此,與等效的FPGA相比,CPLD可工作在更高的頻率,具有更好的性能。
CPLD的另一個好處是其軟件編譯快,因為其易于路由的結構使得布放設計任務更加容易執行。

細粒FPGA結構的優點
FPGA是細粒結構,這意味著每個單元間存在細粒延遲。如果將少量的邏輯緊密排列在一起,FPGA的速度相當快。然而,隨著設計密度的增加,信號不得不通過許多開關,路由延遲也快速增加,從而削弱了整體性能。CPLD的粗粒結構卻能很好地適應這一設計布局的改變。


靈活的輸出引腳
CPLD的粗粒結構和時序特性可預測,因此設計人員在設計流程的后期仍可以改變輸出引腳,而時序仍保持不變。
新的CPLD封裝
CPLD有多種密度和封裝類型,包括單芯片自引導方案。自引導方案在單個封裝內集成了FLASH存儲器和CPLD,無須外部引導單元,從而可降低設計復雜性并節省板空間。在給定的封裝尺寸內,有更高的器件密度共享引腳輸出。這就為設計人員提供了“放大”設計的便利,而無須更改板上的引腳輸出。


/br>

經常會看到在狀態機設計中別人使用各種不同的編碼方式,那么一般情況下,這種編碼方式的選擇依據是什么?
我們知道,在數字邏輯設計中最常用的有三種編碼方式:二進制,格雷碼 Gray,獨熱編碼One-hot One hot 編碼使用一組碼元,每一個碼元僅有1bit有效,例如
IDLE = 0001,
WRITE = 0010,
READ = 0100,
WAIT = 1000
這種編碼的譯碼部分可以最簡,因此可以總結出One-hot編碼的特點:
組合邏輯最少,觸發器最多,工作時鐘頻率可以做到最高。
FPGA 的一個最小結構單元(CLB/LE)中含有查找表(實現組合邏輯)和DFF(實現時序邏輯),布局布線最好的結果是同一個結構單元中的查找表和DFF都使用,但是大部分情況是僅使用其中一種資源,這樣另外的資源就是閑置而浪費。而CPLD中DFF資源本來就很少,由此可見One-hot編碼更適合于 FPGA設計,而不適合CPLD設計,在CPLD中應該選擇二進制編碼。
IC設計中,應該綜合考慮。因為One-hot編碼使用DFF會大大增加設計面積(die size),因此在時序可以滿足的條件下盡可能使用二進制編碼。就面積與速度的折中考慮來說Gray碼是最好的選擇,當然Gray碼還有其他很多好的特性,暫時不屬于這次討論的范疇。一般的綜合工具對狀態機進行綜合時都可以讓用戶對這三種編碼進行選擇?;疽罁鸵陨纤f。

二進制與格雷碼之間的轉換
自然二進制碼轉換成二進制格雷碼,其法則是保留自然二進制碼的最高位作為格雷碼的最高位,而次高位格雷碼為二進制碼的高位與次高位相異或,而格雷碼其余各位與次高位的求法相類似
二進制格雷碼轉換成自然二進制碼,其法則是保留格雷碼的最高位作為自然二進制碼的最高位,而次高位自然二進制碼為高位自然二進制碼與次高位格雷碼相異或,而自然二進制碼的其余各位與次高位自然二進制碼的求法相類似

通過減少寄存器間的邏輯延時來提高工作頻率,或通過流水線設計來優化數據處理時的數據通路來滿足高速環境下FPGA或CPLD中的狀態機設計要求。本文給出了采用這些技術的高速環境狀態機設計的規范及分析方法和優化方法,并給出了相應的示例。

為了使FPGA或CPLD中的狀態機設計滿足高速環境要求,設計工程師需要認識到以下幾點:寄存器資源和邏輯資源已經不是問題的所在,狀態機本身所占用的FPGA或CPLD邏輯資源或寄存器資源非常小;狀態機對整體數據流的是串行操作,如果希望數據處理的延時非常小,就必須提高操作的并行程度,壓縮狀態機中狀態轉移的路徑長度;高速環境下應合理分配狀態機的狀態及轉移條件。本文將結合實際應用案例來說明。

狀態機設計規范

1. 使用一位有效的方式進行狀態編碼
狀態機中狀態編碼主要有三種:連續編碼(sequential encoding)、一位有效(one-hot encoding)方式編碼以及不屬于這兩種的編碼。例如,對于一個5個狀態(State0~State4)的狀態機,連續編碼方式狀態編碼為:State0-000、State1-001、State2-010、State3-011、State4-100。一位有效方式為下為:State0-00001、State1-00010、State2-00100、State3-01000、State4-10000。對于自行定義的編碼則差別很大,例如試圖將狀態機的狀態位直接作為輸出所需信號,這可能會增加設計難度。

使用一位有效編碼方式使邏輯實現更簡潔,因為一個狀態只需要用一位來指示,而為此增加的狀態寄存器數目相對于整個設計來說可以忽略。一位有效至少有兩個含義:對每個狀態位,該位為1對應唯一的狀態,判斷當前狀態是否為該狀態,只需判斷該狀態位是否為1;如果狀態寄存器輸入端該位為1,則下一狀態將轉移為該狀態,判斷下一狀態是否為該狀態,只需判斷表示下一狀態的信號中該位是否為1。

2. 合理分配狀態轉移條件
在狀態轉移圖中,每個狀態都有對應的出線和入線,從不同狀態經不同的轉移條件到該狀態的入線數目不能太多。以采用與或邏輯的CPLD設計來分析,如果這樣的入線太多則將會需要較多的乘積項及或邏輯,這就需要更多級的邏輯級聯來完成,從而增加了寄存器間的延遲;對于FPGA則需要多級查找表來實現相應的邏輯,同樣會增加延遲。狀態機的應用模型如圖1所示。

狀態機設計的分析方法
狀態機設計的分析方法可以分為兩種:一種是流程處理分析,即分析數據如何分步處理,將相應處理的步驟依次定為不同狀態,該方法能夠分析非常復雜的狀態機,類似于編寫一個軟件程序的分析,典型設計如讀寫操作和數據包字節分析;另一種方法是關鍵條件分析,即根據參考信號的邏輯條件來確定相應的狀態,這樣的參考信號如空或滿指示、起始或結束、握手應答信號等。這兩種分析方法并沒有嚴格的界限,在實際的狀態機設計分析時往往是這兩種方法結合使用。下面分別說明這兩種分析方法。

1. 流程處理分析
例如,在一個讀取ZBT SRAM中數據包的設計中,要根據讀出的數據中EOP(End of Packet)信號是否為1來決定一個包的讀操作是否結束,由于讀取數據的延后,這樣就會從ZBT SRAM中多讀取數據,為此可以設計一個信號VAL_out來過濾掉多讀的數據。

根據數據到達的先后及占用的時鐘周期數,可以設計如圖2所示的狀態機(本文設定:文字說明及插圖中當前狀態表示為s_State[n:0],為狀態寄存器的輸出;下一狀態next_State[n:0],為狀態寄存器的輸入;信號之間的邏輯關系采用Verilog語言(或C語言)中的符號表示;#R表示需要經過一級寄存器,輸出信號對應寄存器的輸出端)。該狀態機首先判斷是否已經到達包尾,如果是,則依次進入6個等待狀態,等待狀態下的數據無效,6個等待狀態結束后將正常處理數據。

2. 關鍵條件分析
圖3為一個路由器線卡高速數據包分發處理的框圖,較高速率的數據包經過分發模塊以包為單位送往兩個較低速率數據通路(即寫入FIFO1或FIFO2)。

對于分發模塊設計,關鍵參考信號是EOP及快滿信號AF1、AF2,參考EOP可以實現每次處理一個包,參考AF1、AF2信號可以決定相應的包該往哪個FIFO中寫入。分發算法為:FIFO1未滿(AF1=0),數據包將寫入FIFO1;如果FIFO1將滿且FIFO2未滿(AF1=1,且AF2=0),則下一數據包將寫入FIFO2;如果FIFO1、FIFO2都將滿(AF1=1且AF2=1),則進入丟包狀態。狀態機描述如圖4所示:UseFifo1狀態下數據包將寫入FIFO1,UseFifo2狀態下數據包將寫入FIFO2,丟包狀態下數據包被丟棄,提供丟包計數使能DropCountEnable。

狀態機的進一步優化
1. 利用一位有效編碼方式HSPACE=12 alt=" 區別 ">
如前所述,狀態機的工作頻率跟狀態機中各個狀態對應的不同轉移條件的入線數目有關。如果到一個狀態的轉移條件相同但入線數非常多,其邏輯實現很可能并不復雜。在一位有效編碼方式下,對于某個狀態,如果其他所有狀態經相同的轉移條件到該狀態,那么其邏輯實現可以很好地化簡。
例4:一位有效編碼方式下狀態位s_State[n:0]中,
s_State[1] | s_State[2] | ... | s_State[n]=1與 s_State[0]=1等價,那么
next_State[0]=(s_State[0]S) | (s_State[1]T) | (s_State[2]T) | ... | (s_State[n]) 可以化簡為:
next_State[0]=(s_State[0]S) | ((~s_State[0])T),右端輸入信號數目大大減少。

2. 利用寄存器的使能信號
多數FPGA或CPLD寄存器提供使能端,如果所有的狀態機轉移必須至少滿足某個條件,那么這個條件可以通過使能信號連接實現,從而可以降低寄存器輸入端的邏輯復雜度。如上例中不同狀態間轉移必須以EOP為1作為前提,因而可以將該信號作為使能信號來設計。

3. 結合所選FPGA或CPLD內部邏輯單元結構編寫代碼
以Xilinx FPGA為例,一個單元內2個4輸入查找表及相關配置邏輯可以實現5個信號輸入的最復雜的邏輯,或8~9個信號的簡單邏輯(例如全與或者全或),延時為一級查找表及配置邏輯延時;如果將相鄰單元的4個4輸入查找表輸出連接到一個4輸入查找表,那么可以實現最復雜的6輸入邏輯,此時需要兩級查找表延時及相關配置邏輯延時。更復雜的邏輯需要更多的級連來實現。針對高速狀態機的情況,可以盡量將狀態寄存器輸入端的邏輯來源控制在7個信號以內,從而自主控制查找表的級連級數,提高設計的工作頻率。

4. 通過修改狀態機
如果一個狀態機達不到工作頻率要求,則必須根據延時最大路徑修改設計,通常的辦法有:改變狀態設置,添加新狀態或刪除某些狀態,簡化轉移條件及單個狀態連接的轉移數目;修改轉移條件設置,包括改變轉移條件的組合,以及將復雜的邏輯改為分級經寄存器輸出由寄存器信號再形成的邏輯,后者將會改變信號時序,因而可能需要改變狀態設置。

5. 使用并行邏輯
很多情況下要參考的關鍵信號可能非常多,如果參考這些關鍵信號直接設計狀態機所得到的結果可能很復雜,個別狀態的出線或入線將會非常多,因而將降低工作頻率。可以考慮通過設計并行邏輯來提供狀態機的關鍵信號以及所需的中間結果,狀態機負責維護并行邏輯以及產生數據處理的流程。并行邏輯應分級設計,級間為寄存器,從而減少寄存器到寄存器的延時。

圖5為一個使用并行邏輯的狀態機,該設計用于使用單一數據總線將FIFO1~4中的數據發送到4個數據通路上去,該設計中并行邏輯產生每次操作時的通路及FIFO選擇結果,狀態機負責控制每次操作的流程:在“Idle”狀態下,如果FIFO1~4中有數據包供讀取,則進入“Schedule”狀態;獲得調度結果后“Schedule”經過一個“Wait”狀態,然后進入“ReadData”狀態讀取數據,同時開始計數,計數到達所指定數值或者讀到數據包尾時進入空閑狀態“Idle”,依次循環下去。

流水線設計
流水線(Pipelining)設計是將一個時鐘周期內執行的邏輯操作分成幾步較小的操作,并在較高速時鐘下完成。圖6a中邏輯被分為圖6b中三小部分,如果它的Tpd為T,則該電路最高時鐘頻率為1/T,而在圖6b中假設每部分的Tpd為T/3,則其時鐘頻率可提高到原來的3倍,因而單位時間內的數據流量可以達到原來的三倍。代價是輸出信號相對于輸入滯后3個周期,時序有所改變(圖6b中輸出信號的總延時與圖6a中一樣,但數據吞吐量提高了),同時增加了寄存器資源,而FPGA具有豐富的寄存器資源。

本文所強調的通過減少寄存器間的邏輯延時來提高狀態機的工作頻率,與流水線設計的出發點一樣,不同的是流水線所強調的是數據處理時的數據通路優化,而本文所強調的是狀態機中控制邏輯的優化

mealy&moore狀態機典型程序

Verilog

// Example of a 5-state Mealy FSM

module mealy (data_in, data_out, reset, clock);

output data_out;

input [1:0] data_in;

input reset, clock;

reg data_out;

reg [2:0] pres_state, next_state;

parameter st0=3'd0, st1=3'd1, st2=3'd2, st3=3'd3, st4=3'd4;

// FSM register

always @ (posedge clock or negedge reset)

begin: statereg

if(!reset)// asynchronous reset

pres_state = st0;

else

pres_state = next_state;

end // statereg

// FSM combinational block

always @(pres_state or data_in)

begin: fsm

case (pres_state)

st0: case(data_in)

2'b00: next_state=st0;

2'b01: next_state=st4;

2'b10: next_state=st1;

2'b11: next_state=st2;

endcase

st1: case(data_in)

2'b00: next_state=st0;

2'b10: next_state=st2;

default: next_state=st1;

endcase

st2: case(data_in)

2'b0x: next_state=st1;

2'b1x: next_state=st3;

endcase

st3: case(data_in)

2'bx1: next_state=st4;

default: next_state=st3;

endcase

st4: case(data_in)

2'b11: next_state=st4;

default: next_state=st0;

endcase

default: next_state=st0;

endcase

end // fsm

// Mealy output definition using pres_state w/ data_in

always @(data_in or pres_state)

begin: outputs

case(pres_state)

st0: case(data_in)

2'b00: data_out=1'b0;

default: data_out=1'b1;

endcase

st1: data_out=1'b0;

st2: case(data_in)

2'b0x: data_out=1'b0;

default: data_out=1'b1;

endcase

st3: data_out=1'b1;

st4: case(data_in)

2'b1x: data_out=1'b1;

default: data_out=1'b0;

endcase

default: data_out=1'b0;

endcase

end // outputs

endmodule

Verilog

// Example of a 5-state Moore FSM

module moore (data_in, data_out, reset, clock);

output data_out;

input [1:0] data_in;

input reset, clock;

reg data_out;

reg [2:0] pres_state, next_state;

parameter st0=3'd0, st1=3'd1, st2=3'd2, st3=3'd3, st4=3'd4;

//FSM register

always @(posedge clock or negedge reset)

begin: statereg

if(!reset)

pres_state = st0;

else

pres_state = next_state;

end // statereg

// FSM combinational block

always @(pres_state or data_in)

begin: fsm

case (pres_state)

st0: case(data_in)

2'b00: next_state=st0;

2'b01: next_state=st4;

2'b10: next_state=st1;

2'b11: next_state=st2;

endcase

st1: case(data_in)

2'b00: next_state=st0;

2'b10: next_state=st2;

default: next_state=st1;

endcase

st2: case(data_in)

2'b0x: next_state=st1;

2'b1x: next_state=st3;

endcase

st3: case(data_in)

2'bx1: next_state=st4;

default: next_state=st3;

endcase

st4: case(data_in)

2'b11: next_state=st4;

default: next_state=st0;

endcase

default: next_state=st0;

endcase

end // fsm

// Moore output definition using pres_state only

always @(pres_state)

begin: outputs

case(pres_state)

st0: data_out=1'b1;

st1: data_out=1'b0;

st2: data_out=1'b1;

st3: data_out=1'b0;

st4: data_out=1'b1;

default: data_out=1'b0;

endcase

end // outputs

endmodule // Moore

使用狀態機做時鐘產生電路-獨特卻又最為精準(CPU設計中常用方法)

介紹一款時鐘發生器--獨特卻又最為精準(CPU設計中常用方法)
時鐘發生器 clkgen 利用外來時鐘信號clk 來生成一系列時鐘信號clk1、fetch、alu_clk 送往CPU的其他部件。其中fetch是外來時鐘 clk 的八分頻信號。利用fetch的上升沿來觸發CPU控制器開始執行一條指令,同時fetch信號還將控制地址多路器輸出指令地址和數據地址。clk1信號用作指令寄存器、累加器、狀態控制器的時鐘信號。alu_clk 則用于觸發算術邏輯運算單元。
module clk_gen (clk,reset,clk1,clk2,clk4,fetch,alu_clk);
input clk,reset;
output clk1,clk2,clk4,fetch,alu_clk;
wire clk,reset;
reg clk2,clk4,fetch,alu_clk;
reg[7:0] state;
parameter S1 = 8'b00000001,
S2 = 8'b00000010,
S3 = 8'b00000100,
S4 = 8'b00001000,
S5 = 8'b00010000,
S6 = 8'b00100000,
S7 = 8'b01000000,
S8 = 8'b10000000,
idle = 8'b00000000;

assign clk1 = ~clk;

always @(negedge clk)
if(reset)
begin
clk2 = 0;
clk4 = 1;
fetch = 0;
alu_clk = 0;
state = idle;
end
else
begin
case(state)
S1:
begin
clk2 = ~clk2;
alu_clk = ~alu_clk;
state = S2;
end
S2:
begin
clk2 = ~clk2;
clk4 = ~clk4;
alu_clk = ~alu_clk;
state = S3;
end
S3:
begin
clk2 = ~clk2;
state = S4;
end
S4:
begin
clk2 = ~clk2;
clk4 = ~clk4;
fetch = ~fetch;
state = S5;
end
S5:
begin
clk2 = ~clk2;
state = S6;
end
S6:
begin
clk2 = ~clk2;
clk4 = ~clk4;
state = S7;
end
S7:
begin
clk2 = ~clk2;
state = S8;
end
S8:
begin
clk2 = ~clk2;
clk4 = ~clk4;
fetch = ~fetch;
state = S1;
end
idle: state = S1;
default: state = idle;
endcase
end
endmodule
//--------------------------------------------------------------------------------

由于在時鐘發生器的設計中采用了同步狀態機的設計方法,不但使clk_gen模塊的源程序可以被各種綜合器綜合,也使得由其生成的clk1、clk2、clk4、fetch、alu_clk 在跳變時間同步性能上有明顯的提高,為整個系統的性能提高打下了良好的基礎。
諸位.這樣的時鐘發生器無論在時序上還是功能上都是完美的,難怪一直在CPU設計中采用.



關鍵詞: cpld fpga

評論


相關推薦

技術專區

關閉