研究生期間作項目所學到的一些經驗

 

    本文主要分享研究生期間所學到的一些科研和項目經驗,實踐部分偏重於硬件電路。點滴瑣碎,還請見諒。前端

 

一  項目所得

 1.1 心得體會

  • 任何事物都要從最簡單、最基本的構架入手,理解複雜的。——接觸學習新東西時的指導思路。
  • 作理論要作作想一想,邊停邊走;作工程則要不斷推動,由於不作不出來。工程就是靠時間堆出來的,不在於誰比誰聰明多少,而在於誰比誰用功了多少。
  • 作工程思路:不要挑刺鑽牛角尖,能用就行。要實用主義而不是理想主義,忌追求完美(好比正確解調須要信噪比至少10dB,則前端的同步就無須追求在5dB下性能最佳)!該細則細,該粗則粗。不要死摳理論,太專一細節每每看不到總體(又如同步性能設計再好,解調不出正確數據也是白搭,還不如多分配些時間精力給解調模塊)。
  • 不是作大項目就能學到東西的。偏偏相反,由於難以吃透大項目,因此只能按照別人的現有思路走,致使思惟固化。而作小東西更具靈活性,能夠充分發揮本身的想象力,尋求多種解決途徑。外面作了幾年大項目的人拿到新項目時,仍會感到無從下手;而老師接到新項目後,能馬上在腦海裏構建出各個功能模塊(「庖丁解牛」),緣由即在此。
  • 不要着急,一步一步來,別期望一口吃成胖子。不少時候工程作到必定程度了才能發現問題。你要作的就是經過項目學到能力,不必盡善盡美,說實話項目自己對你從此的工做幫助不大。
  • 本身的核心設計每每只佔工程的很小一部分,大部分工做在於工程的集成。
  • 把項目當成學習的好機會,而不是負擔,纔能有激情。
  • 保留本身的想法,接受並嘗試老師的想法而不是固守本身的方案——記住你是在「學習」,不是在「打工」!多向老師學習系統觀和作事方法。老師的工程經驗很豐富,總體化的系統思惟值得認真學習借鑑。不要怕和老師討論。伸手向老師要,老師纔會給你。
  • 請教老師前先說說本身的嘗試方案,由於老師有經驗一看便知如何入手;請教師兄們時則保留本身的方案,由於容易限制師兄們的思路。
  • 不討論、不提問、不向老師同窗請教學習,即便作出東西又有何用?你只是發揮了本身的水平而已,能力並未獲得提升!按本身的思惟而不是借鑑別人的好想法作工程,只是交差,能力得不到提升!
  • 工做後技術能夠是二流的,但作人應該是一流的。
  • 工程有忙有閒。忙的時候能忙得上,閒的時候能閒下來。一味地忙或閒都很差。
  • 不要屢教不改,總犯一樣的問題!
  • 不要太專一所作東西自己,而更要體會作事的過程。 

