本文主要分享研究生期間所學到的一些科研和項目經驗,實踐部分偏重於硬件電路。點滴瑣碎,還請見諒。前端
模塊通用性:基本思想是作通用可擴展、特定功能的小「模塊」,而不要在後續階段爲加入功能而添加代碼。算法
模塊就是你給我輸入,我給你想要的輸出,僅此而已,儘量不要讓我進行控制。網絡
模塊化,減小耦合度,便於移植和調試。儘可能模塊化,可避免大的改動。框架
【注】本身編寫的三分頻模塊在Modelsim裏會仿真出什麼結果呢?好比clk_sn由75M時鐘clk_sf三分頻產生,那麼仿真出來的clk_sn爲42ns的時鐘,而不是40ns(25M)——由於你所加的75M時鐘仿真激勵不可能很精確(13.333...ns)! 異步
- 把FPGA仿真結果數據導入Matlab中,畫出Matlab理論曲線與FPGA仿真曲線比較(大數據量)編輯器
- 提出一種想法後務必畫出理論比較曲線(有比較纔有說服力),過多的解釋說明倒不如圖表直觀。模塊化
- 設計驗證機制工具
勤寫報告:1. 保持進度; 2. 用於提問討論; 3.論文素材。佈局
三種報告:post
1) 給老師的報告:綜合、輪廓、總體思路——圖表化
2) 給本身的報告:設計算法、心得經驗、調試細節
3) 給接收人的報告:系統、思路、如何實現及該作哪些工做,便於迅速上手。
之後發揮本身的能動性,天天向老師彙報進度——不是作了多少(太「虛」),而是具體完成了什麼!
計劃、討論、彙報,講給老師聽。
有問題必定寫文檔問老師,不要想着口頭說——這其實減小了仔細思考的過程。
不合理的現象背後,必定有合理的緣由。只有抱定這一信念,才能解決調試中遇到的各類問題。與此相反的是:遇到不合理的現象,不是去尋求合理的解釋,而是猜測有一些不可控、不可證實的緣由。好比猜測綜合工具備bug,電路的信號完整性有問題,芯片過熱等。這樣一想,問題每每不了了之,調試也就半途而廢了。
遇到問題首先思考什麼狀況下會產生此類問題,尋求可能緣由,而不是懷疑軟/硬件工具備問題。
1) 設計目標分析
主要肯定芯片應當完成哪些基本功能,以及分析將來可能要增長的功能。注意選擇器件時要留有足夠的設計餘量,以保證從此升級時單板不會所以而修改。
2) 功能模塊劃分
讓設計井井有條條理清晰。另外在肯定功能模塊劃分過程當中,能使設計者在整體上考慮芯片的各個問題,發現一些比較深層次的問題。
3) 肯定關鍵電路時序和模塊間接口時序(整體方案)
事實上,在功能模塊劃分過程當中就必須考慮時序方面的問題。有時,在肯定設計目標時就得考慮關鍵電路時序。
在此前的設計過程當中,咱們是將項目設計進行功能分解以後,馬上着手子模塊具體電路設計,最後再進行系統聯調,出現問題了再去更改設計。這是在湊電路,而不是在設計電路。
設計電路,尤爲是數字電路,最關鍵的一環就是:設計各模塊間的接口時序,肯定關鍵電路的時序。在作整體方案時,應深刻到模塊間的時序劃分,關鍵電路的時序肯定,並以此做爲指導來進行設計。
「時序是事先設計出來的,而不是過後測出來的,更不是湊出來的。」
4) 具體電路設計(並寫出詳細設計文檔)
在進行模塊設計時,應先畫出每一個模塊的原理結構,然後畫出其工做原理時序圖,在工做原理時序圖的指導下進行具體電路設計。即「先時序後電路」的設計方法。在條件容許範圍內,儘可能用集成度高的電路語言直接表述。
設計流程:明確模塊的原理功能-->畫出時序圖-->(映射爲邏輯電路)-->用硬件語言描述時序圖(或電路映射圖)——先時序後電路!
5) 調試驗證(仿真測試方案)
設計時就應該作好測試驗證機制。咱們目前所採用的驗證機制爲「隔離」(迴路之間加入不一樣的延遲單元,測試時序是否知足)、「直通」(模塊直連,如調製數據直接送往解調模塊——bypass同步)。示意圖以下:
其中延遲單元Delay Unit結構以下:
因爲時鐘創建-保持時間的限制,FPGA設計中應儘可能避免採用多時鐘網絡,或儘可能減小時鐘的個數。儘可能避免採用多個時鐘,多使用觸發器的使能端來解決。
爲了不異步的時鐘域產生錯誤的採樣電平,通常使用RAM、FIFO存儲的方法完成異步時鐘域的數據轉換,在輸入端口使用上一級時鐘寫數據,在輸出端口使用本級時鐘來讀數據,可以很是方便地完成異步時鐘域之間的數據交換。
處理速度與面積問題的原則:向關鍵路徑部分要時間,向非關鍵路徑部分要面積。爲了得到更高的速度,應當儘可能減小關鍵路徑上的邏輯級數;爲了得到更小的面積,應當儘可能共享已有的邏輯電路。
以寄存器爲邊界劃分工做模塊。在設計較大規模的電路時,分模塊設計是必不可少的,在各模塊經過以後再進行系統的聯調。但因爲在單模塊調試和聯調時佈線資源的佔用緊張程度不一樣,使得每一個模塊的輸出沒法保持與單獨佈線時相同,在聯調時形成困難。若是每個模塊的輸出端口都採用寄存器輸出,那麼即便在總體佈局佈線後,各模塊的輸出依然能夠保證原來的時序,這使得聯調的工做效率大大提升。加入這些寄存器也使得電路的可測性有所提升。
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。