目录

  1. 过程结构概述
  2. Verilog 过程类型
  3. 过程结构的应用
  4. 过程控制语句
  5. Verilog 过程结构实例
  6. 参考资料

过程结构概述

在 Verilog 中,过程结构是用来描述行为式建模的基本构件。过程结构可以包含一系列的语句,在仿真中根据特定的时钟、事件或条件触发执行。常见的 Verilog 过程结构包括 initial 过程和 always 过程。它们通常用于描述时序电路、状态机和组合逻辑等。

过程结构有助于精确控制仿真过程中的信号变化,并且可以在不同的触发条件下执行代码。


Verilog 过程类型

initial 过程

initial 过程是用于在仿真开始时执行的过程。它通常用于初始化信号值、设置仿真初始条件等。每个 initial 过程都会在仿真开始时运行一次,并且它们并不与时钟或其他事件同步。

语法:

initial begin
    // 过程体
end

示例:

module initial_example;
    reg clk;
    reg a, b;
    
    initial begin
        clk = 0;  // 初始化时钟信号
        a = 0;    // 初始化信号 a
        b = 1;    // 初始化信号 b
    end
endmodule

在这个例子中,initial 过程用于在仿真开始时初始化信号 clkab

always 过程

always 过程是一个持续执行的过程,通常用于描述时序电路、组合逻辑等。always 过程会在特定事件(如时钟边沿、信号变化等)发生时执行,因此它通常与事件控制(如 @)结合使用。

语法:

always @ (sensitivity_list) begin
    // 过程体
end

  • sensitivity_list 是一个列表,包含触发该过程的信号或事件。当这些信号发生变化时,always 过程会被触发。

示例:

module always_example;
    reg clk, reset;
    reg [3:0] counter;
    
    always @ (posedge clk or posedge reset) begin
        if (reset)
            counter <= 0;
        else
            counter <= counter + 1;
    end
endmodule

在这个例子中,always 过程触发条件是时钟的上升沿(posedge clk)或复位信号的上升沿(posedge reset)。当时钟上升沿到来时,计数器 counter 会加 1;当复位信号为高时,计数器会被重置为 0。


过程结构的应用

  1. 组合逻辑:使用 always @*(或 always @(a, b, c, ...))可以描述组合逻辑。
  2. 时序逻辑:使用 always @ (posedge clk)always @ (negedge clk) 等来描述时序逻辑,通常与时钟边沿同步。
  3. 状态机:使用 always 过程与状态变量相结合,能够描述有限状态机(FSM)的行为。

过程控制语句

@ 事件控制

@ 符号用于指定事件控制。always 过程会在指定的信号变化时触发执行。@ 后面可以跟多个信号或事件条件。

示例:

module event_control_example;
    reg clk, reset;
    reg [3:0] counter;
    
    always @ (posedge clk or posedge reset) begin
        if (reset)
            counter <= 0;
        else
            counter <= counter + 1;
    end
endmodule

在这个例子中,always 过程会在时钟信号 clk 的上升沿或复位信号 reset 的上升沿触发。

# 时延控制

在 Verilog 中,可以在过程体中使用 # 来引入时延控制。# 后面跟的是一个延迟时间,用于控制信号变化的时间。

示例:

module delay_example;
    reg a, b;
    
    initial begin
        a = 0;
        b = 1;
        #5 a = b;  // 延迟 5 时间单位后将 b 的值赋给 a
    end
endmodule

在这个例子中,信号 a 会在延迟 5 个时间单位后更新为 b 的值。

disable 控制

disable 控制用于立即终止一个过程。disable 语句可以用于终止某个 alwaysinitial 过程,通常用于模拟中断或错误处理。

示例:

module disable_example;
    reg clk;
    
    initial begin
        clk = 0;
        #10 disable clk;  // 10 时间单位后禁用时钟过程
    end
    
    always begin
        #5 clk = ~clk;  // 时钟信号反转
    end
endmodule

在这个例子中,clk 信号会在 10 时间单位后停止反转。


Verilog 过程结构实例

示例 1:组合逻辑描述

module comb_logic_example(input a, b, c, output d);
    always @* begin
        d = a & b | c;  // 按位与和按位或组合
    end
endmodule

示例 2:时序逻辑描述

module seq_logic_example(input clk, reset, output reg [3:0] counter);
    always @ (posedge clk or posedge reset) begin
        if (reset)
            counter <= 4'b0000;  // 重置计数器
        else
            counter <= counter + 1;  // 计数器加 1
    end
endmodule

示例 3:有限状态机(FSM)

module fsm_example(input clk, reset, input start, output reg [1:0] state);
    typedef enum reg [1:0] {S0, S1, S2} state_t;
    state_t current_state, next_state;
    
    always @ (posedge clk or posedge reset) begin
        if (reset)
            current_state <= S0;
        else
            current_state <= next_state;
    end
    
    always @ (current_state or start) begin
        case (current_state)
            S0: next_state = start ? S1 : S0;
            S1: next_state = S2;
            S2: next_state = S0;
            default: next_state = S0;
        endcase
    end
endmodule


参考资料