久不見我,我又回來了,哈哈哈哈。
這么取名字,大概率會被人家笑話吧,一個呆頭呆腦哈里哈氣的憨厚形象躍然紙上。不過呢,仗著自己臉皮不薄,又被人稱為IT直男,也就這么寫了。
自己是從2014年開始,每天和FPGA打交道的,剛開始嘛,做的都是入門級的功能,寫的都是入門級的程序,跑跑VGA、寫寫SPI也就差不多了,如果用到SDRAM,也頂多跑個100MHz到頂了(雖然這個頻率不高,但是不注意設計,即使是100M也有跑不動的時候),很少有關注性能的。
雖然不關注性能,但是也還是遇到過很多次因為性能問題導致設計不穩定的情況,典型的例子就是之前有開發一個基于CY7C68013芯片的USB傳輸模塊,寫出來的程序,在不同的板子上工作,有的能正常通信,但是有的在通信過程中就會出現數據誤碼的情況,比如理論上連續的兩個數據應該是0x5555,0xAAAA,但是實際收到的時候,可能就變成了0x5555,0xEAAA。
后來在基于CYUSB3014的USB3.0芯片上也同樣遇到了這個問題,網友用我們的板子,用我們的程序一切都OK,但是把程序移植到自己的板子上去,就會經常出現誤碼的問題。網友很無語,我也很無奈(PS:這些問題現在都已經幫客戶解決了,毋庸擔心)。
再有一個典型的例子就是,使用ADV7123芯片完成數字RGB時序到模擬VGA信號的轉換時候,必須要將輸送給ADV7123芯片的時鐘信號先取反再輸出,否則當在VGA顯示屏上顯示時,就會出現圖像的輪廓處出現大量雜色的情況(不知道自己是不是可以用這個思路去做個輕量級的邊緣檢測系統,哈哈),不僅僅是ADV7123 轉VGA,即使是普通的RGB接口的TFT屏,買回來的液晶廠家不一樣,批次不一樣,也會存在這樣的現象。到最后就是,同一個程序,用在不同批次的顯示屏上,有的需要將輸出時鐘先取反,有的又不能取反。且不說客戶使用體驗,就是自己,看到這種現象,也是鋼牙崩碎不能忍。
所以,這一切的一切,問題到底在哪里呢?當時的我就知道,答案是時序出了問題。可是,問題該怎么去解決呢?
一提起時序,又想起了經常就會有網友跑過來問我,基本原話就是“小梅哥,我現在準備開始學習FPGA了,但是聽別人說,做FPGA開發,最重要的就是時序,請問您有時序方面的資料嗎?“這樣的問題,幾乎每年都會遇到幾次,問題內容驚人相似,我的答案也是驚人的客(可)氣:沒有。
為啥這么回答呢?一是因為哪怕是在不久之前(或者說寫本文之前),我都確實是真的沒有這方面的資料,或者說沒有能拿得出手的資料,所以不怕丟面子,實話實說羅,可以說,到目前為止,網上能找到的真正能夠讓人一看就懂,真正能用的時序處理方面的資料確實比較的少,希望通過網絡博文之類的學會時序分析和約束的細節方法,難度很大;二是我認為,剛開始學習FPGA,一上來就問時序這些東西,有點心高急躁,要學會FPGA,在時序之前,還有超級多的東西要學習呢,FPGA可編程原理、Verilog基本語法、基于FPGA的系統設計常見方法、調試技巧、驗證手段等,這些不學好,時序的資料看十遍也不一定能消化的掉。第三嘛,則是感覺大家的認知可能有一定的偏差,單就“時序”這兩個字來說,其涉及的內容還是比較廣的,從簡單的說,UART協議里面,一個起始位、8個數據位、1個停止位可以算作是時序定義了(當然這里更應該說是協議的時序),一個DAC芯片,使用SPI接口,MOSI接口上輸出16位數據,高4位為控制字,低12位為需要輸出的電壓值的數字編碼也可以算作是時序(畢竟器件的規格書里面用的是timing這個詞)。再到FPGA里面最關心的,觸發器的輸入端口的數據,需要在時鐘信號上升沿之前多久穩定下來(setup time),需要在時鐘信號上升沿之后再保持多久的穩定狀態(hold time),這些都是時序。而我們在進行FPGA系統設計的時候,開發過程的大部分時間都是在和簡單的協議時序打交道。單純的問一個時序方面的資料,我也確實不知道他關心的是哪個時序(我猜他們想問的實際應該是D觸發器的建立時間,保持時間之類的時序吧)。
作為一個別人口中“賣板子”的人,我本來沒有必要去做這些事情,只需要服務好我的客戶,然后做一堆大家覺得好玩兒的例子,讓大家在我們的板子上能夠體驗到更多的功能,我的板子也就不愁銷量了。事實上,在曾經長達一年半的一段時間里,我確實是這樣,每天都是在寫例子,發“教程文檔”。但是最后發現,自己做的事情,大部分都是服務于本科畢業設計的,而非真正的FPGA開發人員。對于那些FPGA開發人員提出的問題,我往往并不能給出直接的解答。所以,在那之后的近一年時間里,我在網絡上發的東西少了,就像是轉行了一樣,好幾次都有網友直接發消息問我最近在忙啥呢,好久都沒看到我出新東西了,而我的統一回復都是——學習。
前段時間和一位一直關注關心我的大學老師聊天,他也提到了我最近“產量”下降的問題,說是好久沒有看到我出教程文章了。我苦笑著說,不是我懶了,而是我不敢輕易出東西了,因為一個行業做的越久,就越會發現自己知之甚少,然后回顧自己之前寫過的文章,出過的所謂的“教程”,總有疏漏和不完善的地方。所以我現在,幾乎是把大量的時間都花費在自己學習上,很多知識,邊學邊練,今天剛做好的筆記,明天再繼續調試的過程中,又發現了不完善或者遺漏的地方,然后心里暗自竊喜,幸虧沒有發出去給客戶當”教程”。我相信通過這樣的長期練習,總能量變引起質變,總有一天我能打通自己的任督二脈,對一個東西有較為正確的認知。
所以,以后我大概率是不敢打著“教程”的旗號發布任何東西了,而是以一種很低的姿態,以一個學習者的姿態分享自己的筆記。通過筆記的方式,將自己的一些領悟發表出來,和網友一起學習,一起討論,一起進步。
好了,不能再扯了,再扯就真的跑題了,言歸正傳。
我一直希望,通過自己的學習和筆記,讓每個關心“FPGA時序設計”的人能夠真正的理解時序分析和約束的本質。讓他們能夠通過閱讀我自己分享的心得,學會一點點時序分析和約束的方法。為此,我從去年12月開始,就一直在進行時序方面的學習,到現在也差不多半年時間了。半年里,每當我通過時序分析,時序約束的方式解決一個問題,我都會為之欣喜,我學好“時序”的心也就更加堅定一點。如今,把這些經歷以圖文的形式總結歸納下來,一是給自己的知識做一個記錄,方便日后需要的情況下再翻看;二是希望有需要的網友能夠通過我自己的筆記找到哪怕一丁點思路;三嘛,也是怕長時間不冒個泡,怕大家忘了我。
感謝大家看我扯了半天不痛不癢毫無營養的廢話,好了,預知后事如何,且聽下回分解。(下節預告:(二)時鐘質量是生命——初遇時序)