1. 程式人生 > >黑金Xilinx FPGA學習筆記(一)verilogHDL掃盲文-(1)

黑金Xilinx FPGA學習筆記(一)verilogHDL掃盲文-(1)

verilog簡介
HDL 顧名思義Hardware Description Languag
verilog HDL 語言的語法和格式都比較隨便,它沒有 VDL HDL 語言那麼嚴謹,因此受到了廣泛的應用。
0.3RTL級和組合邏輯級
筆者的眼中 Verilog HDL 語言建立的硬體模組可以
分為有時鐘源和無時鐘源。有時鐘源的意思是需要時鐘訊號作為操作最基本消耗單位, 硬體模組才能執行。 無時鐘源的意思就是不需要消費時鐘訊號, 硬體模組也可以被執行。 無時鐘源最好的例子就是由組合邏輯建立的硬體模組, 一些典型的設計如: 硬體乘法器, 硬體除法器等基本上都是由一些複雜的邏輯閘組合, 故它們根本就不需要時鐘來操作, 或者說它們只需要一個步驟又或者只需要一個時鐘就可以完成任務。

由此就有 RTL 級和組合邏輯級的建模之分。 基本上 RTL 級建模的基本單元會是“暫存器”, 然而組合邏輯級的建模基本單元就是邏輯閘。 單單用幾行的文字來講述 RTL 級和組合邏輯級的建模實在太抽象了,筆者聚個簡單的例子

module Add_Module( input [7:0]A, input [7:0]B, input [7:0]C, Output[15:0]);
    wire [7:0]_a = A;
    wire [7:0]_b = B;
    wire [7:0]_c = C
    assign Output = _a + _b + _c;
endmodul

這是一個簡單的組合邏輯級,建模而成的 3 路加法器。

module Add_module
( input CLK, input RSTn, input [7:0]A, input [7:0]B, input [7:0]C, Output[15:0]) ;
    reg [15:0]rTemp;
    alawys @ ( posedge CLK negedge RSTn )
        if( !RSTn )
            rTemp <= 4'0;
        else
            rTemp <= A + B + C;
    assign Output = rTemp;
endmodul

這是一個簡單的 RTL 級,建模而成的 3 路加法器。
根據上面兩個例子的三路加法器, 一個是由組合邏輯級建模而成, 另外一個則是由 RTL級建模而成。 組合邏輯級建模給人最直接的印象就是模組都不帶“時鐘訊號”, 反之 RTL級建模的最大特徵性,就是模組都會伴隨“時鐘訊號”。當然,筆者不可能僅以“時鐘訊號” 來區分組合邏輯級建模和 RTL 級建模。
在實際的學習中過於在意區分“什麼是組合邏輯級建模,什麼是 RTL 級建模” 是對學習沒有任何幫助的(不知道為什麼很多參考書都很習注重區分), 凡是有關 Verilog HDL語言的建模它們都被需要。話雖如此,但是在這一本筆記裡筆者還是比較注重 RTL 級
的建模。
0.4 Verilog HDL 語言真的那麼難掌握?


