# 描述電路的三種層次 ###### tags: `verilog` `digital design` `邏輯設計` `邏設` [TOC] ## English Version Check English tutorial [here](https://hackmd.io/@dppa1008/ryIHGbJv8) ## Structure Description ( Structural Modeling ) 格式: ``` <gate> name ( output, intput1, input2,... ); ``` - 又稱為 Gate Level , - 簡單來說,就是整個電路都用邏輯閘構成。 |閘名稱|圖示|範例|意義| | --- | --- | --- | --- | | NOT | ![](https://i.imgur.com/RvNNvA4.png =100x) | not not1( B, A ); | B = ~A | | AND | ![](https://i.imgur.com/QJUx4hY.png =100x) | and and1( C, A, B ); | C = A & B | | OR | ![](https://i.imgur.com/w3xrvzn.png =100x) | or or1( C, A, B ); | C = A \| B | | XOR | ![](https://i.imgur.com/G4U22p6.png =100x) | xor xor1( C, A, B ); | C = A ^ B | 舉例: <div style="text-align: center" > <img src="https://i.imgur.com/Nkh9Ij7.png" height="400" width="500"/> </div> ```verilog= module comparator( A, B, gt, lt, eq ); input A, B; output gt, lt, eq; wire negA, negB; not not1( negA, A ); not not2( negB, B ); and and1( gt, A, negB ); and and2( lt, negA, B ); xnor xnor1( eq, A, B ); endmodule ``` ## Dataflow Description ( Dataflow Modeling ) 格式: ```verilog= wire A; assign A = 1'b0; //請注意!! assign statement 一定要搭配 wire 使用 ``` * assign 也稱作 continuous assignment * <font color=#bf2222>當右式有被改變的時候</font>,就會隨時更動左邊的值。 * `=` 左邊只能是 wire * 輸出 <font color=#bf2222>“ 不 ” </font>可以包含輸入。例如: ```assign a = a + b;``` * <font color=#bf2222>一個參數只能被 assign 一次</font>。例如: ```assign a = b; assign a = c; //error``` * assign 的值也可以用大括弧來串聯 bit。 * ```assign a = { 1'b0, 1'b1 }; // a = 2'b01``` * ```assign a = { 2{2'b10} }; // a = 4'b1010``` ```verilog= module comparator( A, B, gt, lt, eq ); input A, B; output gt, lt, eq; assign gt = A & ~B; assign lt = ~A & B; assign eq = ~( A ^ B ); endmodule ``` 其他更詳盡的語法說明,請參考 [Lexical Conventions](https://hackmd.io/s/r1v7PDeYl)。 ## Behavior Description ( Behavior Modeling ) 格式 ```clike= initial begin ... end ``` ```clike= always @( sensitivity list ) begin ... end ``` - Behavior 也稱作 procedural assignment,意思是會依照一些程序條件來觸發。 - 又稱作 block assignment - 可分成兩種,initial block 和 always block。 1. <font color = #1644aa>initial block</font>:只會在程式一進來的時候執行一次,但是 initial block 是不能夠合成的,只能用在<font color=#bf2222>testbench</font>。 2. <font color = #1644aa>always block</font>:只要 sensitivity list 裡的 value 有改變,就會執行一次 always block 裡面的程式。 - 往往 sensitivity list 內的參數會過多,為避免少寫,通常會用 \* 代替。 * 等號左邊只能夠是 <font color = #bf2222>reg</font>。 ```verilog= module comparator( A, B, gt, lt, eq ); input A, B; output gt, lt, eq; always @(*) begin gt = A & ~B; lt = ~A & B; eq = ~( A ^ B ); end endmodule ``` 在這個範例中,always block 裡面使用的是 blocking assignment,也就是在這個 block 內部會依序執行,之後在 sequential circuit 的時候會再詳細的介紹。 更多詳盡的說明,請同學 google 尋找,或上 「[Verilog HDL 教學講義](https://hom-wang.gitbooks.io/verilog-hdl/content/index.html)」。 # [:maple_leaf:Homepage:maple_leaf:](https://hackmd.io/s/ByZ-fyuHV)