1.2 設計實踐

  • 數電思路 + 參考相關芯片設計
  • 不要想着先作出來再說——應該先討論肯定方案。隨時向老師彙報,排除系統原理結構上的設計失誤!策略性問題及時與老師討論,公式推導、器件操做等可本身驗證的則自行搞定。
  • 必須跳出本身的思惟約束,把握總體構架,肯定總體思路後再着手實現。最好先畫出波形圖,至少要有關鍵信號的時序關係。着手寫程序時能夠先寫出大致框架,而後完成和完善子模塊。
  • 設計時問一問本身:是否從工程的思惟入手?體會老師設計的控制模塊的優勢(先定總體時序,便於調試)。
  • 對照Matlab理論波形與示波器實際波形。不要知足於軟件仿真「正確」,要放到實踐中測試!相似地,電源等電器件不要直接拿來用,要實測一下電壓值。
  • 設計要具備必定的通用性和靈活性,如便於擴充或調試。

         模塊通用性:基本思想是作通用可擴展、特定功能的小「模塊」,而不要在後續階段爲加入功能而添加代碼。算法

         模塊就是你給我輸入,我給你想要的輸出,僅此而已,儘量不要讓我進行控制。網絡

         模塊化,減小耦合度,便於移植和調試。儘可能模塊化,可避免大的改動。框架

  • 在閱讀別人的程序時,遇到不肯定有無的地方,不要冒然刪減,應深刻思考其存在的理由,深刻畫圖分析(也利於別人理解和答辯申明)。
  • 在不瞭解系統全局的狀況下,先摸索後看手冊(前提是避免危險的操做)。在摸索嘗試中理解,切莫一開始就拿起手冊從頭看。先嚐試各類可能來解決問題,不要輕易下結論!作完後再回過來理解,不要「輕信」資料。好比調時AD開發板時,與其研究透徹每一個寄存器怎麼設置後再着手調,不如邊調邊試。一樣地,對於別人的東西既要吸取,又要質疑。不要由於那是別人作好的就認爲OK了,實際上可能有很嚴重的設計缺陷。
  • 利用別人的力量作出來纔是水平。當你看到別人的東西並很快領悟爲本身的東西纔是水平。先模仿後發展。多向別人請教想法!儘可能不要問具體問題,問思路才最重要。
  • 「反駁激將法」獲取別人的想法,集思廣益。多徵求想法,記在紙上。即便如今想法不成熟,之後也可能有用。外行也能提出新想法新思路。由於咱們的設計都是面向實際生活的,外行可能更清楚實際須要怎麼作——當局者迷,旁觀者清。好比我在用4點採樣作同步,而數據倒是8點採樣,還煞有介事地試圖找到精確的同步位置。假如說給搞圖像處理的人聽,人家的第一反應就是「這不可能」,由於同步「分辨率」不夠。後來纔在老師的啓發下改用兩個同步模塊解決了問題。
  • 思路靈活。作時定式,想時無定式。不要一根筋走到底,要考慮變通的方法。好比同步相關模塊以前用定製的元件altshift_tags,tap distance>=3,不得不進行時鐘三分頻。原先的想法是用時鐘來換取LE的減小(假設定製元件比本身編寫的節省資源——其實未必,考慮「通用性」),後來發現時鐘遠比LE重要。因此本身編寫了移存器模塊,能夠實現清零復位,tap distance等效爲1,免去了時鐘三分頻。

        【注】本身編寫的三分頻模塊在Modelsim裏會仿真出什麼結果呢?好比clk_sn由75M時鐘clk_sf三分頻產生,那麼仿真出來的clk_sn爲42ns的時鐘,而不是40ns(25M)——由於你所加的75M時鐘仿真激勵不可能很精確(13.333...ns)! 異步

1.3 論文

  • 每節開門見山,不要囉嗦。每章前面有摘要,後面有小結,承上啓下,既有條理又湊夠字數。
  • 仿真要多,儘可能多參數,反覆仿多個,得出結論!仿真分析等儘可能用一、二、3....條理化。
  • 圖表要多,摘要緒論及結束語必定要寫好,評審老師哪有工夫看理論。
  • 論文側重理論。理論上下功夫的論文容易經過(「新名詞」多)。許多評委都是理論出身,容易接受理論文章,故起評分高。偏工程類的論文除工程實現還必需要作理論部分,不然答辯時評委要問你除了「實現」還有什麼創新點呢?你的工做量(工程)人家不必定承認啊。
  • 將數據導出來在Matlab中觀察(如畫圖)每每能發現新問題甚至新思路。

         - 把FPGA仿真結果數據導入Matlab中,畫出Matlab理論曲線與FPGA仿真曲線比較(大數據量)編輯器

         - 提出一種想法後務必畫出理論比較曲線(有比較纔有說服力),過多的解釋說明倒不如圖表直觀。模塊化

         - 設計驗證機制工具

  • 不要寫得太細,給評委提問的餘地(大的方面讓評委以爲你水平挺高,思路清晰,有創新性;從細處一想又有不清楚處)——不然評委可能會問預料以外的問題! 

1.4 其餘

     勤寫報告:1. 保持進度; 2. 用於提問討論; 3.論文素材。佈局

     三種報告:post

     1) 給老師的報告:綜合、輪廓、總體思路——圖表化

     2) 給本身的報告:設計算法、心得經驗、調試細節

     3) 給接收人的報告:系統、思路、如何實現及該作哪些工做,便於迅速上手。

     之後發揮本身的能動性,天天向老師彙報進度——不是作了多少(太「虛」),而是具體完成了什麼!

     計劃、討論、彙報,講給老師聽。

     有問題必定寫文檔問老師,不要想着口頭說——這其實減小了仔細思考的過程。

 

