# Verilog 設計層次
## 1. Gate Level (邏輯閘層次)
- **使用==邏輯閘==設計電路,==輸入/輸出==由邏輯閘的定義決定**
- **語法:==`<gate> gate_name (<net1>, <net2>, ...);`==**
:::success
```verilog
not g1(not_a , a);
or g2(or_a , a1, a2, /*...*/, a_n);
and g3(and_a , a1, a2, /*...*/, a_n);
nor g4(nor_a , a1, a2, /*...*/, a_n);
nand g5(nand_a, a1, a2, /*...*/, a_n);
xor g6(xor_a , a1, a2, /*...*/, a_n);
xnor g7(xnor_a, a1, a2, /*...*/, a_n);
```
:::
:::info
#### ex:2對1多工器
```verilog=
module mux(out, a, b, sel);
// 輸入/輸出 敘述
input a, b, sel;
output out;
// 變數設定 敘述
wire out;
wire sel_b, a_out, b_out;
// 電路設計 敘述
not g1(sel_b,sel);
and g2(a_out, a, sel);
and g3(b_out, b, sel_b);
or g4(out, a_out, b_out);
endmodule
```
:::
## 2. Dataflow Level (資料流層次)
- **使用 ==邏輯==/==數學 符號== 設計電路,==`assign`== 用來連接 net**
- **語法:==`assign net = <expression>;`==**
:::success
```verilog
// 邏輯運算
assign not_gate = ~a;
assign or_gate = a | b;
assign and_gate = a & b;
assign nor_gate = ~(a | b);
assign nand_gate = ~(a & b);
assign xor_gate = a ^ b;
assign xnor_gate = ~(a ^ b);
// 加減乘除
assign sum = a + b;
assign sub = a - b;
assign product = a * b;
assign quotient = a / b;
assign remainder = a % b;
//三元運算子
assign _wire_ = (a > b) ? a : b;
```
:::
:::info
#### ex:2對1多工器
```verilog=
module mux(
// 輸入/輸出 敘述
output out,
input a, b, sel
);
// 變數設定 敘述
wire out;
// 電路設計 敘述
assign out = (sel)? a:b;
endmodule
```
:::
## 3. Behavior Level (行為層次)
- **使用==高階程式語法==設計電路,用於設計==循序邏輯電路==**
- **語法:==`always @(<trig) begin /*...*/ end`==**
:::success
#### ● Trigger
```verilog
always @(<trig>) begin
// 程式區塊
end
```
| 觸發方式 | 語法 | 註解 |
|:------------------:|:-----------------------------:|:------------------------------------------------------------------:|
| **邊緣觸發(正緣)** | **`always @(posedge clk)`** | **==循序邏輯==** |
| **邊緣觸發(負緣)** | **`always @(negedge clk)`** | **==循序邏輯==** |
| **準位觸發** | **`always @(a)`** | **當 `a` 由 ==$0\rightarrow1$==, ==$1\rightarrow0$== 時 ==觸發==** |
| **多個觸發** | **`always @(a or b or clk)`** | **邊緣觸發、準位觸發==不要混用==** |
| **全域觸發** | **`always @(*)`** | **==組合邏輯==** |
:::
:::info
#### ex:2對1多工器
```verilog=
module mux(
// 輸入/輸出 敘述
output out,
input a, b, sel
);
// 變數設定 敘述
wire out;
reg register;
// 電路設計 敘述
always @(*) begin
if (sel) begin
register <= a;
end
else begin
register <= b;
end
end
// 可以組合其他設計架構
assign out = register;
endmodule
```
:::
---