組原實驗要求_第1頁
組原實驗要求_第2頁
組原實驗要求_第3頁
組原實驗要求_第4頁
組原實驗要求_第5頁
已閱讀5頁,還剩16頁未讀 繼續免費閱讀

付費下載

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、摘要我們實現了一個 mips32 處理器,并在 FPGA 平臺上做了驗證。最初設計一些小模塊時,我們主要的測試是,測試指令則是手工匯編為二進制,在復位時給指令和數據器賦初值。隨著課題的進展,工程的規模和復雜度不斷增加,最基本的付。為此,我們學習和使用了 quartus 提供的一些機制,包括:已經難以應lll調用片上 ram,并為其指定初始化文件增量編譯邏輯分析儀 SignalTap II我們采用 uniIDE 作為軟件代碼的編譯器,并制作了小工具 bin2hex,將編譯得到的二進制 bin 文件轉換為特定格式的十六進制 hex 文件。:mips;FPGA;增量編譯;SignalTap II;u

2、niIDE;hexIABSTRACTWe implemented a mips32 processor and complete the verification in the FPGA platform.When we designed some Small modules at the first time, our main means of tests is simulation. Test instructions are compiled to binary by hand. In the reset, give the initial value to the instructi

3、on and data memory.With the progress of issues, project size and complexity increase, the most basic means to have been unable to cope. Because of this, we learned and used some of themechanismsthes provided by quartus, including:lllCall-chip ram, specify its initialization file. Incremental compila

4、tion.Logic analyzer SignalTap II.We use uniIDE as software code compiler, and produced a small tool bin2hex,change the compiled bin file to a specific format hex file.KEY WORDS:mips; FPGA; Incremental compilation; SignalTap II; uniIDE; hexII目錄流水線的驗證和調試1集成 CP0 和總線接口單元312345678910集成串口器4集成總線模塊6集成主存器7增量

5、編譯8邏輯分析儀SignalTap II10軟件開發環境及加載步驟12啟動和測試代碼14格式轉換工具bin2hex15參考文獻17致謝181流水線的驗證和調試指令cache數據cachePC圖 1對于 5 級流水線的取指和訪存階段,直接用寄存器組模擬指令和數據 cache。測試指令采用手工匯編,得到二進制代碼。為指令和數據 cache 模塊接入復位信號,在系統啟動時寫入初始值,包括測試指令和數據。數據和指令 cache 模塊的初始化 verilog 代碼形如:always(posedge clock)beginif(reset)cache_reg Insert Node or Bus,在跳出的

6、對話框中,點擊 Node Finder,加入要觀察的寄存器和線網型變量。要觀察內部變量,而非模塊的外部接口信號,則在 Node Finder 的 Filter 下拉框中,將默認選項 Pins:all 改為 SignalTap II:pre-synthesis。為模塊的輸入信號提供激勵。3.4.5.6.點擊按鈕,即可得到波形圖。分析并追蹤波形圖,找出并修正錯誤。有些信號的結果為空,這可能是因為該信號在編譯時被優化掉了。如果要觀察該信號,可以在源文件中該信號定義處,添加綜合屬性/* synthesis keep */或者/* synthesis preserve */,建議編譯器保留該節點。前者用

7、于保留 wire,后者用于保留寄存器。使用方法是,把綜合屬性放在變量定義語句末尾, 分號之前。如果把/* synthesis preserve */放在模塊定義處的分號之前,則整個模塊中的寄存器都不會被優化掉;不過/* synthesis keep */不支持這種用法,只能逐個對要保留的 wire 型變量使用該綜合屬性。22集成 CP0 和總線接口單元指令器總線接口CPO單元PC圖 35 級流水線經過一定的驗證后,雖然還不夠全面,但是我們對其的信心不斷增加。1.2.3.是集成 CP0 和總線接口單元。此階段的步驟為:除去流水線中的指令和數據 cache,將流水線與 CP0 相連。將訪存信號送到