Verilog HDL 語言容易入門但是不容易掌握,估計這是所有學習 Verilog HDL 語言人們的心聲。 其實要掌握 Verilog HDL 語言是很簡單的, 筆者的祕訣就是“掌握 Verilog HDL語言的思想”。 在筆者眼中 Verilog HDL 語言的思想有兩種, 一種是建模和另一種是時序。建模是 Verilog HDL 語言的結構或者說是它的地基,然而時序是所有模組的活動記錄。這些概念,目前的讀者不明白也不要緊,筆者已經分為兩個筆記來詳談了它們了。
筆者相信很多接觸 FPGA 的朋友之前都有接觸過微控制器,在不知不覺之中,自然而然
學習微控制器的想法就主宰了學習 FPGA。 筆者也是過來人, 這樣的心情筆者非常的瞭解。
當我們再學習微控制器的時候, 很多人估計都是直接以 C 語言入門吧?筆者就先說說單片Verilog HDL 的禮物 - Verilog HDL 掃盲文
筆者部落格 : http://blog.ednchina.com/akuei2 黑金動力社群 : http://www.heijin.org
6
機這個硬體吧: 它們都是各大產商的產品, 一些基本的硬體資源老早就已經嵌入在這個小小的微控制器當中。 餘下, 尤其說學習微控制器還不如說我們學習如何控制微控制器的暫存器更為貼切。 一些硬體的發生, 使用者可以完全不用知道, 我們只要懂得如何配置控制該硬體的暫存器就可以了。
相比之下 FPGA 可以稱為赤裸裸的樂高積木, 如果讀者要實現串列埠, 讀者就要自行建立串列埠硬體模組。 要建立一個串列埠硬體模組, 首先需要明白串列埠的操作原理, 然後根據需要自定義和修改原理的發生。 最後還要考慮這個串列埠硬體模組如何被控制?是否獨立化它(見介面建模)?這些就是建模思路。
在軟體方面, 我們可以用 C 語言去配置微控制器的暫存器和編輯微控制器操作的邏輯。 但是有一點請讀者不要忘了, C 語言也是一個產品, 它和 Verilog HDL 語言不同 C 語言在出
生之後它就有自己的結構和自己一套的使用規則。 最後根據微控制器的產商需要, C 語言還可以進一步被自定義, 這種現象不難看見, 學習 c51 和學習 AVR 基本上就有兩套的C 語言用法。
反之 Verilog HDL 語言雖然有語法, 但是 Verilog HDL 語言就沒有自身的結構也沒有自己一套的用法。 在網上這種現象很普遍, 讀者會看到五花八門, 百花齊放, 各種各樣的模組內容。 很多時候, 這些模組的內容只有設計者自己看懂而已, 別人估計要花上幾倍的精力才可以搞明白“它在幹嘛”。
為此, 如果要把 Verilog HDL 語言掌握好, 第一要提供 Verilog HDL 語言的結構, 第二要提供 Verilog HDL 語言一套用法(使用規則)。前者筆者是用建模來解決,後者筆者用“仿順序操作” 的想法來補充。
0.5 高階語言和 Verilog HDL 語言的區
一些高階語言如 C 語言,組成操作行為的基本單位是“步驟”,舉個例子:

步驟 1 sum1 = a + b + c;
步驟 2 sum2 = d + e + f

在步驟 1 sum1 賦值與 a + b + c,然而在步驟 2 sum2 賦值與 d + e + f; 在使用者眼中,
C 語言只要兩個步驟就可以把操作完成。 反之在使用者不可見之下, 步驟 1 和步驟 2 總
和所生成的指令估計會超過 8 個, 然而微控制器一個時鐘只能執行一個指令而已, 亦即要
完成步驟 1 和步驟 2 至少需要超過 8 個時鐘才能完成。
對於使用者來說, 他們只是關心步驟而已, 反而不會過於關心“一共被執行了多少指令”
和“消耗了多少個時鐘”。相反的對於 Verilog HDL 語言來說,尤其是 RTL 級的建模,
時鐘代表了模組執行所要消耗的單位。

case(i)
0:
begin Sum1<=a+b+c;Sum2<=d+e+f;i<+i+1'b1;end

在一個時鐘之內 Sum1 和 Sum2 同時賦值與 a+b+c 與 d+e+f。

case( i )
0:
begin Sum1 <= a + b + c; i <= i + 1'b1; end
1:
begin Sum2 <= d + e + f; i <= i + 1'b1; end

在第一個時鐘之內 Sum1 賦值與 a+b+c;在第二個時鐘之內 Sum2 賦值與 d+e+f;
在上面兩段簡單的程式碼之中, Sum1 和 Sum2 可以在一個時鐘內求得,又或者 Sum1 和
Sum2 可以分開兩個時鐘之內完成賦值。換句話說,理論上 Verilog HDL 語言在一個時
鍾之內可以完成“很多很多很多” 的操作又可以完成單一操作, 因為它的操作是由邏輯
資源組成的, 只要 FPGA 的邏輯資源允許的話, 讀者要在一個時鐘內完成 1 萬個 1 億個操作都沒有問題。這個事實也暴露了 Verilog HDL 語言是有並行的性質。

比較屬性 C 語言 Verilog HDL 語言
最小單位 指令 邏輯資源
單個時鐘可以執行的操作 一個指令(簡單指令) 理論上是無限個操作
(並行操作的性質)
結構 有固定的結構 沒有固定結構
使用規則 有固定的使用規則 沒有規定使用規則
強度 軟 偏
在筆者的眼中, 總結上 C 語言和 Verilog HDL 語言之間的區別會是如上的圖表。 關於高
級語言和 Verilog HDL 語言區別的內容筆者討論到這裡就好了,讀者不要過於深入區分誰是誰, 誰又不是誰, 如此糾結對學習沒有任何好處, 更多認識, 當讀者們深入以後就會自然瞭解。
0.6 什麼是 Verilog HDL 語言的時序?

