跳转至

模块的结构

构成:接口 + 逻辑功能

module block(a, b, c, d);
    // 信号流向
    input a, b;
    output c, d;
    // 逻辑功能
    assign c = a | b;
    assign d = a & b;
endmodule

端口定义

端口声明:

module 模块名(1, 2, 3, ...);

模块引用:

  1. 顺序引用

    模块名(连接端口1信号名, 连接端口2信号名, ...);
    

  2. 指定名称

    模块名(.端口1(连接信号1), .端口2(连接信号2), ...);
    

模块内容

I/O 说明:

  • 输入口:input[信号位宽-1:0] 端口名;
  • 输出口:output[信号位宽-1:0] 端口名;
  • 输入/输出口:inout[信号位宽-1:0] 端口名;

内部信号说明:模块内用到的wire, reg类型变量的说明

reg [width-1:0] R1, R2;
wire [width-1:0] W1, W2;

功能定义:

  1. assign声明

    assign a = b & c;
    

    常用于描述组合逻辑

  2. 实例原件

    and #2 u1(q, a, b); // 相当于调入库文件
    

    要求每个实例元件的名字唯一

  3. always块

    always @ (posedge clk or posedge clr) begin
        if (clr) q <= 0;
        else if (en) q <= d;
    end
    

    既能描述组合逻辑,又能描述时序逻辑

特性:

  • assign, always语句间并发,always语句内按顺序执行(always块内的语句称为顺序语句,always块称为过程块)
  • 过程块(initial, always等)、连续赋值语句、实例引用并行,表示一种通过变量名相互连接的关系,在同一模块中三者秩序没有关系
  • 只有连续赋值语句assign和实例引用语句可以独立于过程块而存在于模块的功能定义部分