8、 CP0 做地址轉換,然后轉送到總線接口單元。將指令和數據 cache 模塊改寫為兼容 wishbone 總線的指令和數據器,并直接掛接在總線接口單元的兩個主端口上。4.在指令和數據器中,用復位設初值的方法,設定測試指令和數據,包括 CP0 讀寫指令,器讀寫指令,以及在異常處的響應代碼。5.依舊利用輯。的方法,驗證 CP0 的基本讀寫操作,和異常、中斷處理邏6.驗證總線接口單元的邏輯,及其和流水線的交互操作。在訪存請求(包括指令和數據)沒有得到應答之前,處理器的流水線應當停頓。3MEM/WBEX/MEMID/EXIF/ID數據器3集成串口器為我們的5 級流水線集成CP0 和總線接口單元后,處理

9、器已經初具雛形,下面我們希望將其到開發板上,讓其真正運轉起來,這比結果更具說服力,也是我們的階段性目標。在板上運行,可以用邏輯分析儀,像一樣查看和分析運行時刻波形。但是這終究只是測試,并且根據 SignalTap II 的實現方式,只能查看到周期采樣的波形,而不是真正的運行時刻波形。這時,我們處理器并不只是一個流水線,而是一個,除了運算邏輯,還要包括輸入和輸出。我們選用了串口,作為系統的第一個 I/O 設備。他的邏輯簡單,系字符設備,并且既可以輸入,也可以輸出。指令器總線接口CPO單元PC圖 4對總線接口單元上的兩個主端口,其中一個為數據主端口,除去上面掛接的數據器,將串口器掛接上去。在指令器

10、。器中,加入串口初始化代碼,以及串口收發代碼,用以驅動串口用的方法驗證串口器的邏輯。此處主要驗證邏輯。對于接收邏輯,串入信號的激勵波形并不好編輯,此處可以有兩種方法解決。一是編寫一個模塊,作為串口的是采用邏輯分析儀 SignalTap II,模型,掛接到串口器的對外接口上。二調試硬件邏輯。實際上我們選用的串口器可靠性非常好,用的通邏輯后,硬件設計到開發板上運行,收發功能都正確無誤。此處開始,測試指令的規模已經很大,手工匯編的方式變得異常痛苦。而且指令器是用寄存器組來實現,當定義的寄存器數目過大時,quartus 的編譯進程將異常緩慢;寄存器越多,分析與優化就越復雜與耗時。為此,我們做了這些工作

11、:1. 在 quartus 環境下,利用 MegaWizard 調用 FPGA 器件的片上 ram4器,MEM/WBEX/MEMID/EXIF/ID串口為其編寫總線 wrapper,并取代原先的指令元的指令主端口上。器,掛接在總線接口單2.選用集成開發環境 uniIDE,作為 mips 編譯器。uniIDE 的配置和使用方式,參見章節 8 軟件開發環境及加載步驟。在 uniIDE 環境下,直接編寫匯編代碼和 c 代碼,編譯為二進制 bin 文件。在 visio studio 環境下,制作小工具 bin2hex,將二進制 bin 文件轉換為滿足特定要求的十六進制 hex 文件。3.4.5.將轉換

12、得到的十六進制 hex 文件,作為指令器的初始化文件。至此,從匯編代碼到二進制指令的轉換,不再需要手工匯編,而是由工具自動完成。器中的測試指令和數據也不再需要復位信號置初值,而是指定十六進制 hex 文件置初值。由于采用片上 ram 器件,而非大量寄存器,工程中的寄存器數量減少,大大降低了 quartus 編譯耗費的時間。處理器上運行,振奮人心。的在 FPGA54集成總線模塊總線接口CPO單元指令器串口PC圖 5之前都是將兼容 wishbone 總線的主從設備點對點相連,沒有透過總線進行通訊。現在,我們在處理器的總線接口單元和從設備(如片上 ram,串口等)間引入總線模塊,這樣,掛接在總線上的