二  測試調試

2.1 調試信念

     不合理的現象背後,必定有合理的緣由。只有抱定這一信念,才能解決調試中遇到的各類問題。與此相反的是:遇到不合理的現象,不是去尋求合理的解釋,而是猜測有一些不可控、不可證實的緣由。好比猜測綜合工具備bug,電路的信號完整性有問題,芯片過熱等。這樣一想,問題每每不了了之,調試也就半途而廢了。

     遇到問題首先思考什麼狀況下會產生此類問題,尋求可能緣由,而不是懷疑軟/硬件工具備問題。 

2.2 調試原則

  • 「遇到攔路虎必定要把它解決掉,不然往後碰到它你會更發怵」。不要回避問題,躲得過初一躲不過十五,早晚是要面對的——與其推倒重來,不如在初期就多加討論解決!
  • 從最簡單的開始調試,先肯定哪些模塊正確,哪些有問題,而不是整個工程拿來跑,指望某次會「碰巧」正確(尋找問題所在,而不是迴避問題)。
  • 按規程走,不要寄託於修改「好」的工程以求畢其功於一役。
  • 看起來最簡單最不會出錯的地方纔最容易出錯,反而複雜程序卻不多出致命問題!
  • 最基本的「常識」——不工做時各個寄存器(尤爲是使能信號和計數器)都要復位! 

2.3 調試技巧

  • 「隔離」(迴路之間加入不一樣的延遲單元,測試時序是否知足)、「直通」(模塊直連,如調製數據直接送往解調模塊——bypass同步)。
  • 設計時就應該寫好測試比較模塊。一是軟件比較,如Quartus II仿真結果與Matlab理論結果比較,或Modelsim結果(testbench)輸出至Matlab中與理論結果畫圖比較。二是硬件比較,如可把待調製數據寫入FIFO,當解調數據輸出時同時讀該FIFO並進行比較,若是對應位不一樣則輸出ERROR高電平(此法也可用來判斷兩個模塊是否實現徹底相同的功能)。後者在上板子後可用邏輯分析儀捕捉ERROR信號(觸發),注意「Trigger」|「Trigger position」項選擇「Post trigger position」,這樣能夠捕捉到出錯前的信號。
  • 高效率:多建工程備份(面積換速度),這樣能夠馬上調試正確版本。
  • 將已經基本調試成功的工程備份至另外的目錄,而且每一個工程屬性改成「只讀」,防止無心中誤操做修改了正確版本。——保留備份!
  • 當前正確工程備份後,在此基礎上逐步添加新模塊。
  • 及時給程序加註釋,便於理解;及時寫調試文檔,重點記錄錯誤點,避免重犯(還有一種狀況就是後面想到某個曾被部分否認的方法,殊不知道哪裏須要注意)。
  • 將中間結果尤爲是關鍵信號的波形截圖保存在word中,能夠方便對照!
  • 逐個模塊調試,Modelsim大數據量仿真(尤爲注意兩段數據之間的使能信號及計數器的狀態),示波器觀察波形(週期,相位...尤爲注意不要出現長時間的直流或跳變)。找到出錯的地方,看其與哪些變量直接相關,而後由出錯位置出發,觀察這些變量甚至它們的相關變量,逆向一步步尋找出錯緣由。
  • 用已知在別人機器上正確的工程去檢驗本身的軟件環境,而不是從頭新建工程trial and error!
  • 先從最簡單的功能,最簡單的數據(如方波)作起。先測試最基本的信號(如時鐘)。輸入特殊值觀察規律。
  • 若某個reg信號在仿真時波形不正常,可試着將其設爲輸出output(改變佈線)從新仿真。
  • 合理地使用拼接符能夠提升程序的可讀性和可維護性。使用拼接能夠把多個信號的某些位拼接起來進行運算操做。它使用簡單,方便閱讀,感受不錯。特別對應物理實現時就是將相關的位線對應鏈接起來便可,物理實現比較簡單。 

2.4 易錯處

  • 仿真輸入數據有誤或不合理。
  • 仿真時序有問題,包括時鐘週期、時鐘相位對齊、時鐘與使能信號及其指示的輸入/輸出之間的位置關係等等。
  • 變量位寬不夠,致使溢出。相似的還有FIFO存儲空間設置太小。
  • v文件中參數值修改後,對應的bdf文件中符號參數值卻未改變。
  • 例化模塊時常常位置、端口關聯混用,致使出錯。
  • …… 