時序是 Verilog HDL 語言的中心思想之二,在死板的教科書上時序圖等於邏輯波形圖,在某種程度上這樣的解釋沒有任何錯誤。 但是, 這種的解釋太過武斷了, 類似“鬈髮的小孩都是頑皮的小孩(筆者是鬈髮小孩)” 的解釋。時序也可以稱為是“模組的活動記錄”, 又或者說: 把每一個時鐘中的模組活動記錄都連結起來的話, 就會形成俗稱的“波形圖”。
從另一個角度來看的話, 在長長的時序圖裡, 包含了模組的活動規則, 模組的溝通記錄等一些貴重的資訊。 老實說, 有關 Verilog HDL 語言與時序的概念, 新手確實很難掌握。因為傳統的印象中“時序” 給人的概念是發生在物理上的, 既有延遲, 又有亞太事件(亞
穩態) …. 等。雖然這也是時序的“一番” 概念,但是這是發生在物理上而已,然而發生在 Verilog HDL 語言身上的時序是“理想”的, 是不存在任何瑕疵。 我們知道驅使(RTL級) 模組行動的最小單位就是時鐘, 即時發生延遲也只是延遲一個時鐘, 又或者 2~3 個
時鐘,絕對不會出現什麼延遲 2ns~3ns (物理路徑延遲)等的問題。
在筆者的眼中“時序” 的思想非常簡單, 就是如何讀懂波形圖, 如何把波形圖和模組的內容作聯絡。但是很遺憾,在這一本筆記裡筆者只是詳談建模而不討論任何和“時序”
有關的話題。 原因很簡單, 就是“建模是 HDL 語言的所有” 如果讀者都搞不懂建模到底是什麼一回事,模組的內容估計都會“慘不忍睹”。就算讀者搞明白什麼是時序(在不懂建模的概念之下)結局是什麼意思也沒有,這一點筆者不會騙你的 …
取而代之筆者用“步驟” 作為筆記的中心 … 嗯~還有一點, 筆者所設計的例項都是直接下載到開發板, 執行並且觀察結果。 如果讀者在模擬上遇到什麼問題, 千萬不要來找筆
者噢,呵呵~(如果讀者無法很好掌握“時序” 的概念,模擬會非常不好使的。)
更多有關“時序” 的話題, 筆者已經準備在另一本筆記裡了。 所以, 筆者真的真的很有誠意的求求你們,先把建模學好再談什麼模擬 …
0.7 Verilog HDL 的綜合語言
Verilog HDL 語言有兩個部分, 是綜合語言和驗證語言。 有關驗證語言筆者就不談了 …說了都感覺噁心, 它已經傷了筆者很多的心。 至於綜合語言也就是建模最常用的, 在這
裡筆者比較習慣稱為它們建模語言。
綜合語言常用的關鍵字不多,筆者就隨便舉例

屬性 關鍵字
模組建立 module … endmodule
輸入輸出宣告 input , output , inout
判斷 if … elseif … else
case() … endcase
資源宣告 reg , wire
基本操作用 [email protected]() , posedge , negedge, assign , begin … end
常量宣告 paramete
至於綜合語言常用的操作符也不多,筆者也隨便舉例:
屬性 操作符
賦值 <= , =
邏輯判斷 > , < , <= , >=, != , ==
下標 []
位操作 {}, <<, >>
數學運算 +, - , *, /, %
其他 ?:(三目), *(宣告組合邏輯用)

當讀者看了筆者“隨便舉例” 的綜合語言以後, 是不是會傻眼?不要懷疑, 只要懂這些
東西就已經足夠了。事實上真正使得讀者們產生疑惑感的是讀者們手上用的參考書。 這
些磚家叫獸有的沒的, 為了“權威” 什麼事情都幹, 筆者沒有損毀他們的意思, 事實上
很多參考書都是參考來又參考去, 內容都是換湯不換藥。 更噁心的是這些參考書還新增
了許多看不懂的內容,買的人往往都是最傷神和傷身的(錢包也一樣傷 )。不過也有一
個例外就是夏教授寫的書確實很經典。