13、器既可以被總線接口單元的指令主端口,也可以被數據主端口。并且,可以在總線上方便的掛接的從設備,處理器透過總線來和操作這些設備。我們選用的總線模塊為共享型總線,不多個主端口同時從端口,即使他們的不是同一個從端口。這樣效率不高,但是占用的少。不過既然我們在處理器上采用了分立的數據和指令主端口,以后會考慮將總線模塊換成交叉互連型實現,使數據和指令主端口可以同時掛接在總線上的從設備。這個總線模塊的開源 IP 核非常可靠,在我們的系統中運行穩定。唯一的問題是,從端口模塊只有在被選中的情況下才可以應答信號。因為總線模塊是將所有從端口的應答信號取或,提交給主端口。如果未被選中的從端口無故應答信號,會擾亂正常

14、的總線周期。之所以采用這種方式,可能是為了節省電路;不過,給當前通訊的主從設備建立通道應該更合理一些。有了總線模塊后,我們又在總線上掛接了板上智能 lcd 的器,一個簡單的字符設備,并顯示測試字符。6WISHBONEEX/MEMID/EXIF/ID總線MEM/WB5集成主存器片上的 ram器容量非常有限,只有幾十 KB,稍大的程序將無法裝入,這大大限制了系統的實用性。為此,我們在總線上集成了主存的 flash,sdram 和 sram。器,支持板上此時工程規模已經很大,編譯很耗時間;為此,引入增量編譯。增量編譯的相關操作參見章節 6 增量編譯。對于流水線、總線、串口器等相對穩定的模塊,利用增量

15、編譯,將其設置為 Post-Fit。這樣,每次全編譯時,這些模塊將跳過分析和綜合階段,大大縮短編譯時間。對于當前調試的模塊,比如主存器,由于其源代碼在不斷更改,所以設置為 Source File,每次編譯時,從源代碼開始執行分析、綜合等編譯步驟。對于掛接在總線上的各種設備,主要工作是閱讀器件的,確定針腳定義、讀寫時序、時延參數等。這一方面是端口配置的需要,另一方面,也為調試和驗證提供依據。要搞清楚正確的波形是什么,才能看懂和分析波形,找出并修正錯誤。目前的進度是:調通了 flash 并加載了該器件的驅動,調用驅動函數讀取了器件配置信息;調通了 sdram 的基本讀寫操作,但是對于特定的讀寫操作

16、組合還有錯誤,尚未修正;調通了 ssram,并且將程序重到 ssram 中運行。76增量編譯quartus 編譯的步驟依次為:分析,綜合,填充,生成 fpga 編程文件,時序分析,生成網表(用于)。其中最耗時間的是分析與綜合。硬件工程的規模比較可觀,邏輯復雜,全編譯很耗時間,拖慢了調試的進度。這時可以使用增量編譯功能,大大縮短編譯時間。如果處理得當,編譯時間可以縮短到原來的一半甚至更短。所謂增量編譯,就是將相對穩定且沒有變動的部分出來,對這些出來的部分,再次編譯時跳過某些步驟,直接使用上次編譯的成果,代入后面的步驟。為了做到這一點,需要如下步驟:1.全編譯一次工程。圖 6 PartitionP

17、lanner2.將工程分塊:在 quartus 環境下,選擇 Tools-Design Partition Planner,彈出窗口如圖 6 Partition Planner,即可對工程分塊。在彈出的窗口中,右擊設計中的某個模塊,選 Create Design Partition,將該模塊出來,設置為分塊。8圖 7 Design Partitions Window3.設置各分塊的狀態:在 quartus 環境下,使用快捷鍵 a,調出分塊管理窗口 Design Partitions Window,如圖 7 Design Partitions Window。其中列出了已經設置的分塊。其中 Net

18、list Type 一列為分塊狀態,雙擊某分塊在該列的值,出現下拉菜單,更改分塊狀態。主要選項有:源文件,分析后,填充后。比如選擇源文件,那么下次編譯時該分塊從源文件開始進行編譯步驟;分析后,則下次編譯時,該分塊跳過分析步驟, 使用上次編譯時的分析成果,直接代入后面的綜合等步驟;填充后,則下次編譯時,該分塊跳過填充以及其前的所有步驟,使用上次編譯時的填充成果,直接代入后面的步驟。設置好分塊及其狀態后,點擊全編譯按鈕,即可增量編譯工程。如果某個分塊的源代碼有改動,則應將該分塊的狀態設置為“源文件”,以免跳過了分析步驟。4.5.需要注意的是,將某些部分的狀態固定住,意味著編譯器不能進行分塊的全局優

