MAAB設(shè)計FPGA實現(xiàn)聯(lián)合ISE和Modelsim仿真的FIR濾波器設(shè)計_第1頁
MAAB設(shè)計FPGA實現(xiàn)聯(lián)合ISE和Modelsim仿真的FIR濾波器設(shè)計_第2頁
MAAB設(shè)計FPGA實現(xiàn)聯(lián)合ISE和Modelsim仿真的FIR濾波器設(shè)計_第3頁
MAAB設(shè)計FPGA實現(xiàn)聯(lián)合ISE和Modelsim仿真的FIR濾波器設(shè)計_第4頁
MAAB設(shè)計FPGA實現(xiàn)聯(lián)合ISE和Modelsim仿真的FIR濾波器設(shè)計_第5頁
已閱讀5頁,還剩24頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、MATLAB設(shè)計,F(xiàn)PGA實現(xiàn),聯(lián)合ISE和Modelsim仿真的FIR濾波器設(shè)計摘要:本文首先利用MATLA滬生兩個頻率不一樣的正弦信號,并將這兩個正弦信號相加,得到一個混疊的波形;然后利用MATLAB設(shè)計一個FIR低通濾 波器,并由Verilog實現(xiàn),聯(lián)合ISE和Modelsim仿真,實現(xiàn)濾除頻率較 高的信號,并將濾波后的數(shù)據(jù)送到MATLAB分析。本文首先介紹FIR濾波器的基本原理,然后從目前最流行的的設(shè)計方式入手,逐步介紹FIR濾波器的設(shè)計,其流程圖如圖1所示:圖1FIR濾波器的基本原理:數(shù)字濾波器是從分析信號中提取用戶需要的信息,濾去不需要的信號成分或者干擾成分。數(shù)字濾波器的數(shù)學(xué)模型:

2、線性時不變數(shù)字濾波器的數(shù)學(xué)模型在時域中可以用線性常系數(shù)差分方程給出:其等效的Z變換為:PqgzN1 dkgzk 1當(dāng)dk全為o時,Z域系統(tǒng)函數(shù)只有零點,數(shù)字濾波器的單位脈沖響應(yīng)有限, 通常這用濾波器被稱為有限沖激響應(yīng)(FIR)濾波器。它的輸出只與當(dāng)前的輸入 和過去的輸入有關(guān),跟過去的輸出無關(guān)。 FIR濾波器的一個重要特性是具有線性相位,即系統(tǒng)的相異和頻率成正比,可達(dá)到無失真?zhèn)鬏敗8釉敿?xì)的介紹 FIR 濾波器的理論算法知識,請參考別的先關(guān)書籍資料、 二、 FIR 濾波器的設(shè)計及驗證:1) 由MATLA產(chǎn)生FIR濾波器的輸入數(shù)據(jù),并存放到.txt文件中用MATLAB生兩個頻率分別為:0.5MHz

3、和2MHz的正弦信號,并將這兩個正弦信號疊加,得到一個混疊的信號,并將這個混疊信號的波形數(shù)據(jù)存放到C盤根目錄下面的 matlab_wave_data.txt文件中。MATLAB現(xiàn)代碼如下:clear all;fs = 25000000; % 25M 采樣率t = 0:1/fs:0.0002; % 共 0.0002 * 25000000 = 5000 個點f1 = 500000;f2 = 2000000;signal1 = sin(2*pi*f1*t); %頻率為 0.5MHz 的正弦信號signal2 = sin(2*pi*f2*t); %頻率為 2.0MHz 的正弦信% 由于正、余弦波形的值

4、在 0,1 之間,需要量化成 16bit, 先將數(shù)值放大y2 = fix(16384 + (2A14 - 1) * sig nail); %量化到 15bit量化到 15bity3 = fix(16384 + (2八14 - 1) * sig nal2); %y1 = y2 + y3; % 量化到 16bit % 再將放大的浮點值量化,并寫道到存放在 C 盤的文本中fid = fopen('c:/matlab_wave_data.txt', 'wt');fprintf(fid, '%xn', y1); %以 16 進(jìn)制的格式將數(shù)據(jù)存放到 .txt