我們先談談幾個比較有趣的關鍵字和操作符:

例子 1 - reg 和 wire 的尷尬:
reg 和 wire 如果站在 RTL 級建模的角度上, reg 就是暫存器,作用是用來暫存內容,而且也提供操作空間; wire 就是連線, 作用僅此而已。 但是站在組合邏輯級建模上 reg和 wire 已經是傻傻分不清楚了,舉個例子:

module omg_module ( output [7:0]Q );
    wire [3:0]A = 4'd0;
    wire [3:0]B = 4'd2;
    wire [3:0]C = 4'd3;
    assign Q = A + B + C;
endmodule

以上的一段程式碼,請問 wire 的作用是連線還是寄存內容了?呵呵,筆者沒有說這樣的
使用方法有錯呀。 在這裡筆者只是提出一個有趣的例子而已, 對於一些初學者來說可能
會非常的疑惑,尤其是那些習慣“面向物件” 思想的人們 …

module omg_module ( output [7:0]Q );
reg [3:0]A;
reg [3:0]B;
reg [3:0]C;
always @ ( * )
    begin
        A = 4'd0;
        B = 4'd2;
        C = 4'd3;
    end
assign Q = A + B + C;
endmodule

如果筆者換成這樣寫法的話,是不是覺得更有道理呢? always ( * ) 的使用暗示了這是一個組合邏輯, 然而暫存器 A 的值是 4’d0, 暫存器 B 的值是 4’d2,暫存器 C 的值是4’d3, Q 的驅動輸出是暫存器 A,B,C 的值綜合。
這裡寫圖片描述

更有趣得是,經過編譯兩段程式碼所生成的 RTL 檢視都一樣!? (⊙o⊙)? … 在這裡,筆者是要告訴讀者一個資訊, 當我們建模的時候“解讀能力” 的優先順序往往都高過“內容精簡性”。不要一度過於“貪小便宜” 而把內容的解讀能力跨下了,雖然這兩個程式碼都沒有錯,而且結果一致。但是一個潛在的問題是,我們人類都是習慣把“東西分類” 以便管理和理解,既然 wire 在字面上都是“連線” 的意思了,就乾脆把它當“連線” 來
使用 …

例子 2 - always @ () 的多樣性
1. always @ (posedge CLK or negedge RSTn) // 當 CLK 和 RSTn 變化的時候
2. always @ ( * ) // 什麼時候都變化, 亦即預設為組合邏輯
3. always @ ( A ) // 當 A 變化的時候
always @ () 的用法很多,但是用得最多的就是第 1 個和第 2 個。
關於第一個用法, 表示了在 always @ ()之下的動作, 對每一個 CLK 的上升沿或者 RSTn
的下降沿都被執行。筆者給出一些比較簡單的例子:

always @ ( posedge CLK or negedge RSTn )
if( !RSTn )
Counter <= 8'd0;
else
Counter <= Counter + 1'b1;

這是一個簡單的計數器例項, 當 RSTn 產生下降沿 Counter 就清零, 反之在每一個 CLK的上升沿 Counter 就遞增。 always @() 這樣的用法也給 RTL 級建模提供了基礎,此外我們也可以經過自定義產生出另類的用法。

always @ ( posedge CLK or negedge RSTn )
    if( !RSTn )
    begin
        i <= 4'd0;
        .......
    end
    else
        case( i )
            0:
            .......
    endcase

上面一段程式碼是筆者最愛的“基於仿順序操作想法” 的基本“用法模板”,在後期裡它可是大展拳腳。

always @ ( * ) A = 4'd9; // 常數賦值

always @ ( * ) // 選擇器
    if( Start_Sig[0] ) rQ = U1_Q;
    else if ( Start_Sig[1] ) rQ = U2_Q;
    else Q = 1'bx;