19、化,得到的編譯結果,其效能可能會稍有降調試和驗證完成后,應該將各分塊的狀態調回“源文件”,并全編譯一次工程,得到高效的編譯結果。97邏輯分析儀 SignalTap II圖 8 SignalTap II對于運行時刻錯誤,需要實時抓取電路上某些節點的波形,進行分析。SignalTap II 是片上邏輯分析儀,可以實時抓取片上信號,通過 jtag 端口與 PC 主機通訊,將波形送到 PC 屏幕上顯示。實際上,在硬件設計中需要提供一個采樣時鐘,SignalTap II 以該時鐘對觀察節點進行采樣。所以采樣時鐘的頻率應當要高于被觀測信號的頻率,可以用鎖相環產生高頻時鐘。但是采樣頻率也不宜過高,因為采樣到

20、的數據是暫存在片上器中,而片上器的容量十分有限,硬件設計本身還要占用一部分。波形的時間跨度就越小。SignalTap II 的使用步驟:器容量一定,則采樣頻率越高,所得1.2.3.4.5.在工程中預留一個時鐘信號,作為采樣時鐘。全編譯一次工程。將開發板與主機用 jtag 口相連。新建 stp 文件。在 stp 文件的編輯窗口(如圖 8 SignalTap II),JTAG Chain Configration視圖中配置硬件,選中與主機相連的開發板。在 stp 文件的編輯窗口,Signal Configration 視圖中,設置采樣時鐘, 采樣深度等。采樣深度就是采樣數量。在 stp 文件的編輯

21、窗口,主界面有 Data 和 Setup 兩個選項卡。在 Setup 中雙擊,即可添加要觀察的信號。在 Setup 中,對于要觀察的信號,設置觸發條件。就是從觸發條件滿足106.7.8.開始,SignalTap II 根據設定的采樣深度采取一定數量的樣本,并將結果暫存在片上器,然后通過 jtag 口送至主機顯示。9. 保存 stp 文件,提示是否使能 SignalTap II,選擇是。在 quartus 主界面,Assignments-Settings,跳出設置界面,選 Timing Analysis Settings 節點下的 SignalTap II Logic Analyzer 分支,有

22、 Enable SignalTap II Logic Analyzer 選項,可以使能或禁用 SignalTap II, 并可以指定當前的 stp 文件。現在我們要使能 SignalTap II。10. 再次全編譯工程。當編譯進行到 EDA Netlist Writter 時,可能會報錯, 無法進行下去。這是因為引入邏輯分析儀后,如果觀察節點列表中有 I/O針腳,則這些 I/O 針腳被附加了硬件邏輯,編譯器判定為的端口類型。可以忽略這個錯誤,因為硬件邏輯(pof 文件)已經生成,可以繼續。11. 將編譯得到的 pof 文件到開發板,對 fpga 編程。12. 在 stp 文件編輯窗口中,點擊運

23、行按鈕。13. 運行的硬件。14. 當觸發條件滿足,比如撥動開關產生某個信號的正延,SignalTap II 即開始采樣。在 stp 文件編輯窗口中,Data 選項卡下可以查看采樣結果,分析波形。15. 更改 stp 文件后,需要轉到第 10 步,重新編譯工程。16. 有些信號采樣結果為空,這可能是因為該信號在編譯時被優化掉了。如果要觀察該信號,可以在源文件中該信號定義處,添加綜合屬性/* synthesis keep */或者/* synthesis preserve */,建議編譯器保留該節點。前者用于保留 wire,后者用于保留寄存器。使用方法是,把綜合屬性放在變量定義語句末尾, 分號之

24、前。如果把/* synthesis preserve */放在模塊定義處的分號之前,則整個模塊中的寄存器都不會被優化掉。17. 有時處理器會因為錯誤的訪存請求得不到響應而死鎖,整個停頓下來。為此,程序計數器 PC 的值輸出在開發板上的 7 段數碼管。系統死鎖時,可以從 7 段數碼管當前的 PC 值。然后在邏輯分析儀中,將此 PC 值作為觸發條件,從而觀察死鎖前后處理器的態,找到出錯。118軟件開發環境及加載步驟圖 9 uniIDEuniIDE 是應用于領域的集成開發環境,界面友好,和 visual studio的風格類似。各參數和選項全部在圖形界面下交互設置,不用手工編寫makefile、等。

