手把手教你学veriolg(十一)--Verilog 过程结构

目录

Verilog 过程结构

1. always 块

示例:使用 always 块

2. 敏感列表

示例:使用敏感列表

3. initial 块

示例:使用 initial 块

4. final 块

示例:使用 final 块

5. 流程控制语句

示例:使用流程控制语句

6. repeat 和 forever 循环

示例:使用 repeat 和 forever 循环

总结


 

Verilog 过程结构

在 Verilog 中,过程结构(Procedural Constructs)用于描述时序逻辑,它允许你在特定的条件下或在某些事件发生时执行一系列的语句。过程结构通常包含在 always 块中,也可以包含在 initialfinal 块中。理解 Verilog 的过程结构对于设计时序逻辑和控制流非常重要。

1. always 块

always 块是最常见的过程结构之一,它定义了一组语句,这些语句在特定的敏感列表(sensitivity list)中的事件发生时被执行。always 块可以用来描述时序逻辑和组合逻辑。

示例:使用 always 块

 

verilog

深色版本

module always_example;
    input clk, reset_n;
    output reg q;

    always @(posedge clk or negedge reset_n) begin
        if (!reset_n) begin
            q <= 1'b0; // 重置
        end else begin
            q <= ~q; // 反相
        end
    end
endmodule

在这个例子中,q 的值在 clk 的上升沿或 reset_n 的下降沿改变。如果没有 reset_n 的下降沿,q 的值将在每次 clk 上升沿时翻转。

2. 敏感列表

敏感列表定义了哪些事件会触发 always 块中的语句执行。常见的敏感事件包括:

  • 边沿检测posedge(上升沿)、negedge(下降沿)。
  • 任何改变*(通配符,表示任何变化)。
  • 特定信号:信号名称,表示该信号的任何变化都会触发 always 块。

示例:使用敏感列表

 

verilog

深色版本

module sensitivity_list_example;
    input clk, rst;
    output reg q;

    always @(posedge clk or posedge rst) begin
        if (rst) begin
            q <= 1'b1; // 重置
        end else begin
            q <= ~q; // 反相
        end
    end
endmodule

在这个例子中,q 的值在 clk 的上升沿或 rst 的上升沿改变。

3. initial 块

initial 块在模块初始化时执行一次,常用于设置初始条件或执行一次性任务。

示例:使用 initial 块

 

verilog

深色版本

module initial_block_example;
    reg [3:0] count;

    initial begin
        count = 4'd0; // 初始化计数器
    end

    always @(posedge clk) begin
        count <= count + 1; // 计数
    end
endmodule

在这个例子中,count 的初始值在模块初始化时被设置为 0

4. final 块

final 块在仿真结束时执行一次,常用于清除资源或记录最终状态。

示例:使用 final 块

 

verilog

深色版本

module final_block_example;
    reg [3:0] count;

    final begin
        $display("Final count: %d", count); // 输出最终计数
    end

    always @(posedge clk) begin
        count <= count + 1; // 计数
    end
endmodule

在这个例子中,在仿真结束时,count 的最终值会被打印出来。

5. 流程控制语句

流程控制语句用于控制过程块中的语句执行顺序。常见的流程控制语句包括:

  • if/else:条件分支。
  • case:多分支选择。
  • for:循环。
  • while:循环。

示例:使用流程控制语句

 

verilog

深色版本

module control_flow_example;
    input [1:0] sel;
    output reg [3:0] out;

    always @(sel) begin
        case (sel)
            2'b00: out = 4'd0;
            2'b01: out = 4'd1;
            2'b10: out = 4'd2;
            2'b11: out = 4'd3;
            default: out = 4'd0;
        endcase
    end
endmodule

在这个例子中,根据选择信号 sel 的值,out 的值被设置为不同的常数值。

6. repeat 和 forever 循环

  • repeat:执行指定次数的循环。
  • forever:无限循环,通常用于生成周期信号。

示例:使用 repeat 和 forever 循环

 

verilog

深色版本

module repeat_forever_example;
    output reg clk;
    parameter CLK_PERIOD = 10;

    initial begin
        clk = 0;
        forever begin
            #CLK_PERIOD/2 clk = ~clk; // 产生时钟信号
            #CLK_PERIOD/2;
        end
    end
endmodule

在这个例子中,clk 信号每 CLK_PERIOD 时间单位翻转一次,产生了一个周期性的时钟信号。

总结

过程结构是 Verilog 中用于描述时序逻辑的关键部分,通过合理地使用 always 块、initial 块、final 块以及流程控制语句,可以精确地控制硬件的行为。希望本节的内容能够帮助你更好地理解和使用 Verilog 的过程结构,并在实际的设计中发挥重要作用。继续深入学习 Verilog 的其他特性和高级功能,将有助于你更好地掌握这门语言,并应用于实际的硬件设计中。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值