2.5 特別注意

  • 仿真時特別注意時鐘,有沒有加時鐘或給時鐘脈衝,或者時鐘週期是不是預期的(這點上的粗心每每致使仿真「不正確」)。
  • Modelsim仿真時,全部的寄存器必須有清零/復位處理(如Clr),不然默認值爲不定態(Quartus中默認值爲0)。
  • 將上級模塊的輸出波形複製做爲下級模塊的輸入時,要特別注意數據是否正確複製,以及與時鐘的相對位置是否可靠,大數據量的複製每每可能產生波形「失真」。
  • 編譯時把Message框拉開,觀察warning,每每會發現程序中的一些小疏漏,及時中止編譯,可節省大量時間。
  • if判斷語句必須注意判斷表達式變量的起始值(復位)!全部使能/指示信號必須保證起始端符合要求!
  • 先保證時序,後保證數據!時序錯了,數據對告終果也是錯的;數據錯了但時序正確,調整時序便可。時序仿真結果不正確,除了懷疑不知足tsu時序要求外,還應注意輸入數據是否正確無誤!若是仿真結果不合乎要求,應對波形數據進行分析,每每會找到問題所在,不要盲目地修改程序,要知道編譯比仿真更費時。分析數據時要首尾兼顧,還應注意數據對齊關係----每每這個影響內部計數器的工做,從而致使結果出錯。除了比較數據外,還要確保數據長度正確無誤。
  • 接口規範:if...else配套,begin...end對齊,不要追求「新穎」的風格,要便於和別人程序對接。模塊編譯成功後生成直觀的原理圖符號.bdf文件,便於修改管理和交流。

 

三  其餘

3.1 FPGA基本設計流程

     1) 設計目標分析

     主要肯定芯片應當完成哪些基本功能,以及分析將來可能要增長的功能。注意選擇器件時要留有足夠的設計餘量,以保證從此升級時單板不會所以而修改。

     2) 功能模塊劃分

     讓設計井井有條條理清晰。另外在肯定功能模塊劃分過程當中,能使設計者在整體上考慮芯片的各個問題,發現一些比較深層次的問題。

     3) 肯定關鍵電路時序和模塊間接口時序(整體方案)

     事實上,在功能模塊劃分過程當中就必須考慮時序方面的問題。有時,在肯定設計目標時就得考慮關鍵電路時序。

     在此前的設計過程當中,咱們是將項目設計進行功能分解以後,馬上着手子模塊具體電路設計,最後再進行系統聯調,出現問題了再去更改設計。這是在湊電路,而不是在設計電路。

     設計電路,尤爲是數字電路,最關鍵的一環就是:設計各模塊間的接口時序,肯定關鍵電路的時序。在作整體方案時,應深刻到模塊間的時序劃分,關鍵電路的時序肯定,並以此做爲指導來進行設計。

     「時序是事先設計出來的,而不是過後測出來的,更不是湊出來的。」

     4) 具體電路設計(並寫出詳細設計文檔)

     在進行模塊設計時,應先畫出每一個模塊的原理結構,然後畫出其工做原理時序圖,在工做原理時序圖的指導下進行具體電路設計。即「先時序後電路」的設計方法。在條件容許範圍內,儘可能用集成度高的電路語言直接表述。

     設計流程:明確模塊的原理功能-->畫出時序圖-->(映射爲邏輯電路)-->用硬件語言描述時序圖(或電路映射圖)——先時序後電路!

     5) 調試驗證(仿真測試方案)

     設計時就應該作好測試驗證機制。咱們目前所採用的驗證機制爲「隔離」(迴路之間加入不一樣的延遲單元,測試時序是否知足)、「直通」(模塊直連,如調製數據直接送往解調模塊——bypass同步)。示意圖以下:

     其中延遲單元Delay Unit結構以下:

 