25、其運行平臺是 windows,編譯器是 gcc。我們的系統現在還很簡單,因此使用到的 uniIDE 中的功能很有限。此處只對已經用到的部分作簡要說明, 安裝目錄下的 help 子目錄。軟件的開發與加載步驟為:高級功能,參見 uniIDE 的幫助文檔,位于1.到官網uniIDE 的安裝程序:。2.3.4.在 windows 系統下安裝 uniIDE。打開 uniIDE 集成開發環境,新建無操作系統工程。uniIDE 會自動生成工程模板,包括匯編語言的啟動代碼 crt0.s 和 c 語言的 main 函數。uniIDE 還為工程自動生成了串口驅動 serial.c,封裝了收發函數,以及串口狀態函數

26、。5.對于 crt0.s,除去其中的設備初始化代碼,只保留用于代碼重分。根據系統的實際情況,添加設備初始化代碼。的部6.對于 serial.c,開頭是串口的基地址、寄存器位定義等。有兩個選項,通過宏開關。根據我們的系統,選取 GODSONI 下的內容,另一個選項除掉。基地址的宏定義更改為系統實際分配給串口的地址。127.8.對于 main.c,可以添加應用和測試代碼。在 uniIDE 的主界面下,選 Build 選項卡,在其中配置工程屬性。圖 10 編譯配置9.編譯器選項卡中,出于測試目的,不開啟優化;我們的處理器暫時只支持序,所以端序配置為低字節低址。中,根據系統的實際情況,填寫代碼10.地

27、址,以及程序的實際運行地址。代碼從到正確的地方運行。地址啟動,然后根據這里的信息,將搬運11. 編寫測試代碼或應用程序,編譯,生成可bin 文件。文件,以及二進制12. 對于可文件,用反匯編工具 idapro 打開,查看匯編代碼,其中還可以查看各條指令和數據的地址,各函數的地址等信息,在系統善的情況下,這些信息對調試很有幫助。13. 對于二進制 bin 文件,用我們的小工具 bin2hex 轉換為特定的十六進制hex 文件,作為啟動 ram 的初始化文件。14. 在 quartus 環境下,編譯工程,并運行。15. 當軟件部分有變動而硬件邏輯不變時,首先用 uniIDE 和 bin2hex 更

28、新十六進制 hex 文件;然后在 quartus 環境下,點 Processing -Update Memory Initialization File,通知 quartus 更新 ram 的初始化文件; 點 Processing -Start-Start Assembler,重新生成 FPGA 編程文件。并運行。139啟動和測試代碼我們還沒有為系統搭建一個功能完善的 bootloader,在我們的啟動代碼中, 只是對已經集成的設備做初始化,外帶一些設備測試代碼。代碼的結構和流程:1.程序的為 start,位于 crt0.s 中。在 uniIDE 的配置選項中可以更改點。2.處理器初始化。我們

29、的處理器尚未集成 cache、tlb 等,所以其初始化非常簡單,只是將 cp0 中 cause 寄存器的 IV 位置 1,用以指定異常和中斷的。3.設備的初始化,包括串口,主存lcd,并打印測試字符。器(flash,sdram,ssram)和智能4.代碼的重。將代碼從位置搬運到 ssram 運行。為了做到這一點,需要在 uniIDE 中設置程序的運行地址為 ssram 的地址空間。如果設置程序的運行地址為 sdram 的地址空間,則運行。將搬運到 sdram 中5.堆棧初始化。實際上就是初始化棧指針 sp,對應處理器中的 29 號寄存器。清除 cp0 中 status 寄存器的 EXL 和 E

