5.3.4 always
`always` 块用于描述硬件电路中的时序逻辑或组合逻辑。括号里面的是敏感信号,当这些信号发生变化时,`always` 块中的代码会被执行。
-
`always@(posedge Clk)`:括号中的敏感信号是 `posedge Clk`,表示在时钟信号 `Clk` 的上升沿时触发。这个通常用于时序逻辑。
-
`always@(negedge Clk)`:表示在时钟信号 `Clk` 的下降沿时触发。
-
`always@(*)`:这里的 `*` 表示所有输入信号的变化都会触发 `always` 块,通常用于组合逻辑。
-
`always@(a or b)`:表示当信号 `a` 或 `b` 发生变化时触发 `always` 块。
5.3.5 assign
`assign` 语句用于给 `output`、`inout` 以及 `wire` 类型的信号进行连线。它相当于一条直接的连线,右边的表达式通过 `wire` 连接到左边,左边的信号必须是 `wire` 类型。
示例:
```verilog
wire a, b, y;
assign y = a & b;
```
这里,`y` 是 `a` 和 `b` 的逻辑与运算结果。当 `a` 或 `b` 变化时,`y` 也会立刻变化。
5.3.6 if...else...
这些语句的用法和高级语言(如C语言)中的用法类似,用于条件判断。
示例:
```verilog
if (condition) begin
// 代码块1
end
if (condition) begin
// 代码块2
end else begin
// 代码块3
end
if (condition) begin
// 代码块4
end else if (another_condition) begin
// 代码块5
end
```
-
`if (condition) begin ... end`:如果 `condition` 为真,则执行代码块1。
-
`if (condition) begin ... end else begin ... end`:如果 `condition` 为真,则执行代码块2,否则执行代码块3。
-
`if (condition) begin ... end else if (another_condition) begin ... end`:如果 `condition` 为真,则执行代码块4,否则如果 `another_condition` 为真,则执行代码块5。
case
`case` 语句用于多路选择,具体用法如下:
```verilog
case (expression)
value1: begin
// 代码块1
end
value2: begin
// 代码块2
end
...
default: begin
// 默认代码块
end
endcase
```
根据 `expression` 的值匹配相应的 `value` 并执行对应的代码块。如果没有匹配的值,则执行 `default` 代码块。
希望这些解释能帮助你更好地理解这些内容!