单片机 FPGA
版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。
???????有的學(xué)校先教匯編,再教C,但我認(rèn)為,先學(xué)C,再到匯編會比較好,因為匯編枯燥難學(xué),導(dǎo)致單片機還沒用起來,興趣就消減一大半了。正如linus那句話,你得先學(xué)會使用它。一、首先掌握C語言語法。
??????單片機用的C語言叫C51,C51除了標(biāo)準(zhǔn)C的語法之外,還特意為單片機增添了幾個語法而已,沒有很大區(qū)別,那么我們可以裝個Visual Studio(別再用VC6.0那個老掉牙的IDE啦)然后,隨便找本語法書抄代碼,模仿寫,不看書做出課后習(xí)題就可以了,其中流程控制(包括if,for,while,switch等)以及指針和結(jié)構(gòu)體都是需要掌握的。沒有特別需要推薦的教材,可以在youku看教學(xué)視頻,也可以看看譚浩強的《C語言程序設(shè)計》,入門是沒問題的,雖然有很多bug。
二、學(xué)會操作寄存器。
??????單片機工程師又叫固件工程師,因為他們寫的代碼都是跟寄存器打交道,而寄存器又可以直接控制硬件,處于最底層的軟件,所以叫固件。這部分需要數(shù)電、模電的基礎(chǔ)才好理解,所以在大學(xué)都是先教數(shù)電、模電再教單片機的。這里你需要買一塊單片機開發(fā)板,上淘寶淘一塊就可以,但不要買那些芯片又少又貴的(板子上留有很多接口的那種,要你另外買模塊才能做那些實驗的),那些板子都是坑新手的。教程推薦看郭天祥的《十天學(xué)會單片機》,但是只能入門。此外,需要裝個Keil C51軟件編譯代碼以便下載到單片機里面。這里重點掌握定時器和串口。
三、養(yǎng)成良好的編碼習(xí)慣。
??????在《十天學(xué)會單片機》里會出現(xiàn)眾多不怎么好的代碼,但是我們不能一下寫出優(yōu)秀的代碼,必須有個過渡期,所以建議大家先看郭大俠的視頻。那么如何寫出高效而且可讀性好的代碼呢?以后再寫文章介紹,這里只提到一點,不要用拼音來命名變量或者函數(shù)名,像int shi,fen,miao;這些都是不良的編碼習(xí)慣,必須全部使用英文命名。推薦的做法就是多參考大神們寫的代碼,在百度文庫或者各大電子論壇都可以看到很多優(yōu)秀的代碼。此外,推薦一個PDF——《從單片機初學(xué)者邁向單片機工程師》。
四、適量的實踐。
??????接下來,你可以用單片機做一些小玩意了,譬如:搖搖棒,光立方,密碼鎖,超聲波測距,紅外搖控等等(很多新奇有趣的小玩意都可以在論壇找到)。當(dāng)然,也不需要每個都做,我們可以選一些差異性較大的來做,這樣升級會快一些。推薦的教材是《單片機c語言程序設(shè)計實訓(xùn)100例——基于8051+proteus仿真》。
-----就算你能通過上面四個關(guān)卡,也只能達到操作工的水平而已,接下來的才是主題-----
五、深入理解單片機的工作原理。
??????現(xiàn)在你要用匯編語言來玩單片機,你會發(fā)現(xiàn)匯編比較棘手,寫出來的代碼可讀性差、可移植性差而且很難維護,但匯編即讓你很清晰地感受到單片機是如何工作的,以及理解C語言指針的原理。不過,我們不需要鉆研匯編語言,只需要有所了解,并且要達到C和匯編混合編程就可以了。混合編程是單片機的精髓所在,比如,精準(zhǔn)的延時、相對耗時的算法用匯編實現(xiàn),而其它邏輯用C語言實現(xiàn)。即使是嵌入式,也是匯編和C混編的。推薦的教材是周航慈的《單片機應(yīng)用程序設(shè)計技術(shù)》
六、自制單片機最小系統(tǒng)。
??????自己用洞洞板焊一塊單片機最小系統(tǒng),這事也不難,隨隨便便都能弄出來,有錢做PCB更好,沒錢可以做感光板或者用雕刻機刻一塊。主要掌握焊接、維修、PCB等基本功,上youku看看視頻,自己多動手就能掌握的。
七、單片機外面的世界。
??????就算你現(xiàn)在能玩轉(zhuǎn)單片機,但也只是打開了一扇小小的窗戶而已,下面你可以選一個方向,但是工作中可以會用到幾個方向的知識,反正盡量多學(xué)點。
1、操作系統(tǒng)。其中51單片機可以跑TINY OS和Small RTOS,要跑ucos,freeRTOS的話,建議用高檔一點的單片機。推薦學(xué)ucos,教材是任哲的《嵌入式實時操作系統(tǒng)ucosII原理及應(yīng)用》
2、上位機。使用單片機采集信號送到PC機上面,而PC機需要一個上位機來控制單片機,這個上位機可以用Labview、C++、C#、JAVA、甚至是HTML、CSS、JAVAScript來寫。其中最常用的是單片機跟PC機的串口通信,上位機建議用Labview、C#,或者QT來寫,盡管還有很多企業(yè)用MFC(C++庫),但是MFC上手比較難。其中Labview是最為簡單的一種上位機,推薦的教材是《Labview寶典》
3、算法。因為單片機處理速度慢,所以能實現(xiàn)的算法也不多,推薦的教材是周航慈的《嵌入式系統(tǒng)軟件中的常用算法》
4、接口應(yīng)用。單片機的內(nèi)部資源比較少,很多時候需要外接一些芯片、傳感器。這里需要到用模電、電子測量、計算機網(wǎng)絡(luò)等知識。推薦的教材是陳尚松等著的《電子測量與儀器》和謝希仁的《計算機網(wǎng)絡(luò)》。此外,還會用到一些通信模塊,比如USB、Zigbee、WIFI、藍(lán)牙等(這些芯片一般內(nèi)置增強型的51核),有興趣可以弄一下,這些都是比較實用的技術(shù)。
題外話:
??????如果要徹底理解單片機的工作原理的話,那就得學(xué)《計算機組成原理》和FPGA了,FPGA的學(xué)習(xí)路線可以參考本博客的《如何學(xué)習(xí)FPGA》。
??????你要是學(xué)完上面講的那些,那就可以進一步學(xué)嵌入式了。很多電子專業(yè)的學(xué)生就感覺嵌入式很難,那是因為嵌入式涉及很多計算機領(lǐng)域的知識,而這些知識很多是電子專業(yè)不開課的,基本功沒過關(guān),學(xué)起來肯定吃力。具體的學(xué)習(xí)路線可以參考本博客的《如何學(xué)習(xí)嵌入式軟件》。
??????說到這里,其實單片機能做的事情也不多,但它卻是電子專業(yè)最為重要的核心課程之一,可以說每位電子工程師都必須掌握單片機,并用它來解決工程上的實際問題。
FPGA
PS:筆者強烈建議諸位注冊一個EETOP的賬號,每天簽到或者發(fā)貼、回貼就有積分了,里面的資源非常豐富,各種軟件、資料都能找到。
一、入門首先要掌握HDL(HDL=verilog+VHDL)。
???????第一句話是:還沒學(xué)數(shù)電的先學(xué)數(shù)電。然后你可以選擇verilog或者VHDL,有C語言基礎(chǔ)的,建議選擇VHDL。因為verilog太像C了,很容易混淆,最后你會發(fā)現(xiàn),你花了大量時間去區(qū)分這兩種語言,而不是在學(xué)習(xí)如何使用它。當(dāng)然,你思維能轉(zhuǎn)得過來,也可以選verilog,畢竟在國內(nèi)verilog用得比較多。
???????接下來,首先找本實例抄代碼。抄代碼的意義在于熟悉語法規(guī)則和編譯器(這里的編譯器是硅編譯器又叫綜合器,常用的編譯器有:Quartus、ISE、Vivado、Design Compiler?、Synopsys的VCS、iverilog、Lattice的Diamond、Microsemi/Actel的Libero、Synplify pro),然后再模仿著寫,最后不看書也能寫出來。編譯完代碼,就打開RTL圖,看一下綜合出來是什么樣的電路。
???????HDL是硬件描述語言,突出硬件這一特點,所以要用數(shù)電的思維去思考HDL,而不是用C語言或者其它高級語言,如果不能理解這句話的,可以看《什么是硬件以及什么是軟件》。在這一階段,推薦的教材是《Verilog傳奇》、《Verilog HDL高級數(shù)字設(shè)計》或者是《用于邏輯綜合的VHDL》。不看書也能寫出個三段式狀態(tài)機就可以進入下一階段了。
?????? 此外,你手上必須準(zhǔn)備Verilog或者VHDL的官方文檔,《verilog_IEEE官方標(biāo)準(zhǔn)手冊-2005_IEEE_P1364》、《IEEE Standard VHDL Language_2008》,以便遇到一些語法問題的時候能查一下。
二、獨立完成中小規(guī)模的數(shù)字電路設(shè)計。
???????現(xiàn)在,你可以設(shè)計一些數(shù)字電路了,像交通燈、電子琴、DDS等等,推薦的教材是《Verilog HDL應(yīng)用程序設(shè)計實例精講》。在這一階段,你要做到的是:給你一個指標(biāo)要求或者時序圖,你能用HDL設(shè)計電路去實現(xiàn)它。這里你需要一塊開發(fā)板,可以選Altera的cyclone IV系列,或者Xilinx的Spantan 6。還沒掌握HDL之前千萬不要買開發(fā)板,因為你買回來也沒用。這里你沒必要每次編譯通過就下載代碼,咱們用modelsim仿真(此外還有QuestaSim、NC verilog、Diamond的Active-HDL、VCS、Debussy/Verdi等仿真工具),如果仿真都不能通過那就不用下載了,肯定不行的。在這里先掌握簡單的testbench就可以了。推薦的教材是《WRITING TESTBENCHES Functional Verification of HDL Models》。
三、掌握設(shè)計方法和設(shè)計原則。
???????你可能發(fā)現(xiàn)你綜合出來的電路盡管沒錯,但有很多警告。這個時候,你得學(xué)會同步設(shè)計原則、優(yōu)化電路,是速度優(yōu)先還是面積優(yōu)先,時鐘樹應(yīng)該怎樣設(shè)計,怎樣同步兩個異頻時鐘等等。推薦的教材是《FPGA權(quán)威指南》、《IP核芯志-數(shù)字邏輯設(shè)計思想》、《Altera FPGA/CPLD設(shè)計》第二版的基礎(chǔ)篇和高級篇兩本。學(xué)會加快編譯速度(增量式編譯、LogicLock),靜態(tài)時序分析(timequest),嵌入式邏輯分析儀(signaltap)就算是通關(guān)了。如果有不懂的地方可以暫時跳過,因為這部分還需要足量的實踐,才能有較深刻的理解。
四、學(xué)會提高開發(fā)效率。
??????? 因為Quartus和ISE的編輯器功能太弱,影響了開發(fā)效率。所以建議使用Sublime text編輯器中代碼片段的功能,以減少重復(fù)性勞動。Modelsim也是常用的仿真工具,學(xué)會TCL/TK以編寫適合自己的DO文件,使得仿真變得自動化,推薦的教材是《TCL/TK入門經(jīng)典》。你可能會手動備份代碼,但是專業(yè)人士都是用版本控制器的,所以,為了提高工作效率,必須掌握GIT。文件比較器Beyond Compare也是個比較常用的工具。此外,你也可以使用System Verilog來替代testbench,這樣效率會更高一些。如果你是做IC驗證的,就必須掌握System Verilog和驗證方法學(xué)(UVM)。推薦的教材是《Writing Testbenches using SystemVerilog》、《The UVM Primer》、《System Verilog1800-2012語法手冊》。
???????? 掌握了TCL/TK之后,可以學(xué)習(xí)虛擬Jtag(ISE也有類似的工具)制作屬于自己的調(diào)試工具,此外,有時間的話,最好再學(xué)個python。腳本,意味著一勞永逸。
五、增強理論基礎(chǔ)。
??????? 這個時候,你已經(jīng)會使用FPGA了,但是還有很多事情做不了(比如,FIR濾波器、PID算法、OFDM等),因為理論沒學(xué)好。我大概地分幾個方向供大家參考,后面跟的是要掌握的理論課。
1、信號處理——信號與系統(tǒng)、數(shù)字信號處理、數(shù)字圖像處理、現(xiàn)代數(shù)字信號處理、盲信號處理、自適應(yīng)濾波器原理、雷達信號處理
2、接口應(yīng)用——如:UART、SPI、IIC、USB、CAN、PCIE、Rapid IO、DDR、TCP/IP、SPI4.2(10G以太網(wǎng)接口)、SATA、光纖、DisplayPort
3、無線通信——信號與系統(tǒng)、數(shù)字信號處理、通信原理、移動通信基礎(chǔ)、隨機過程、信息論與編碼
4、CPU設(shè)計——計算機組成原理、單片機、計算機體系結(jié)構(gòu)、編譯原理
5、儀器儀表——模擬電子技術(shù)、高頻電子線路、電子測量技術(shù)、智能儀器原理及應(yīng)用
6、控制系統(tǒng)——自動控制原理、現(xiàn)代控制理論、過程控制工程、模糊控制器理論與應(yīng)用
7、壓縮、編碼、加密——數(shù)論、抽象代數(shù)、現(xiàn)代編碼技術(shù)、信息論與編碼、數(shù)據(jù)壓縮導(dǎo)論、應(yīng)用密碼學(xué)、音頻信息處理技術(shù)、數(shù)字視頻編碼技術(shù)原理
?????? 現(xiàn)在你發(fā)現(xiàn),原來FPGA會涉及到那么多知識,你可以選一個感興趣的方向,但是工作中很有可能用到其中幾個方向的知識,所以理論還是學(xué)得越多越好。如果你要更上一層,數(shù)學(xué)和英語是不可避免的。
六、學(xué)會使用MATLAB仿真。
??????? 設(shè)計FPGA算法的時候,多多少少都會用到MATLAB,比如CRC的系數(shù)矩陣、數(shù)字濾波器系數(shù)、各種表格和文本處理等。此外,MATLAB還能用于調(diào)試HDL(用MATLAB的計算結(jié)果跟用HDL算出來的一步步對照,可以知道哪里出問題)。推薦的教材是《MATLAB寶典》和杜勇的《數(shù)字濾波器的MATLAB與FPGA實現(xiàn)》。
七、足量的實踐。
?????? 這個時候你至少讀過幾遍芯片手冊(官網(wǎng)有),然后可以針對自己的方向,做一定量的實踐了(期間要保持良好的代碼風(fēng)格,增加元件例化語句的可讀性,繪制流程圖/時序圖,撰寫文檔的習(xí)慣)。比如:通信類的可以做調(diào)制解調(diào)算法,儀表類的可以做總線分析儀等等。不過這些算法,在書上只是給了個公式、框圖而已,跟實際的差距很大,你甚至?xí)X得書上的東西都很膚淺。那么,你可以在知網(wǎng)、百度文庫、EETOP論壇、opencores、ChinaAET、Q群共享、博客上面找些相關(guān)資料(校外的朋友可以在淘寶買個知網(wǎng)賬號)。其實,當(dāng)你到了這個階段,你已經(jīng)達到了職業(yè)級水平,有空就多了解一些前沿技術(shù),這將有助于你的職業(yè)規(guī)劃。
??????? 在工作當(dāng)中,或許你需要關(guān)注很多協(xié)議和行業(yè)標(biāo)準(zhǔn),協(xié)議可以在EETOP上面找到,而標(biāo)準(zhǔn)(如:國家標(biāo)準(zhǔn)GB和GB/T,國際標(biāo)準(zhǔn)ISO)就推薦《標(biāo)準(zhǔn)網(wǎng)》和《標(biāo)準(zhǔn)分享網(wǎng)》。
八、圖像處理。(這部分只寫給想學(xué)圖像處理的朋友,也是由淺入深的路線)
1、Photoshop。花一、兩周的時間學(xué)習(xí)PS,對圖像處理有個大概的了解,知道各種圖片格式、直方圖、色相、通道、濾鏡、拼接等基本概念,并能使用它。這部分是0基礎(chǔ),目的讓大家對圖像處理有個感性的認(rèn)識,而不是一上來就各種各樣的公式推導(dǎo)。推薦《Photoshop CS6完全自學(xué)教程》。
2、基于MATLAB或OpenCV的圖像處理。有C/C++基礎(chǔ)的可以學(xué)習(xí)OpenCV,否則的話,建議學(xué)MATLAB。這個階段下,只要學(xué)會簡單的調(diào)用函數(shù)即可,暫時不用深究實現(xiàn)的細(xì)節(jié)。推薦《數(shù)字圖像處理matlab版》、《學(xué)習(xí)OpenCV》。
3、圖像處理的基礎(chǔ)理論。這部分的理論是需要高數(shù)、復(fù)變、線性代數(shù)、信號與系統(tǒng)、數(shù)字信號處理等基礎(chǔ),基礎(chǔ)不好的話,建議先補補基礎(chǔ)再來??床欢睦碚撘部梢詴簳r先放下,或許學(xué)到后面就自然而然地開竅了。推薦《數(shù)字圖像處理》。
4、基于FPGA的圖像處理。把前面學(xué)到的理論運用到FPGA上面,如果這時你有前面第七個階段的水平,你將輕松地獨立完成圖像算法設(shè)計(圖像處理是離不開接口的,上面第五個階段有講)。推薦《基于FPGA的嵌入式圖像處理系統(tǒng)設(shè)計》、《基于FPGA的數(shù)字圖像處理原理及應(yīng)用》。
5、進一步鉆研數(shù)學(xué)。要在算法上更上一層,必然需要更多的數(shù)學(xué),所以這里建議學(xué)習(xí)實分析、泛涵分析、小波分析等。
下面這兩個階段是給感興趣的朋友介紹的。
九、數(shù)電的盡頭是模電。
???????現(xiàn)在FPGA內(nèi)部的事情是難不到你的,但是信號出了FPGA,你就沒法控制了。這個時候必須學(xué)好模電。比如:電路分析、模擬電子技術(shù)、高頻電子線路、PCB設(shè)計、EMC、SI、PI等等,能設(shè)計出一塊帶兩片DDR3的FPGA開發(fā)板,就算通關(guān)了。具體的學(xué)習(xí)路線可以參考本博客的《如何學(xué)習(xí)硬件設(shè)計——理論篇》和《如何學(xué)習(xí)硬件設(shè)計——實踐篇》。
十、學(xué)無止境。
???????能到這個境界,說明你已經(jīng)很厲害了,但是還有很多東西要學(xué)的,因為FPGA常常要跟CPU交互,也就是說你得經(jīng)常跟軟件工程師交流,所以也得懂點軟件方面的知識。比如ARM(Xilinx的ZYNQ和Altera的SOC會用到ARM的硬核,請參考本博客的《如何學(xué)習(xí)嵌入式軟件》)、DSP、Linux、安卓、上位機(QT、C#、JAVA)都可以學(xué)一下,反正學(xué)無止境的。
十一、其它問題。
a、為什么不推薦學(xué)習(xí)NIOS II和MicroBlaze等軟核?
??????1、性價比不高,一般的軟核性能大概跟Cortex M3或M4差不多,用FPGA那么貴的東西去做一個性能一般的CPU,在工程上是非常不劃算的。不如另外加一塊M3。
??????2、加上軟核,可能會影響到其它的邏輯的功能。這是在資源并不十分充足的情況下,再加上軟核,導(dǎo)致布局布線變得相當(dāng)困難。
??????3、軟核不開源,出現(xiàn)Bug的時候,不容易調(diào)試。
????? 4、工程上很少使用,極有可能派不上用場。
b、為什么不推薦0基礎(chǔ)學(xué)習(xí)ZYNQ或SOC?
????? 1、容易讓人有傍同心理。傍同心理是指一個人通過渲染與自己有親近關(guān)系的人的杰出,來掩蓋和彌補自己在這方面的不足,從而獲得心理上的平衡。自己在學(xué)習(xí)很厲害的東西,然后也感覺自己很厲害,但這只是錯覺而已。
????? 2、入門應(yīng)該學(xué)習(xí)盡量簡單的東西,要么專心學(xué)習(xí)ARM,要么專心學(xué)習(xí)FPGA。這樣更容易有成就感,增強信心。
????? 3、ZYNQ和SOC的應(yīng)用領(lǐng)域并不廣,還有很多人沒聽過這種東西,導(dǎo)致求職的不利。
????? 4、開發(fā)工具編譯時間長,浪費較多時間。
????? 5、絕大多數(shù)工作,都只是負(fù)責(zé)一方面,也就是說另一方面,很有可能派不上用場。
c、為什么已經(jīng)存在那么多IP核,仍然需要寫HDL?
? ? ? 1、問這種問題的,一般是學(xué)生,他們沒有做過產(chǎn)品,沒有遇到過工程上的問題。
? ? ? 2、IP核并非萬能,不能滿足所有需求。
? ? ? 3、盡量少用閉源IP核,一旦出問題,這種黑匣子很可能讓產(chǎn)品難產(chǎn)。
? ? ? 4、深入理解底一層次,可以更好地使用高一層次。該法則可以適用于所有編程語言。
總結(jié)
- 上一篇: 计算机专业去支教学到什么,支教的收获及感
- 下一篇: PTA 7-209 sdut-C语言实验