至於第二種 always @ () 的用法, 筆者估計它是用得最“氾濫” 了, 尤其是在組合邏輯
建模裡,不過筆者使用的比較不多, 除了“常數賦值” 和“輸出選擇器” 以外。
最後的第一種 always @()的用法,基本上只要懂得上面兩種 always @ () 用法以後,自
然而然也會了。
例子 3 - 最頭疼的 = 和 <= 賦值
基本上要搞懂這兩個賦值操作符號的作用,就必須把“時序” 的概念搞懂先。一般上,參考書只是告訴我們一個是非阻塞, 一個是非阻塞 …. 說實話, 當筆者把厚厚的參考書吃完以後,筆者完全還搞不懂究竟參考書都在說什麼(磚家叫獸萬歲 )。如果從筆者的角度去理解的話, 只有在時序的活動中才可以很清楚的看清它們的區別。 巨集觀上, 如同參考書中所說的一樣; 微觀上, 在時序中“=” 是引發“即時事件” ,“<=” 則是引發“時間點事件”。
不過很可惜的是,在建模篇裡筆者沒有過多的討論它們。一律有關 RTL 級活動的使用“<=” ,一律有關組合邏輯級的活動都使用“=”。如果筆者在建模篇裡過度涉及它們,筆記的目的就會本末倒置, 這一點請讀者們見諒。 筆者已經在時序篇裡準備好來討論它們了。
例子 4 - 要慎用的 * / % 數學運算子
當讀者使用 * / 和 % 的數學運算子的時候,筆者請你們再三的三思(九思?呵呵!),因為使用它們的代價很大。 如果讀者所使用的 FPGA 有內嵌硬體乘法器又或者除法器的話, 那麼這些乘法器和除法器就會被消耗。 相反的, 如果讀者說使用的 FPGA 是沒有包含這些東西的話,資源邏輯的消耗是很大的。一般上, 如果是為了求出 *2 *4 *8 *16 又或者 /2 /4 /8 /16 筆者建議使用位操作的運算子, 亦即 << 和 >> , 它們也可以求出同樣的結果。 如果想要求出的結果是不在 2N 範圍之內的話, 讀者還是求與其他的方法 … 只有在用盡辦法的時候才使用它們。 至於 %的數學運算子,它真的是一個罪惡,沒有可以替代的第三方法 ….
在這裡筆者要強調一下,筆者不是說不可以使用它們,筆者只是建議如果可以的話不要過度依賴它們,它們盡是一些邏輯資源的大食怪,不把資源吃光才怪。
0.8 關於參考書和讀者的筆記
無論讀者是瀏覽參考書也好, 筆者的筆記也好, 還是他人大大的筆記也好, 不要過度把HDL 語言看得太死, HDL 語言不適合這一套的。但是一些新手,尤其是上路一段時間的新手, 筆者非常建議能靜下心來好好閱讀筆記中的每一章節。 筆者不是按“專案的味道” 去編輯筆記,而是按“學習的味道” 去編輯筆記,內容都是在圍繞“Verilog HDL語言是什麼?如何用好它? ” 之類的重點。
0.9 不要帶偏見去學習 Verilog HDL 語言
某個聲音:
“C 語言驅動的東西,既然用 Verilog HDL 語言去驅動!?省了吧 …”
“Verilog HDL 語言能不能像 C 語言這樣呼叫子程式? ”
“Verilog HDL 很像 C 語言 …”
“你怎麼可以違背參考書 …. 怎麼不使用狀態機? ”
上述的聲音很容易在初學 Verilog HDL 語言的時候常常被聽到。 筆者還記得筆者在初學Verilog HDL 語言的時候,印象最深刻的一句話就是“Verilog HDL 語言很像 C 語言, 但是不要把 Verilog HDL 語言當成 C 語言”。這一句話一直在後期的學習中,給筆者許多的靈感。
在許多本筆記中,筆者常常說 C 語言和 Verilog HDL 語言是兩個世界的居民,但是筆者又時不時借籤 C 語言,這其中真的充滿了很多矛盾 … 很多新手都說 C 語言和Verilog HDL 語言既然是不同的東西, 自然而然 Verilog HDL 語言的作為和 C 語言的作為是 180° 相沖的。 話句話說, Verilog HDL 語言可以應用的地方只適合“邏輯和底層設計” …. 不不不,這是天大的誤會。
就這樣,隨之又產生“C 語言驅動的東西,既然用 Verilog HDL 語言去驅動” 類似的聲音。是誰規定 C 語言可以驅動的東西, Verilong HDL 語言就不能驅動?相反的, C 語言可以驅動的東西, 如果讀者也能使用 Verilog HDL 語言去驅動, 那麼這才是真正的學習。之所以會產生如此的聲音,就如筆者在前幾章節講述的那樣:
“Verilog HDL 語言的結構自由,使用方法也自由,自由到好像沒有一樣”
很多的設計都不包含結構和使用方法,只要設計可以發揮預期般的效果就 Okay ~ 如果讀者明白了這個簡單的道理,讀者自然會明白自定義 Verilog HDL 語言的結構和使用方法是非常的重要和基礎。 很可惜呀, 這一切的問題都要歸咎於參考書, 因為參考書從來不考慮這一點, 傻乎乎的讀者就這樣遭殃了。 事實上 Verilog HDL 語言可以實現如同 C語言那樣呼叫子程式.. 但是問題就在於沒有結構和沒有使用方法, 所以才會感覺困難而已。
筆者非常非常的建議, 不要把參考書當著神來膜拜, 即使是最常用的狀態機, 也有非常多的缺陷。這些缺陷在後期建模的時候,會如顯的突出 … 程式碼臃腫和解讀能力下降等問題。不知道大夥有沒有看過如同“蜘蛛網” 的狀態機的關係圖?呵呵 … 參考書所說的一切都不是絕對的,它們可供參考,但是不可供 “迷信”。讀者要使用狀態機也好,還是不使用狀態機也好,完全是自由。
Verilog HDL 語言的建模不是越複雜就越偉大,反之越直接的建模才是學習的方向。在這裡, 聽筆者說: “當你放下偏見, 你才可以接觸到真理”, 這簡單的智慧在哪裡都行得通,學習 Verilog HDL 語言也是這樣一回事。“放下一切對 Verilog HDL 語言學習的偏見吧,阿門” ~ 呵呵!

