1 基础语法
1.1 数据类型
1.1.1 基本数值种类
-
0(逻辑 0 或 "假"):
表示逻辑低电平或布尔值假(False)。 -
1(逻辑 1 或 "真"):
表示逻辑高电平或布尔值真(True)。 -
x 或 X(未知):
表示信号的值不确定。在实际电路中,信号可能为 0 或 1,但具体值未知。在仿真中,x
表示信号的值在当前时刻未定义。 -
z 或 Z(高阻):
表示信号处于高阻抗状态,即信号既不是逻辑 0 也不是逻辑 1。在输入端口没有驱动时,或者在三态逻辑中,当输出被置为高阻抗状态时,信号的值就是z
。
1.1.2 整数数值表示方法
- 基数表示法允许你指定数字的位宽和进制。格式为
<位宽><进制><数字>
。 - 例如,
4'b1011
表示一个4位宽的二进制数,4'd5
表示一个4位宽的十进制数,4'hA
表示一个4位宽的十六进制数,4'o7
表示一个4位宽的八进制数。 - 如果不指定位宽,默认为32位,如
hA
等价于32'hA
。 - 如果不指定进制,默认为十进制,如
123
等价于32'd123
。
1.2 变量和常量定义
1.2.1 数据类型
线网(wire)
wire 类型表示硬件单元之间的物理连线,由其连接的器件输出端连续驱动。如果没有驱动元件连接到 wire 型变量,缺省值一般为 "Z"(高阻态)。
wire interrupt ;
wire flag1, flag2 ;
wire gnd = 1'b0 ;
寄存器(reg)
reg类型用来表示存储单元,它会保持数据原有的值,直到被改写。
reg clk_temp;
reg flag1, flag2 ;
向量
当位宽大于 1 时,wire 或 reg 即可声明为向量的形式。
reg [3:0] counter ; //声明4bit位宽的寄存器counter
wire [32-1:0] gpio_data; //声明32bit位宽的线型变量gpio_data
1.2.2 常量定义
parameter
用于定义模块端口或模块内部的可重定义参数。
作用域: parameter定义的参数在模块内是可见的,并且可以在模块实例化时重新赋值。
实例化时重定义: 在模块实例化时,可以通过指定参数值来改变parameter定义的常量值。
使用场景: 当需要在不同的模块实例中使用不同的值时,parameter非常有用。
module adder #(parameter WIDTH = 8) (
input [WIDTH-1:0] a,
input [WIDTH-1:0] b,
output [WIDTH:0] sum
);
// ...
endmodule
// 在实例化时可以改变WIDTH的值
adder #(.WIDTH(16)) my_adder_inst (
.a(a),
.b(b),
.sum(sum)
);
module my_module(
input wire clk,
input wire [7:0] data_in,
output wire [7:0] data_out
);
parameter N = 8; // 全局参数
parameter M = 16; // 全局参数
// 使用参数
wire [N-1:0] intermediate; // 使用全局参数N
// ...
endmodule
// 实例化模块时传递参数