3.2 同步電路的設計規則(僅供參考)

  • 儘量在整個設計中只使用一個主時鐘,同時只使用同一個時鐘沿。主時鐘走全局時鐘網絡。
  • 在FPGA設計中,推薦全部輸入輸出信號均應經過寄存器寄存,寄存器接口看成異步接口考慮。
  • 當所有電路不能用同步電路思想設計時(即須要多個時鐘來實現),則能夠將所有電路分紅若干局部同步電路。儘可能以同一個時鐘爲一個模塊,局部同步電路之間接口看成異步接口考慮。
  • 當必須採用多個時鐘設計時,每一個時鐘信號的時鐘誤差要嚴格控制。
  • 電路的實際最高工做頻率不該大於理論最高工做頻率,留有設計餘量保證芯片可靠工做。
  • 電路中全部寄存器、狀態機在單板上電覆位時,應處在一個已知的狀態。

     因爲時鐘創建-保持時間的限制,FPGA設計中應儘可能避免採用多時鐘網絡,或儘可能減小時鐘的個數。儘可能避免採用多個時鐘,多使用觸發器的使能端來解決。

     爲了不異步的時鐘域產生錯誤的採樣電平,通常使用RAM、FIFO存儲的方法完成異步時鐘域的數據轉換,在輸入端口使用上一級時鐘寫數據,在輸出端口使用本級時鐘來讀數據,可以很是方便地完成異步時鐘域之間的數據交換。

     處理速度與面積問題的原則:向關鍵路徑部分要時間,向非關鍵路徑部分要面積。爲了得到更高的速度,應當儘可能減小關鍵路徑上的邏輯級數;爲了得到更小的面積,應當儘可能共享已有的邏輯電路。

     以寄存器爲邊界劃分工做模塊。在設計較大規模的電路時,分模塊設計是必不可少的,在各模塊經過以後再進行系統的聯調。但因爲在單模塊調試和聯調時佈線資源的佔用緊張程度不一樣,使得每一個模塊的輸出沒法保持與單獨佈線時相同,在聯調時形成困難。若是每個模塊的輸出端口都採用寄存器輸出,那麼即便在總體佈局佈線後,各模塊的輸出依然能夠保證原來的時序,這使得聯調的工做效率大大提升。加入這些寄存器也使得電路的可測性有所提升。 

3.3 Quartus功能仿真流程

     1) 將HDL文件或bdf文件設爲頂層

     2) Processing | Start | Start Analysis & Synthesis及Start Fitter生成post-fitting節點

     3) 創建vwf波形文件加入節點和激勵

     4) Simulation Tool | Functional | Generate Functional Simulation Netlist | Start

     修改v文件後再次仿真時,只須要Generate Functional Simulation Netlist便可。而生成網表後,除從新編譯源文件外,每次修改.vwf波形後都沒必要從新生成網表。

     功能仿真時不計入器件延時,但通過寄存器後必產生一個週期的「延時」,這不一樣於器件延時,由於它本質上與時鐘節拍相關,並不是器件或佈線固有延時。

     Quartus仿真時最好讓CLK有效沿採到輸入數據的中間(穩定),這樣不管Functional仍是Timing仿真,都不會出現採樣問題。若是輸入數據在CLK有效沿變化,則Functional仿真會向後採,而Timing仿真會向前採。中間變量均向前採。彷佛Quartus功能仿真時默認降低沿鎖存數據,上升沿驅動輸出,而modelsim均取上升沿。

     End Time儘可能設大一些,省得輸出延時太大致使波形顯示不全,而從新設置初始化文件既不方便又容易出錯。固然End Time大了,仿真時間會長一點,但總好過因End Time不夠而被迫從新編輯波形。End Time比較大時,時間軸Time bar的移動很不方便,能夠在波形須要讀取座標處右鍵「Insert Time bar」。若是此前已有其餘Time bar,則在新Time bar(虛線)上右鍵「Make Master Time bar」設爲主座標(實現),即可經過鍵盤「←」、「→」鍵調整座標位置。記錄下目標點的大體座標,觀察時直接拖動水平滾動條更快。直接在信號波形上雙擊,便可選中整個波形。選擇一段波形,再鼠標滾輪放大,則以選中波段爲中心顯示放大。Tools|Options|Processing裏能夠設置仿真輸出格式爲vwf、cvwf或vcd。

     v文件設爲頂層後File-->Create/Update...便可生成symbol,但建議先作...Elaboration過濾語法錯誤。bdf文件更新及轉HDL文件時無需設爲頂層。改變源文件端口次序可以使生成的符號易於連線。bdf生成的HDL文件智能化不夠,底層模塊修改參數後注意要在HDL中必定要改過來!

     在圖表文件裏雙擊symbol能夠打開其對應的v文件或bdf文件或Select對話框。若是同時還有對應的vwf文件加入工程,也會將其列入對話框中。

     在Quartus裏打開已鎖定管腳的圖表文件,有時會發現未顯示管腳,這時需將該圖表文件設爲頂層文件(注意從Project Navigator中剔除與其對應或重名的.v文件),再Start Analysis and Elaboration便可在圖表文件中顯示已分配過的管腳。

     用MegaWizard定製元件,其實只需生成.v和.bsf兩種格式的文件。除非定製ROM(需指定內存初始化文件),不然相似的宏單元不必重複定製,其實只需例化名不一樣便可。好比常常要定製I、Q兩路的FIFO,其實只需定製一個,在例化名裏標識出I、Q便可。在Project Navigator-->Hierarchy裏宏單元名上右鍵「MegaWizard Plug-in Manager」或直接雙擊,可打開宏單元編輯器修改定製元件。若是Hierarchy 不能展開,設置頂層並Start Analysis and Elaboration便可。

     Quartus II中止響應時,直接關掉重啓。若是上次編譯後未作修改,則從新打開工程後沒必要再編譯一遍。但不要由於編譯後從新打開工程沒必要再次編譯,而沒必要要地重啓工程或重啓Quartus。由於重啓後再也沒法Undo此前所作的修改了,而這可能帶來很是大的麻煩。 

