第3章 Verilog中的常量、变量与数据类型
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
din=0;clk=0;reset=1; #100 reset=0; #20 din=1;#20 din=0;
#20 din=1;#20 din=0;
#20 din=1;#20 din=0;
#20 din=1;#20 din=0; end shifter u1(din,clk,reset,dout); endmodule
supply1, supply0 对应于电源线或接地线
wor, trior
对应于有多个驱动源的线或逻辑连接
wand, triand trireg tri1, tri0
对应于有多个驱动源的线与逻辑连接 对应于有电容存在能暂时存储电平的连接 对应于需要上拉或下拉的连接
如果不明确地说明连接是何种类型,应该是指 wire 类型。
非阻塞赋值用于时序逻辑电路,阻塞赋值用于组合逻辑电路。
1、非阻塞赋值:使用符号“<=”,
特点:在一个块语句内,采用非阻塞赋值的变量在所有语句都执行 完毕后才被赋予新的数值,此前保持原值。
2、阻塞赋值:使用符号“=”,
特点:在一个块语句内,对变量的赋值是立刻生效的。
28
非阻塞赋值: 4位移位寄存器
`timescale 1ns/100ps module shifter(din,clk,reset,dout); input clk,din,reset; output dout; reg[3:0]shifter; always@(posedge clk,posedge reset)
din
clk reset
out
D3 D2 D1 D0
29
非阻塞赋值: 4位移位寄存器
测试代码: module shifter_test_v; reg din,clk,reset; wire dout;
always begin #10 clk=1;#10 clk=0;end initial begin
a
reg_a
reg_sel
sl
reg_b
b
sela
nsl
out
selb
19
3.2 变量
寄存器(register)类型变量的数据类型
寄存器类型变量共有四种数据类型:
类型
功能
.
reg
无符号整数变量,可以选择不同的位宽。
integer 有符号整数变量,32位宽,算术运算可产生2的
补码。
real
有符号的浮点数,双精度。
x和z值:x代表不定值,z代表高阻值(或者?) 8’hfx 8’hzx 8’dx 8’dz
4
Verilog 的四种逻辑值
buf
0 0、低、伪、逻辑低、地、VSS、负插入
buf
1 1、高、真、逻辑高、电源、VDD、正插入
buf
X X、不确定:逻辑冲突无法确定其逻辑值
bufif 1
0
Z HiZ、高阻抗、三态、无驱动源
din
D
out
clk
reset
32
阻塞赋值: 4位移位寄存器
33
阻塞赋值: 4位移位寄存器
为了得到采用阻塞方式实现的移位寄存器,则需要 修改代码:
`timescale 1ns/100ps
endmodule
21
3.2 变量
测试代码
module comp2_test; reg clk,ina,inb; wire out1,out2; always begin #10 clk=1; #10 clk=0; end initial begin clk=0;ina=0;inb=0; #100 ina=0;inb=1; #100 ina=1;inb=0; #100 ina=1;inb=1; end comp2 u1(ina,inb,clk,out1,out2);
语句1; 语句2;
… end
并行块: fork [:块名]
语句1; 语句2;
…
join 并行块是不可综合的,只能 在测试代码中出现。
25
块语句
顺序块和并行块产生波形
`timescale 1ns/100ps module wave_test; reg[1:0] wave1,wave2,wave3,wave4; reg clk; always begin
adder_param u1(din_a,din_b,dout); defparam u1. DATA_WIDTH=9, u1.DELAY=3; endmodule
module test_v; reg[7:0]din_a,din_b; wire [7:0]dout; initial begin din_a=0;din_b=0; #100 din_a=5;din_b=10; #100 din_b=32; #500; end
clk din
shifter[3]
tsetup thold
tsetup thold
30
非阻塞赋值: 4位移位寄存器
31
阻塞赋值: 4位移位寄存器
`timescale 1ns/100ps module shifter(din,clk,reset,dout); input clk,din,reset; output dout; reg[3:0]shifter; always@(posedge clk,posedge reset)
if(reset) shifter<=0; else begin
shifter[3]<=din; shifter[2]<= shifter[3]; shifter[1]<= shifter[2]; shifter[0]<= shifter[1]; end assign dout=shifter[0]; endmodule
adder_param#(12,4)u1(din_a,din_b,dout); endmodule
8
带参数的通用加法器仿真结果
104ns
4ns
100ns
9
参数型常量
说明 用文字参数代替数字量,增加描述的可读性,便于修 改,有助于可重用IP设计,常用于定义延时、线宽、寄 存器位数等物理量。表达式只能包含数字或先前已定义 过的参数 参数定义是局部化的,只在本模块中有效
5
3.1 常量
6
3.1 常量
参数型常量
parameter 参数名1=表达式1,……参数名n=表达式n; parameter Pi=3.1415,F=8’d45; parameter GH=(Pi+F)/2; 例3.1 带参数的通用加法器
`timescale 1ns/100ps module
adder_param(din_a,din_b,dout); parameter DATA_WIDTH=8,DELAY=2; input[DATA_WIDTH-1:0]din_a,din_b; output[DATA_WIDTH-1:0]dout; assign#DELAY dout=din_a+din_b;
23
memory类型
memory类型和reg类型的不同之处:
reg [n-1:0] rega; //一个n位寄存器 reg mema [n-1:0]; //一个由n个1位寄存器构成的存储器 mema[4]=0;第四个存储单元赋值为0
24
3.3 块语句与变量的赋值
一、块语句
顺序块和并行块
顺序块: begin [:块名]
第三章 Verilog中的常量、变量与数据类型
3.1 常量 3.2 变量 3.3 块语句与变量的赋值
3.1 常量
一、数值的表示方法
integer 整型 time 时间型 real 实型 parameter 参数型
2
3.1 常量
一、整数
不同进制数的表示方法:
1、二进制整数(b或B) 2、十进制整数(d或D) 3、十六进制整数(h或H) 4、八进制整数(o或O)
if(reset) shifter=0; else begin
shifter[3] =din; shifter[2] = shifter[3]; shifter[1] = shifter[2]; shifter[0] = shifter[1]; end assign dout=shifter[0]; endmodule
endmodule
7
3.1 常量
参数型常量改写
例3.1 带参数的通用加法器
module test_v; reg[7:0]din_a,din_b; wire [7:0]dout; initial begin din_a=0;din_b=0; #100 din_a=5;din_b=10; #100 din_b=32; #500; end
#10 clk=1; #10 clk=0; end initial clk=0; //定义时钟,并设置clk初始值为0
initial begin
wave1=0;#50 wave1=1 ;#50 wave1=2; #50 wave1=3; #50 wave1=0; end //生成wave1波形
initial fork
end //生成wave3波形 always fork
wave4=0; #50 wave4=1 ; #100 wave4=2; #150 wave4=3; #200 wave4=0; join //生成wave4波形 endmodule
26
顺序块和并行块产生波形
27
3.3 块语句与变量的赋值
二、阻塞赋值和非阻塞赋值
wave2=0;#50 wave2=1 ;#100 wave2=2; #150 wave2=3; #200 wave2=0; join //生成wave2波形
always begin wave3=0; #50 wave3=1 ; #50 wave3=2; #50 wave3=3; #50 wave3=0;
8’b10100010 11’b100_1010_1110 10’D32 32’haa_bb_11_97 8’o234
’d9827 //默认位宽
格式:[位宽][进制]<数字> 129 //默认位宽
3
3.1 常量
在实际设计的代码中,对于任何整数都 要指明其位数,否则会使用默认的位数。
负数:只需要在数字定义表达式前加“-”即可。 -8’d5 -16’h14f8
14
Nets(网络连线)
15
Nets(网络连线)
16
Nets(网络连线)
17
Nets(网络连线)
18
3.2 变量
寄存器(register)类型变量
register 型变量能保持其值,直到它被赋于新的值。 register 型变量常用于行为建模,产生测试的激励信号。 常用行为语句结构来给寄存器类型的变量赋值。
10
3.2 变量
Verilog 有两类变量:
Nets 表示器件之间的物理连接, 称为网络连
接类型
Register 表示抽象的储存单元,称为寄存器/变量
类型
11
12
Nets(网络连线)
Nets(网络连线):
由模块或门驱动的连线。 a
sela
驱动端信号的改变会立刻 传递到输出的连线上。 b
nsl
out
selb
例如:右图上,selb的改
sl
变,会自动地立刻影响或
门的输出。
nets
13
Nets(网络连线)
连接(Nets) 类型变量的种类:
在为不同工艺的基本元件建立库模型的时候,常常需要用不同的
连接类型来与之对应,使其行为与实际器件一致。常见的有以下
几种。
类型
功能
wire, tri
对应于标准的互连线(缺省)
endmodule
10ns
210ns
22
3.2 变量
三、integer类型变量
integer为整数型变量,它表示有符号数,通常位宽是32位。 格式: integer 变量名;
四、memory类型变量
memory类型是通过扩展reg类型变量的地址ห้องสมุดไป่ตู้围来生成的。
格式: reg[n-1:0]存储器名[m-1:0]; 其中,[n-1:0]定义了每个存储单元的位数,[m-1:0]定义了存储单元的 个数。 如:reg[7:0]mema[255:0];定义了名为mema的存储器,共256个字节。 地址范围是0~255.
time
无符号整数变量。
[举例] integer count; time start, stop; real time1; reg [4:0] a;
20
3.2 变量
例3.2 寄存器类型变量综合结果
module comp2(ina,inb,clk,out1,out2); input ina,inb,clk; output out1,out2; reg out1,out2; always@(ina,inb) if(ina>inb)out1=1; else out1=0; always@(posedge clk) if(ina>inb)out2=1; else out2=0;
#20 din=1;#20 din=0;
#20 din=1;#20 din=0;
#20 din=1;#20 din=0; end shifter u1(din,clk,reset,dout); endmodule
supply1, supply0 对应于电源线或接地线
wor, trior
对应于有多个驱动源的线或逻辑连接
wand, triand trireg tri1, tri0
对应于有多个驱动源的线与逻辑连接 对应于有电容存在能暂时存储电平的连接 对应于需要上拉或下拉的连接
如果不明确地说明连接是何种类型,应该是指 wire 类型。
非阻塞赋值用于时序逻辑电路,阻塞赋值用于组合逻辑电路。
1、非阻塞赋值:使用符号“<=”,
特点:在一个块语句内,采用非阻塞赋值的变量在所有语句都执行 完毕后才被赋予新的数值,此前保持原值。
2、阻塞赋值:使用符号“=”,
特点:在一个块语句内,对变量的赋值是立刻生效的。
28
非阻塞赋值: 4位移位寄存器
`timescale 1ns/100ps module shifter(din,clk,reset,dout); input clk,din,reset; output dout; reg[3:0]shifter; always@(posedge clk,posedge reset)
din
clk reset
out
D3 D2 D1 D0
29
非阻塞赋值: 4位移位寄存器
测试代码: module shifter_test_v; reg din,clk,reset; wire dout;
always begin #10 clk=1;#10 clk=0;end initial begin
a
reg_a
reg_sel
sl
reg_b
b
sela
nsl
out
selb
19
3.2 变量
寄存器(register)类型变量的数据类型
寄存器类型变量共有四种数据类型:
类型
功能
.
reg
无符号整数变量,可以选择不同的位宽。
integer 有符号整数变量,32位宽,算术运算可产生2的
补码。
real
有符号的浮点数,双精度。
x和z值:x代表不定值,z代表高阻值(或者?) 8’hfx 8’hzx 8’dx 8’dz
4
Verilog 的四种逻辑值
buf
0 0、低、伪、逻辑低、地、VSS、负插入
buf
1 1、高、真、逻辑高、电源、VDD、正插入
buf
X X、不确定:逻辑冲突无法确定其逻辑值
bufif 1
0
Z HiZ、高阻抗、三态、无驱动源
din
D
out
clk
reset
32
阻塞赋值: 4位移位寄存器
33
阻塞赋值: 4位移位寄存器
为了得到采用阻塞方式实现的移位寄存器,则需要 修改代码:
`timescale 1ns/100ps
endmodule
21
3.2 变量
测试代码
module comp2_test; reg clk,ina,inb; wire out1,out2; always begin #10 clk=1; #10 clk=0; end initial begin clk=0;ina=0;inb=0; #100 ina=0;inb=1; #100 ina=1;inb=0; #100 ina=1;inb=1; end comp2 u1(ina,inb,clk,out1,out2);
语句1; 语句2;
… end
并行块: fork [:块名]
语句1; 语句2;
…
join 并行块是不可综合的,只能 在测试代码中出现。
25
块语句
顺序块和并行块产生波形
`timescale 1ns/100ps module wave_test; reg[1:0] wave1,wave2,wave3,wave4; reg clk; always begin
adder_param u1(din_a,din_b,dout); defparam u1. DATA_WIDTH=9, u1.DELAY=3; endmodule
module test_v; reg[7:0]din_a,din_b; wire [7:0]dout; initial begin din_a=0;din_b=0; #100 din_a=5;din_b=10; #100 din_b=32; #500; end
clk din
shifter[3]
tsetup thold
tsetup thold
30
非阻塞赋值: 4位移位寄存器
31
阻塞赋值: 4位移位寄存器
`timescale 1ns/100ps module shifter(din,clk,reset,dout); input clk,din,reset; output dout; reg[3:0]shifter; always@(posedge clk,posedge reset)
if(reset) shifter<=0; else begin
shifter[3]<=din; shifter[2]<= shifter[3]; shifter[1]<= shifter[2]; shifter[0]<= shifter[1]; end assign dout=shifter[0]; endmodule
adder_param#(12,4)u1(din_a,din_b,dout); endmodule
8
带参数的通用加法器仿真结果
104ns
4ns
100ns
9
参数型常量
说明 用文字参数代替数字量,增加描述的可读性,便于修 改,有助于可重用IP设计,常用于定义延时、线宽、寄 存器位数等物理量。表达式只能包含数字或先前已定义 过的参数 参数定义是局部化的,只在本模块中有效
5
3.1 常量
6
3.1 常量
参数型常量
parameter 参数名1=表达式1,……参数名n=表达式n; parameter Pi=3.1415,F=8’d45; parameter GH=(Pi+F)/2; 例3.1 带参数的通用加法器
`timescale 1ns/100ps module
adder_param(din_a,din_b,dout); parameter DATA_WIDTH=8,DELAY=2; input[DATA_WIDTH-1:0]din_a,din_b; output[DATA_WIDTH-1:0]dout; assign#DELAY dout=din_a+din_b;
23
memory类型
memory类型和reg类型的不同之处:
reg [n-1:0] rega; //一个n位寄存器 reg mema [n-1:0]; //一个由n个1位寄存器构成的存储器 mema[4]=0;第四个存储单元赋值为0
24
3.3 块语句与变量的赋值
一、块语句
顺序块和并行块
顺序块: begin [:块名]
第三章 Verilog中的常量、变量与数据类型
3.1 常量 3.2 变量 3.3 块语句与变量的赋值
3.1 常量
一、数值的表示方法
integer 整型 time 时间型 real 实型 parameter 参数型
2
3.1 常量
一、整数
不同进制数的表示方法:
1、二进制整数(b或B) 2、十进制整数(d或D) 3、十六进制整数(h或H) 4、八进制整数(o或O)
if(reset) shifter=0; else begin
shifter[3] =din; shifter[2] = shifter[3]; shifter[1] = shifter[2]; shifter[0] = shifter[1]; end assign dout=shifter[0]; endmodule
endmodule
7
3.1 常量
参数型常量改写
例3.1 带参数的通用加法器
module test_v; reg[7:0]din_a,din_b; wire [7:0]dout; initial begin din_a=0;din_b=0; #100 din_a=5;din_b=10; #100 din_b=32; #500; end
#10 clk=1; #10 clk=0; end initial clk=0; //定义时钟,并设置clk初始值为0
initial begin
wave1=0;#50 wave1=1 ;#50 wave1=2; #50 wave1=3; #50 wave1=0; end //生成wave1波形
initial fork
end //生成wave3波形 always fork
wave4=0; #50 wave4=1 ; #100 wave4=2; #150 wave4=3; #200 wave4=0; join //生成wave4波形 endmodule
26
顺序块和并行块产生波形
27
3.3 块语句与变量的赋值
二、阻塞赋值和非阻塞赋值
wave2=0;#50 wave2=1 ;#100 wave2=2; #150 wave2=3; #200 wave2=0; join //生成wave2波形
always begin wave3=0; #50 wave3=1 ; #50 wave3=2; #50 wave3=3; #50 wave3=0;
8’b10100010 11’b100_1010_1110 10’D32 32’haa_bb_11_97 8’o234
’d9827 //默认位宽
格式:[位宽][进制]<数字> 129 //默认位宽
3
3.1 常量
在实际设计的代码中,对于任何整数都 要指明其位数,否则会使用默认的位数。
负数:只需要在数字定义表达式前加“-”即可。 -8’d5 -16’h14f8
14
Nets(网络连线)
15
Nets(网络连线)
16
Nets(网络连线)
17
Nets(网络连线)
18
3.2 变量
寄存器(register)类型变量
register 型变量能保持其值,直到它被赋于新的值。 register 型变量常用于行为建模,产生测试的激励信号。 常用行为语句结构来给寄存器类型的变量赋值。
10
3.2 变量
Verilog 有两类变量:
Nets 表示器件之间的物理连接, 称为网络连
接类型
Register 表示抽象的储存单元,称为寄存器/变量
类型
11
12
Nets(网络连线)
Nets(网络连线):
由模块或门驱动的连线。 a
sela
驱动端信号的改变会立刻 传递到输出的连线上。 b
nsl
out
selb
例如:右图上,selb的改
sl
变,会自动地立刻影响或
门的输出。
nets
13
Nets(网络连线)
连接(Nets) 类型变量的种类:
在为不同工艺的基本元件建立库模型的时候,常常需要用不同的
连接类型来与之对应,使其行为与实际器件一致。常见的有以下
几种。
类型
功能
wire, tri
对应于标准的互连线(缺省)
endmodule
10ns
210ns
22
3.2 变量
三、integer类型变量
integer为整数型变量,它表示有符号数,通常位宽是32位。 格式: integer 变量名;
四、memory类型变量
memory类型是通过扩展reg类型变量的地址ห้องสมุดไป่ตู้围来生成的。
格式: reg[n-1:0]存储器名[m-1:0]; 其中,[n-1:0]定义了每个存储单元的位数,[m-1:0]定义了存储单元的 个数。 如:reg[7:0]mema[255:0];定义了名为mema的存储器,共256个字节。 地址范围是0~255.
time
无符号整数变量。
[举例] integer count; time start, stop; real time1; reg [4:0] a;
20
3.2 变量
例3.2 寄存器类型变量综合结果
module comp2(ina,inb,clk,out1,out2); input ina,inb,clk; output out1,out2; reg out1,out2; always@(ina,inb) if(ina>inb)out1=1; else out1=0; always@(posedge clk) if(ina>inb)out2=1; else out2=0;