5、 文件中。如果不用 16 進(jìn)制,后面% 讀數(shù)會出錯。fclose(fid);plot(y2, 'b');hold on;plot(y3, 'b');hold on;plot(y1, 'r');legend('0.5MHz 正弦 ','2MHz 正弦 ',' 兩者疊加 ');title('MATLAB 產(chǎn)生的兩個正弦信號的疊加波形 ');信號波形圖如圖 2 所示:存放數(shù)據(jù)的文件路徑、名稱已經(jīng)文本的內(nèi)容如圖 3 所示:圖3用MATLAB讀C盤根目錄下的 matlab_wave_data.

6、txt 文件,驗證存入的波形數(shù) 據(jù)是否正確,MATLA代碼如下:fid = fopen('c:/matlab_wave_data.txt','r');for i = 1 : 5001;% 一共有 5001 個數(shù)據(jù)num(i) = fscanf(fid, '%x', 1);%從 fid 所指的文件中,以 16 進(jìn)制的方式讀出一個數(shù)據(jù)endfclose(fid);figure(2);plot(num,'b');legend('MATLAB 從 txt 文件中讀出的原始疊加波形數(shù)據(jù) ');title('直接回讀M

7、ATLAB生的兩個正弦信號的疊加波形');顯示的波形如圖 4 所示:圖4對比圖 4 和圖 2 中的疊加波形,可知以上操作的正確性。2) 用MATLABS計FIR濾波器輸入信號是頻率別為 0.5MHz和2MHz的正弦信號的疊加,我們的任務(wù)是設(shè)計一 個低通濾波器濾除掉2MHz的干擾信號。因此,我們可以設(shè)計一個采樣率為25MHz的低通濾波器,其通帶帶寬為 1MHz阻帶寬度為2MHz通帶內(nèi)紋波抖動為1dB,阻帶 下降為 80dB。在MATLAB的命令窗口輸入:fdatool 命令并回車,打幵 FDATool工具箱,用MATLAB勺FDATool工具設(shè)計該濾波器,參數(shù)設(shè)置如圖5所示:設(shè)計好參數(shù)后

8、,點擊 DesignFilter ,可以在FDATool窗口的左上角看到濾波器 的階數(shù)為 63 階,點擊 File ?Generate M-file ,并將濾波器命名為 mylowfilter 。圖5編寫如下代碼,濾除混疊信號中的高頻信號。Hd = mylowfilter; %濾波器名稱output = filter(Hd, y1); %對疊加信號 y ,進(jìn)行濾波處理figure(3);plot(y2, 'k');hold on;plot(output, 'r');legend('0.5MHz 原始信號 ',' 濾波后取出的信號 '

9、;);title('信號通過MTALAB勺低通濾波器后的波形');濾波后的波形如圖 6 所示:圖6生成 .coe 文件,用于 Xilinx 的 IPCore 設(shè)計濾波器, FDATool 窗口點擊 File ?Export ,保持默認(rèn)設(shè)置,點擊 Export即可,次數(shù)在 MATLAB勺workspace 窗口多出一個Num的1*64的數(shù)組,這就是濾波器的系數(shù),如圖 7所示:圖7由于MATLA生成的濾波器系數(shù)全是一些小數(shù),而FPGA只能處理整數(shù),因此我們必須將這些小數(shù)擴大一定的倍數(shù),使它們變成整數(shù)。在MATLAB勺命令窗口輸入下面的一段代碼然后按Enter,即可將上面這些系數(shù)變?yōu)?/p>