3.4 Quartus中調用Modelsim作仿真

     1) 功能仿真

     將圖表文件轉換爲HDL文件,而後將.v文件加入工程並設爲頂層(同時剔除.bdf文件),在Settings裏設置testbench路徑,Start Analysis and Elaboration無誤後Run EDA RTL Simulation,不然會出現Module 「xxx」 is not defined的錯誤。

     2) 時序仿真

     步驟基本同上,只不過最後要選Run EDA Gate Level Simulation。

     仿真ROM時,要將.hex文件放置在simulation/modelsim目錄下。

     Modelsim中顯示模擬波形:信號名上右鍵「Properties」-->「Format」-->「Analog」選項卡,Height設爲50(默認17),Offset設爲0,Scale設爲0.1。

     若是你的程序複雜,時鐘頻率高,測試向量多都會致使較長的Modelsim仿真時間,這是難以免的。固然有一些小技巧能夠在必定程度上縮短仿真時間(不考慮是否改善計算機硬件配置)好比設計的工做時鐘頻率爲80MHz,即週期爲12.5ns,原則上同步時序電路進行功能仿真的時間步進單位就是6.25ns,timescale爲0.01ns由於同步時序邏輯通常都只使用時鐘的上升沿 因此不須要嚴格要求時鐘其餘指標的具體實現 這樣就能夠把時鐘信號設置爲非1:1的佔空比 即高電平6.5ns 低電平6ns 此時的timescale變爲0.1ns 仿真速度能夠加快一些 另外若是經過讓testbench輸出仿真結果文件而不是直接察看波形窗口的話 仿真速度可有較明顯提升。

     timescale在仿真的時候須要注意:

     1) 若是不設置,modelsim默認1ps/1ps,vcs默認1s/1s

     2) 可經過printtimescale打印出來指定模塊的timescale,以下

1 Initial begin
2    $printtimescale(modulenume);
3 end

     3) timescale 與`resetall成對使用

     不要Load「projectname_run_msim_rtl_verilog.do」,不然會從新編譯庫。 

3.5 SignalTap II

     SignalTap II在加入Pre_synthesis Node以前,只需知道有哪些Node便可,並不須要作Fitter和Assembler。只需Start | Start Analysis and Elaboration便可,等加完Node後再作Start Compilation,這樣可減小一次編譯的時間。

     post-fitting用於選擇增量編譯時,而pre-synthesis用於非增量編譯時。

     逮數據時只把Start觸發沿設爲rising edge。先Run邏輯分析儀,而後瞬間按下清零鍵,就能夠逮到Start變高時的數據。

     使用Signaltap II嵌入式邏輯分析儀時,注意採樣深度不要設置過大,由於stp文件是要加入工程的,採樣RAM佔用了器件很大一部分memory bits。

相關文章
相關標籤/搜索