相關推薦

黑金Xilinx FPGA學習筆記verilogHDL掃盲-1

verilog簡介 HDL 顧名思義Hardware Description Languag verilog HDL 語言的語法和格式都比較隨便,它沒有 VDL HDL 語言那麼嚴謹,因此受到了廣泛的應用。 0.3RTL級和組合邏輯級 筆者的眼中 Ver

Xilinx FPGA 學習筆記——時鐘資源

在Xilinx的FPGA中,時鐘網路資源分為兩大類:全域性時鐘資源和區域時鐘資源。 全域性時鐘資源是一種專用互連網路,它可以降低時鐘歪斜、佔空比失真和功耗,提高抖動容限。Xilinx的全域性時鐘資源設

FPGA學習筆記——初識FPGA

ble 數據 str 存儲 分享 視頻 邏輯 信號 ros ###### 【該隨筆屬於小梅哥FPGA系列視頻學習筆記,原創為小梅哥】 #########   FPGA(Field-Programmable Gate Array,現場可編程門陣列),典型的FPGA

FPGA 學習筆記 VGA驅動的實現

VGA時序圖 1)行掃描時序圖 a:行同步時期,掃描地址的復位 b:行消隱後肩,掃描地址轉移後的穩定等待準備期 c:行顯示時期,資料有效區域 d:行消隱前肩,掃描地址轉移的準備 e:行掃描總時間,一行掃描的總時間 2)場掃描時序圖 o:場

FPGA學習筆記--- 流水燈

tle 晶振 定義 -1 min itl dual color lan 平臺:FPGA黑金開發板 AX301 開發環境:Quartus Prime Version 17.0.0 Build 595 04/25/2017 Standard Edition

Go語言學習筆記: 切片slice

操作 容量 方括號 一個 組類型 學習 中學 slice 修改 Go語言學習筆記十一: 切片(slice) 切片這個概念我是從python語言中學到的,當時感覺這個東西真的比較好用。不像java語言寫起來就比較繁瑣。不過我覺得未來java語法也會支持的。 定義切片 切片可以

FPGA學習筆記—— 時序邏輯電路設計

code 是我 使用 param efi sof src img lse 用always@(posedge clk)描述 時序邏輯電路的基礎——計數器(在每個時鐘的上升沿遞增1)   例1.四位計數器(同步使能、異步復位) // Module Nam

FPGA學習筆記——FSMFinite State Machine,有限狀態機設計

