一、常量
整数
:整数可以用二进制
b
或
B
,八进制
o
或
O
,十进制
d
或
D
,十六进制
h
或
H
表示,例
如,
8’b00001111
表示
8
位位宽的二进制整数,
4’ha
表示
4
位位宽的十六进制整数。
X 和
Z
:
X
代表不定值,
z
代表高阻值,例如,
5’b00x11
,第三位不定值,
3’b00z
表示最低位
为高阻值。
下划线
:在位数过长时可以用来分割位数,提高程序可读性,如
8’b0000_1111
参数
parameter
: parameter
可以用标识符定义常量,运用时只使用标识符即可,提高可读性
及维护性,如定义
parameter width = 8 ;
定义寄存器
reg [width-1:0] a;
即定义了
8
位宽度的寄存器。
参数的传递:在一个模块中如果有定义参数,在其他模块调用此模块时可以传递参数,并可
以修改参数,如下所示,在
module
后用
#
()表示。
例如定义模块如下:
module
rom
#(
parameter
depth
=
15
,
parameter
width
=
8
)
(
input
[
depth
-
1
:
0
]
addr
,
input
[
width
-
1
:
0
]
data
,
output
result
) ;
endmodule
调用模块 :
module
top
() ;
wire
[
31
:
0
]
addr
;
wire
[
15
:
0
]
data
;
wire
result
;
rom
#(
.
depth
(
32
),
.
width
(
16
)
)
r1
(
.
addr
(
addr
) ,
.
data
(
data
) ,
.
result
(
result
)
) ;
endmodule
Parameter
可以用于模块间的参数传递,而
localparam
仅用于本模块内使用,不能用于参数
传递。
Localparam
多用于状态机状态的定义。
二、变量
变量是指程序运行时可以改变其值的量,下面主要介绍几个常用了变量类型。
1、Wire型
Wire
类型变量,也叫网络类型变量,用于结构实体之间的物理连接,如门与门之间,不能储
存值,用连续赋值语句
assign
赋值,定义为
wire [n-1:0] a ;
其中
n
代表位宽,如定义
wire a ; assign
a = b ;
是将
b
的结点连接到连线
a
上。如下图所示,两个实体之间的连线即是
wire
类型变量。
2、Reg型
Reg
类型变量,也称为寄存器变量,可用来储存值,必须在
always
语句里使用。其定义为
reg [n-1:0] a ;
表示
n
位位宽的寄存器,如
reg [7:0] a;
表示定义
8
位位宽的寄存器
a
。如下所示定
义了寄存器
q
,生成的电路为时序逻辑,右图为其结构,为
D
触发器。
module
top
(
d
,
clk
,
q
) ;
input
d
;
input
clk
;
output reg
q
;
always
@(
posedge
clk
)
begin
q
<=
d
;
end
endmodule
也可以生成组合逻辑,如数据选择器,敏感信号没有时钟,定义了
reg Mux
,最终生成电路
为组合逻辑。
module
top
(
a
,
b
,
c
,
d
,
sel
,
Mux
) ;
input
a
;
input
b
;
input
c
;
input
d
;
input
[
1
:
0
]
sel
;
output reg
Mux
;
always
@(
sel
or
a
or
b
or
c
or
d
)
begin
case
(
sel
)
2'b00
:
Mux
=
a
;
2'b01
:
Mux
=
b
;
2'b10
:
Mux
=
c
;
2'b11
:
Mux
=
d
;
endcase
end
endmodule
3、Memory型
可以用
memory
类型来定义
RAM,ROM
等存储器,其结构为
reg [n-1:0]
存储器名
[m-1:0]
,意义
为
m
个
n
位宽度的寄存器。例如,
reg [7:0] ram [255:0]
表示定义了
256
个
8
位寄存器,
256
也即
是存储器的深度,
8
为数据宽度。