10、整數(shù),注意這里的 *32767 ,表示將系數(shù)擴大 32767 倍,這里的擴大倍數(shù)只能選2AN,目的是為了后面濾波后的波形數(shù)據(jù)的高位截取(丟掉低位,即除以2AN)0返回ans=0,表示操作正確。coeff=round(Num/max(abs(Num)*32767);% abs() 求絕對值, max() 求最大值, round() 四舍五入fid = fopen('e:/fircoe.txt','wt'); %將濾波器系數(shù)寫入文件件中fprintf(fid,'%16.0fn',coeff);% 將濾波器系數(shù)以 16 位浮點數(shù)的格式保存fclose(

11、fid)程序運行的結(jié)果如圖 8 所示:圖8將文件的格式改為 .coe 格式,在文件的開口加上:radix = 10;coefdata =在每個數(shù)字前的空格處加一個逗號“ , ”,并在最后一個數(shù)字后面加上分號“ 如圖 9 所示:圖9這樣就產(chǎn)生了可供 FIR 濾波器的 IPCore 可調(diào)用的 .coe 文件。3) 用Verilog編程讀取MATLA產(chǎn)生的波形數(shù)據(jù)通過Verilog 的$readmemh()函數(shù)即可讀出.txt文件中的數(shù)據(jù)(這里的數(shù)據(jù)是以 16 進(jìn)制形式存儲的) ,具體用法如下:reg 15 :0 data_in0:2000; /定義一個 16bit * 2001 的數(shù)組initia

12、l begin讀出 MATLA產(chǎn)生的波形數(shù)據(jù) 0.5MHz_sin + 4MHz_sin 信號$readmemh("c:/matlab_wave_data.txt", data_in);/ 將 matlab_wave_data.txt 中的數(shù)據(jù)讀入存儲器 data_inEnd我在modelsim中嘗試用readmemh來讀取matlab生成的數(shù)據(jù),但是一旦到了負(fù)數(shù)的地方就出現(xiàn)問題了,之后的所有數(shù)據(jù)都變成了xxxxx,因此我在用MATLAE產(chǎn)生波形數(shù)據(jù)時都給正弦信號添加了一個偏移量,將正弦信號平移到了 0之上。用 Modelsim 仿真工具可以看到讀出的數(shù)據(jù),并與原文件數(shù)據(jù)(

13、圖3)比較,可以判斷讀出的數(shù)據(jù)是否正確,這里是ISE和Modelsim聯(lián)合仿真的結(jié)果,如圖10所示:圖 104)由Xilinx 的FIR的IPCore實現(xiàn)FIR濾波器FIR 的 IPCore 的生成步驟就不多說了,簡單的說一下參數(shù)配置情況:a)我們使用由MATLABt成的.coe文件導(dǎo)入濾波器的系數(shù)。b)輸入信號的采樣頻率為 25MHz這里必須和MATLA曠生的波形數(shù)據(jù)的采樣頻率保持一致。c)FIR濾波器的運行時鐘,這里我們選擇 250MHz這里必須和仿真文件里給的時鐘保持一致16bit ,因為d) 輸入數(shù)據(jù)的類型,我們這里選擇了無符號數(shù),輸入數(shù)據(jù)位寬為modelsim 不能讀出負(fù)數(shù)要么用補碼