fault mil 系統 time 編碼 代碼 ril esc 寫法   FPGA設計中,最重要的設計思想就是狀態機的設計思想!狀態機的本質就是對具有邏輯順序和時序規律的事件的一種描述方法,它有三個要素:狀態、輸入、輸出:狀態也叫做狀態變量(比如可以用電機的不同轉速作為狀態

JavaFX學習筆記——重要理念的建立與辨析

儘量使用css設定樣式 原因: 1.CSS語法簡單,格式統一,簡化了程式碼重用的方法,使得頁面邏輯與頁面樣式的設計相分離,更有利於團隊協作。更改起來也更加方便。 2.在靜態(即只需初始化一次,沒有太多複雜的額外操作)的元件樣式設定或者簡單動態響應(如滑鼠移入時的樣式,只需在類名中加“:h

《離散時間訊號處理學習筆記》—連續時間訊號的取樣

注:本部落格是基於奧本海姆《離散時間訊號處理》第三版編寫,主要是為了自己學習的複習與加深。 一、週期取樣 1、訊號的離散表示可以由多種形式,包括各種型別的基展開,訊號建模的引數模型和非均勻取樣。這些各種型別的表示方法通常都始於通過週期取樣得到的聯絡時間訊號的離散時

[學習筆記] 《程式碼整潔之道》

[學習筆記] 《程式碼整潔之道》—第1章 整潔程式碼 程式設計:將需求明確到機器可以執行的細節程度 —> 程式碼 保持程式碼整潔:讓營地比你來時更乾淨! [學習筆記]《程式碼整潔之道》—第2章 有意義的命名 名副其實 說起來簡單,但這是很嚴肅的事!

[學習筆記]菜鳥教程Swift知識點總結

目錄基本語法資料型別變數、常量可選型別字面量運算子 基本語法 Swift 的多行註釋可以巢狀在其他多行註釋內部。寫法是在一個多行註釋塊內插入另一個多行註釋。第二個註釋塊封閉時,後面仍然接著第一個註釋塊

FPGA 學習筆記十二 如何用串列埠傳送32位資料?

在筆者之前所用的串列埠中,串列埠一次只能傳送資料為8位,這跟串列埠通訊的協議方式有關係。而最近筆者的專案中需要用到一次傳送32位的資料。筆者最開始想到的是32位資料傳送4次。 為了不改動原來的串列埠通訊協議驅動,筆者設計瞭如下發送方式: 設計四個狀態stat

Hadoop學習筆記—20.網站日誌分析專案案例專案介紹

網站日誌分析專案案例(一)專案介紹:當前頁面一、專案背景與資料情況1.1 專案來源  本次要實踐的資料日誌來源於國內某技術學習論壇,該論壇由某培訓機構主辦,匯聚了眾多技術學習者,每天都有人發帖、回帖,如圖1所示。圖1 專案來源網站-技術學習論壇  本次實踐的目的就在於通過對該

FPGA 學習筆記 PLL核的定製

通常我們板子上所帶的系統時鐘是50Mhz,如果我們需要更高的頻率就需要使用pll核,通過鎖相環將頻率倍頻到更高的頻率。 我們採用將系統時鐘50Mhz倍頻到100Mz來講解: 1)選擇tools→MegaWizard Plug-In Manager 2)選擇

FPGA 學習筆記十三modelsim自動化模擬環境

搭建基於Modelsim的自動化模擬 我們之前通常進行Modelsim介面操作,這樣會很費時很麻煩。這裡我們介紹一種快捷的方法,通過do檔案快速搭建模擬環境,實現更高效的模擬過程。 我們只需將sim.do中的程式碼寫好,然後點選一下modelsim_ru

NAND FLASH學習筆記之MTD下nand flash驅動

轉載請註明:http://blog.csdn.net/wang_zheng_kai/article/details/18988521 有了前面的基礎,我們就可以研究MTD下的nand驅動了,我這裡用的是jz4780grus開發板,我將以下面幾個部分做一個介紹,如果有沒有涉及

《離散時間訊號處理學習筆記》—離散時間訊號與系統

注:本部落格是基於奧本海姆《離散時間訊號處理》第三版編寫,主要是為了自己學習的複習與加深。 1、在訊號的數學表示式中,獨立變數可以是連續的,也可以是離散的。 1)、連續時間訊號時定義在一個連續時間域上,可用一個連續獨立變數來表示。連續時間訊號常常又稱作模擬訊號。

Java學習筆記——設計模式之六.原型模式淺克隆和深克隆

catch 新的 att over 引用變量 col logs implement pri That there‘s some good in this world, Mr. Frodo. And it‘s worth fighting for. 原型模式(prot

Linux學習筆記10_基本命令復習6mv,history,LANG

linux------------------------------------------------------------------------2017.08.11mv //移動命令,也可重命名文件夾 //移動文件夾時,若目的路徑存在,則移動至目的路徑內部