30、RL 位,設置中斷掩碼,并開中斷。6.7.8.跳轉到 main 函數,也就是 c 代碼的測試和應用代碼。,位于 main.c 中。在uniIDE 中,我們包含了 stdio.h 作為輸入輸出庫,但是似乎只封裝了printf 函數,沒有封裝 scanf 函數。printf 函數已經運行,但是目前只支持打印字符變量或字符串,不支持整形變量。因為打印非字符變量時,要將其轉換為字符,轉換過程用到除法指令,而我們的處理器尚未集成除法器。可選方案是,讓處理器產生一個未定義指令異常,然后異常處理程序到后,調用軟件來模擬除法指令。我們不打算這么做,計劃是集成除法器。另外,mips 中的除法指令并不產生除 0

31、和溢出異常,經典做法是在除法指令后緊跟一條 break 指令,產生斷點異常,由異常處理程序檢查除法指令是否有除 0 或溢出。實際上 uniIDE 下的編譯結果就是如此,每條除法指令后緊跟一條break 指令。為此,有必要編寫完善的異常處理程序,來應對這些異常。我們的計劃是,借用 uboot 或 pmon、yamon 等成bootloader 的代碼。1410 格式轉換工具 bin2hex在我們的系統中,是用測試代碼作為片上 ram 的初始化文件,處理器從片上ram 啟動,運行其中程序。片上 ram 的初始化文件只支持 quartus的 mif 格式和 hex 格式。而測試軟件編譯完成后生成的可

32、執行程序是 bin 格式,此處我們需要將 bin 文件轉換為 hex 文件。hex 格式簡介:一種可執行文件的前一階段格式。Intel HEX 文件是文本行的 ASCII 文本文件,在 Intel HEX 文件中,每一行是一個 HEX。由十六進制數組成的碼或者數據常量。格式為:: LL AAAA TT DD.DD CC共六部分llll:冒號 是每一條 Intel HEX的開始LL 是這條的長度域,他表示數據(dd)的字節數目.AAAA 是地址域,他表示數據的起始地址TT 這個域表示這條 HEX的類型,他有可能是下面這幾種類型00010204-數據-文件結束-擴展段地址-擴展線性地址lDD 是數

33、據域,表示一個字節的數據,一個節數目可以查看 LL 域的說明。可能有多個數據字節,字lCC 是效驗和域,表示所有字母對的效驗和,計算方法是將本條冒號開始的其中的地址域 AAAA 為 4 個字符,只能表示 16 位的地址空間,也就是 64k。當數據或文件大于 64k 時,就要用到擴展線性地址,用法是在 64k 地址邊界處,放置擴展線性地址,指出當前位置的高 16 位基地址。bin 文件的暫時只支持:按字節序,所以軟件代碼以,低地址存放數據低字節。因為處理器序編譯。我們的目標格式是 hex,按字尋址,每行 1 個字,這個字中的 4 個字節,高字節在前,低字節在后。我們在網上了格式轉換工具 bin2

34、hex 的源代碼,但是該版本得到的 hex文件是按字節尋址,每行 16 個字節,低字節在前,高字節在后。對代碼稍作調整,即得到了我們需要的 hex 文件。生成的 hex 文件名為 test.hex,沒有提供指定文件名的功能,用戶可以自行更改 hex 文件的名字。bin2hex.exe 工具采用VC6.0 編譯生成。調用 bin2hex 工具需要使用命令行,每次都要切換工作目錄、傳遞參數,相當麻煩。為此,bin2hex.exe到軟件部分的工程目錄下,將其和編譯15生成的 bin 文件放在一起,然后使用 dos 批處理機制。軟件編譯bin 文件后,在軟件目錄下雙擊運行批處理bin2hex.bat,即可生成 hex 文件。圖 11 quartus 查看 hex 文件視圖可以用記事本打開 hex 文件,但是這樣查看很不方便,其中包含了太多的附加信息。quartus 軟件可以打開和編輯 hex 文件,其提供了更直觀的視圖,看上去就好像將數據填充到單元中,如圖 11 quartus 查看 hex 文件視圖。打開 hex文件時,需要指定數據單元的寬度,我們生成的32 位。hex文件中數據單元的寬度為16參考文獻1MIPS32 Architecture For Programmers Volume II: The

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論