14、,要么加偏移)。如圖 11、圖 12 所示:圖 11圖 12FIR 的 IPCore 的列化如下:FIR16_IP FIR16_IP_ins (.clk(clk), / input clk.rfd(rfd), / output rfd在其上升沿將輸入數(shù)據(jù)加載到濾波器內(nèi)核中.rdy(rdy), / output rdy在其上升沿輸出濾波器的計算結(jié)果特別注意這個數(shù)據(jù)位寬.din(data_in_reg), / input 15 : 0 din.dout(dout); / output 35 : 0 dout我們主要對其進(jìn)行簡單的控制: 在 rfd 上升沿將輸入數(shù)據(jù)加載到濾波器內(nèi)核中, 在 rdy

15、上升沿輸出濾波器的計算結(jié)果。具體的 Verilog 代碼如下:always (posedge clk) beginif(reset = 1'b0) begin<=1'b0;endendm <= 1'b0;data_in_reg <= 16'h0000;end else beginrfd_1q <=rfd;rfd_2q <=rfd_1q;endendif(rfd_1q & rfd) begin/ rfd 信號的上升沿將輸入數(shù)據(jù)加載到濾波器內(nèi)核中endenddata_in_reg <= data_ini;i <= i

16、 + 1;m <= m;if(i = 2002)i <= 0;endendendendend always (posedge clk) beginif(reset = 1'b0) beginData_out_reg <= 0;j <= 0;n <= 0;endelse beginrdy_1q <= rdy;rdy_2q <= rdy_1q;if(rdy_1q & rdy) beginData_out_reg <= dout;j <= j + 1'b1;n <= n;endendend這里還做了一個附加功能, 將

17、 FIR 濾波器的輸入數(shù)據(jù)存放到一個 .txt 文件當(dāng)中, 然后用MATLABfc讀取這個波形文件數(shù)據(jù),看看讀出的波形是否和原來的混疊波形一 樣。具體的Verilog和MATLA代碼如下:integerwr_file;initialwr_file = $fopen("c:/FIR_in_data.txt");always ( m ) beginif(reset = 1'b1) begin$fdisplay(wr_file,"%h", data_in_reg);/ 33bit數(shù)if(j = 11'd2002) /共寫入 2001個數(shù)據(jù)$st

18、op;endendfid = fopen('c:/FIR_in_data.txt','r');for j = 1 : 2000;num1(j) = fscanf(fid, '%x', 1);%這句話的意思是從 fid 所指的文件以 16 進(jìn)制方式讀出一個數(shù)據(jù)。end fclose(fid);figure(4);plot(num1,'r');legend('Verilog 讀出的 txt 文件中的數(shù)據(jù) ');title('FIR 濾波器的輸入數(shù)據(jù) ');MATLAB 讀出的波形數(shù)據(jù)如圖 13 所示:圖

19、 13面就將5) 將 FIR 濾波器的輸出存入 .txt 文件中有上面的步驟我們已經(jīng)驗證了輸入到 FIR 濾波器的數(shù)據(jù)都是正確的,F(xiàn)IR濾波器的輸出數(shù)據(jù)保存到一個.txt文件當(dāng)中供MATLAB取。/ 剛剛的問題是, matlab 讀一個數(shù)據(jù)是 32bit 的,/ 而 FIR 的輸出是 36bit 的,因此高 4bit 根本沒有讀上來。assign Data_out31:0 = Data_out_reg35:4;initialinteger w_file;w_file = $fopen("c:/FIR_out.txt");always ( n ) beginif(reset

20、= 1'b1) begin$fdisplay(w_file,"%h", Data_out31:14);/ 33bit數(shù)if(j = 11'd2002) /共寫入 2001 個數(shù)據(jù)$stop;endend這里我也搞了好久才搞好,這里 FIR 濾波器的輸出數(shù)據(jù)位寬變成了 36bit ,而輸 入數(shù)據(jù)位寬是 16bit ,為什么數(shù)據(jù)會變大幾萬倍呢?因為我們在將濾波器的系數(shù)由小數(shù)變成整數(shù)的時候,對這些系數(shù)整體擴大了32767 倍,再做了一個四舍五入(影響濾波器精度) ,對濾波器的系數(shù)擴大的倍數(shù)越 大,四舍五入對精度的影響就越小,但是系數(shù)乘的倍數(shù)越大,F(xiàn)PGA在做乘加運

21、算也就越復(fù)雜,也就越耗時,越耗資源,因此我們需要找一個平衡點。這里為了將信號的幅度變回原始的幅度(盡可能的靠近) ,我們只能通過將低位 截取掉,截取低位相當(dāng)于對數(shù)據(jù)做除法(除 2),所以前面的濾波器系數(shù)的擴大倍數(shù) 我們一定要用20,這樣我們在這里還原信號幅度的時候,只需要截位就能達(dá)到目比如這里我們對濾波器的系數(shù)乘了 32767,那我們在做除法還原波形幅度時,只 需要除以 32767 即可(即截掉低 16bit )。還有一種操作方式就是我們只保留數(shù)據(jù)的 高 16bit (和輸入數(shù)據(jù)的位寬保持一致) ,這兩種方式波形的幅度也就幾倍的差距, 我還沒有完全搞懂這里,究竟怎樣才能將波形的幅度完全的還原回

22、去,還是一個值 得好好思考的問題?另一個問題是我的電腦是 32bit位寬的,如果我們一次性讓 MATLAB讀取36bit 的數(shù)據(jù)那么數(shù)據(jù)的高 4bit 會讀不上來, 會導(dǎo)致很奇怪的波形, 我也遇到了這個問題。 如圖 14 所示, 波形明顯可以通過一些平移拼合成一個正弦波。 通過對波形數(shù)據(jù)一個 個的分析,我找到了這個問題。圖 14圖 15 是波形幅度發(fā)生變化的截圖:圖 156)由MATLA牘入FIR濾波器的輸出數(shù)據(jù),并分析濾波結(jié)果由MATLAB取FIR濾波器的輸出數(shù)據(jù),分析波形,具體的代碼如下:fid = fopen('c:/FIR_out.txt','r');f

23、or i = 1 : 2000;num(i) = fscanf(fid, '%x', 1);%這句話的意思是從 fid 所指的文件以 16 進(jìn)制方式讀出一個數(shù)據(jù)。endfclose(fid);figure(5);plot(num,'r');y4 = y2;hold on;plot(y4, 'k');legend(' 經(jīng)過 FIR_IPCore 濾波后的數(shù)據(jù) ','0.5MHz 的原始數(shù)據(jù)放大 16384 倍');title(' 經(jīng)過 FIR 濾波器的輸出數(shù)據(jù) ');波形數(shù)據(jù)如圖 16 所示:圖 16

24、三、 總結(jié)本次設(shè)計我大約耗時一周, 從 0 開始研究 FIR 濾波器的設(shè)計, 聯(lián)合了 MATLA、B ISE、Modelsim三個工具,不得不佩服 MABLABS數(shù)據(jù)分析方面強大的功能。本 次設(shè)計走通了 FIR 濾波器的總體設(shè)計流程, 為以后的工程實用打下了基礎(chǔ), 當(dāng)然 還有一些基本問題,如波形幅度如何完美的還原還沒搞清楚,有待進(jìn)一步研究。 在實際工程應(yīng)用時, 我們可以通過聯(lián)合 MATLA、BISE、 Modelsim 三個工具完全脫 離硬件來設(shè)計、 仿真、 驗證 FIR 數(shù)字濾波器的性能, 肯定能夠大大的縮短設(shè)計周期,提升濾波器性能 附錄:是可以直附錄為Verilog源代碼和MATLABM代

25、碼,這些源代碼是經(jīng)過調(diào)試的, 接使用的。供大家參考。Verilog 源代碼:module FIR_Lowpass(clk,reset,Data_out);inputclk;inputreset;output31:0Data_out;reg35:0Data_out_reg;reg 10:0 i0;reg 10:0 j = 0;reg 15 :0 data_in0:2000; /定義一個 16bit * 2001 的數(shù)組reg 15:0 data_in_reg = 0;in itial beg in/讀出 MATLA產(chǎn)生的波形數(shù)據(jù) 0.5MHz_sin + 4MHz_sin 信號$readmemh

26、("c:/matlab_wave_data.txt",data_in);/將matlab_wave_data.txt 中的數(shù)據(jù)讀入存儲器 data_inendwirerfd;wirerdy;wire 35:0 dout;reg rfd_1q;reg rfd_2q;reg rdy_1q;reg rdy_2q;reg n = 0;reg m = 0;always (posedge clk) beginif(reset = 1'b0) begini<=1'b0;m<=1'b0;data_in_reg <= 16'h0000;end

27、else beginrfd_1q <=rfd;rfd_2q <=rfd_1q;if(rfd_1q & rfd) begin/ rfd 信號的上升沿將輸入數(shù)據(jù)加載到濾波器內(nèi)核中data_in_reg <= data_ini;i <= i + 1;m <= m;if(i = 2002)i <= 0;endend endFIR16_IP FIR16_IP_ins (.clk(clk), / input clk.rfd(rfd), / output rfd在其上升沿將輸入數(shù)據(jù)加載到濾波器內(nèi)核中.rdy(rdy), / output rdy在其上升沿輸出濾波器

28、的計算結(jié)果.din(data_in_reg), / input 15 : 0 din.dout(dout); / output 35 : 0 doutalways (posedge clk) beginif(reset = 1'b0) beginData_out_reg<=0;j<=0;n<=0;endelse beginrdy_1q <= rdy;rdy_2q <= rdy_1q;if(rdy_1q & rdy) beginData_out_reg<=dout;j<=j + 1'b1;n <= n;endendend/

29、剛剛的問題是, matlab 讀一個數(shù)據(jù)是 32bit 的,而 FIR 的輸出是 36bit 的,因此 高 4bit 根本沒有讀上來。/ assign Data_out31:0 = Data_out_reg35:4;assign Data_out31:0 = Data_out_reg35:4; /*integer wr_file;initialwr_file = $fopen("c:/FIR_in_data.txt");always ( m ) beginif(reset = 1'b1) begin$fdisplay(wr_file,"%h",

30、data_in_reg);/ 33bit數(shù)if(j = 11'd2002) / 共寫入 2001 個數(shù)據(jù)$stop;endend/*integer w_file;initialw_file = $fopen("c:/FIR_out.txt");always ( n ) beginif(reset = 1'b1) begin$fdisplay(w_file,"%h", Data_out31:14);/ 33bit數(shù)if(j = 11'd2002) / 共寫入 2001 個數(shù)據(jù)$stop;end endendmoduleMATLAB源

31、代碼%*MATLAB 產(chǎn) 生 信 號 并 保 存 到 .txt文 件 中*clear all;fs = 25000000; % 25M 采樣率t = 0:1/fs:0.0002;% 共 0.0002 * 25000000 = 5000 個點 f1 = 500000;f2 = 2000000;signal1 = sin(2*pi*f1*t); %頻率為 0.5MHz 的正弦信號signal2 = sin(2*pi*f2*t); %頻率為 4.0MHz 的正弦信號%y1 = signal1 + signal2; %兩個正弦信號疊加%x = linspace(0, 12.56, 2048); %在區(qū)

32、間 0,6.28 = 2*pi之間等間隔的取 1024個點I 八、%y1 = sin(x); % 計算相應(yīng)的余弦值% 由于正、余弦波形的值在 0,1 之間,需要量化成 16bit, 先將數(shù)值放大%y1 = y1 * 32768; % 32 * 1024 = 32768 %y1 = y1 * 16384; % 32 * 1024 = 32768%y1 = y1 + 32768;y2 = fix(16384 + (2A14 - 1) * sig nail);y3 = fix(16384 + (2八14 - 1) * sig nal2);y1 = y2 + y3;% 再將放大的浮點值量化,并寫道到存

33、放在C 盤的文本中fid = fopen('c:/matlab_wave_data.txt', 'wt');%fprintf(fid, '%16.0fn',y1);% 在 寫 文 件 時量 化 為 16bit 的定 點 實數(shù)【%16.0f,16.0 表示 16bit 定點數(shù), f 表示實數(shù)】,范圍是: -32768 - 32767fprintf(fid, '%xn', y1); %在寫文件時量化為 16bit 的定點實數(shù)【 %16.0f,16.0表示 16bit 定點數(shù), f 表示實數(shù)】,范圍是: -32768 - 32767fc

34、lose(fid);figure(1);plot(y2, 'b');hold on;plot(y3, 'b');hold on;plot(y1, 'r');legend('0.5MHz 正弦 ','2MHz 正弦 ',' 兩者疊加 '); title('MATLAB 產(chǎn)生的兩個正弦信號的疊加波形 ')%*MATLAB 回 讀 保 存 到 .txt 文 件 中 的 信 號*fid = fopen('c:/matlab_wave_data.txt','r');for i = 1 : 5001;%num(i) = fscanf(fid, '%f', 1)

溫馨提示

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

評論

0/150

提交評論