我不是一個好的C/C++程序員,只會用VC6.0的MFC寫一些小程序,在接觸MinGW以前對編譯器和Makefile徹底沒有概念(即便是以後,也不明白)。後來學習Verilog語言,算是對編譯有了必定地認識。程序員
說說我爲何會接觸Verilog這種軟件領域稀有的語言吧(由於它是硬件描述語言,全名是Verilog HDL)。我專業跟圖像處理有很大關係,導師認爲用軟件寫算法處理速度已經不可能再快的,除非有極其昂貴的集羣式計算機組,所以他想用FPGA來實現部分算法,這樣的話學習Verilog就是必不可少的了。算法
編譯好的C/C++語言的程序都是順序執行的,即CPU須要一條指令一條指令地執行,並且每一條指令都屬於CPU的特定的指令集。拿乘法爲例,有的CPU須要多條指令來完成,有的CPU須要一條多週期指令來完成,而極少數高端CPU僅須要一條單週期指令來完成。編譯器對代碼的優化,也僅僅是對各類指令序列的等效替換,不會創造新的指令。小程序
FPGA不一樣,它是一張白紙,你須要在上面設計寄存器、鏈接關係、指令集等,能夠把一個4*4矩陣相乘的操做設計成一個擁有32個專用寄存器單週期完成的指令,酷吧!在CPU上這但是須要64個乘法和48個加法的運算。有人會想,乘法和加法必須有前後關係,即便全部的64個乘法都是並行實現的,爲何加法也能夠在同一個週期內完成呢?有沒有人會這麼想?反正我一開始是這麼想的,可是後來理解了,週期說白了就是時間嘛,個人低端的FPGA的時鐘是100MHz,就是10ns一個週期,以光速走能夠走3m,若是一個組合邏輯電路的等效延時小於10ns,等效長度小於3m,那徹底能夠在一個週期內完成。學習
從C/C++轉Verilog最讓我頭大的就是裏面的「非阻塞賦值 <=」,它全部的語句從上到下都是同時執行的,而不是按順序。好比:優化
always @(posedge clk)設計
if (!rst_n)編譯器
begin編譯
Var1 <= 1;圖像處理
Var2 <= 2;集羣
end
else
begin
Var1 <= Var2;
Var2 <= Var1;
end
這其實是每個週期執行一次交換,第一次的結果是Var1 = 2; Var2 = 1; 而不是C/C++語言認爲的Var1 = Var2 = 2; 這就是時序邏輯!
打個不恰當的比喻,CPU是一家中餐廳,菜單上有什麼,你就能夠點什麼;FPGA是自家的廚房,想吃什麼就作什麼,固然可能你技術很差,作得沒有餐廳好,也可能你手藝不錯,比餐廳好不少。
組合邏輯、時序邏輯,很強大!寫得有點亂,歡迎拍磚~~~~~