verilog模块的结构、数据类型、变量和基本运算符

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
x和z值: 不定值和高阻值 如:4’b10x0、4’b101z、12’dz、12’d?、
8‘h4x
3.2.1 常量
数字
负数: 位宽前加-号,内部是补码 如:-1=-32’1=32’hFFFFFFFF
• 1) 默认是32位、十进制
下划线: 仅增加可读性 如:16’b10x0_0000_0000_1111
assign out2 = d & ~out1 ; clk
always (posedge clk) begin out1 <= d ; end
DQ
DFF
out1
endmodule
Verilog中两种不同的赋值语句
• 不阻塞(non-blocking) 赋值语句:
always (posedge clk)
- 时序电路中硬件没有对应的电路,因而综合结果未知。
3.2 数据类型及常量和变量
• 数据类型用来表示硬件电路的数据存储和传 送元素的
• 总共有19种数据类型 • 常用4种:
– reg 型 – wire 型 – integer 型 – parameter 型
3.2.1 常量
数字
整数常量:
• 1) 二进制整数(b或B) • 2) 十进制整数(d或D) • 3) 十六进制整数(h或H) • 4) 八进制整数(o或O) 数字表达方式:<位宽><进制><数字> 如:8’b10000011、4’hf、5’d12、’d12、12
– tri型:用来表示多驱动器驱动的网络型数据
reg型:寄存器类型是数据储存单元的抽象。
– 通过赋值语句可以改变寄存器储存的值,其作用与改变 触发器储存的值相当,默认值为x。在always 块内被赋值 的每一个变量必须是reg型。
wire tri reg型的定义格式相同
3.2.2 变量
变量即在程序运行过程中其值可以改变的量
module block1(a, b, —, —, — ); input —, —, —; —— d, — ; assign d = a | ( b & ~c) ; assign e = ( b & ~c );
_______
a d
b e
c
编写Verilog HDL模块的练习
• 请在下面的空格中填入适当的符号 使其成为右图的Verilog 模块 :
b
INV out1
Verilog中reg与wire的不同点
• 用寄存器 ( reg )类型变量生成触发器的例子:
module rw2( clk, d, out1, out2 ) ;
input clk, d;
output out1, out2; reg out1;
d
AND2i1 out2
wire out2;
endmodule
module block3(a,b,c);
output [2:0] c; input [2:0] a,b; ……;
本模块 信号
block b0(.b(b[0]),.a(a[0]),.c(c[0]));
block b1(a[1],b[1],c[1]); endmodule
另一模 块信号
e c
- 用 always 块(过程块):
always (posedge clk or posedge clr)
begin if (clr) q<= 0; else if (en) q<= d;
end
并行和顺序逻辑关系的表示
• 如在模块中逻辑功能由下面三个语句块组成 :
assign cs = ( a0 & ~a1 & ~a2 ) ; // -----1
“AB”=16’b01000001_01000010
3.2.1 常量
参数(parameter)型
参数是一个常量,经常用于定义时延和变量的宽度 如:
parameter BITWIDTH = 8; parameter e=32, a=8,b=16;
模块引用另一模块的实例时,传递参数值
module top; wire [3:0]A4; wire [3:0]F4; decode #(3,4) D1(A4,F4)
按其所带操作数的个 数运算符可分为三种:
• 单目运算符:可以带一个 操作数,操作数放在运算 符的右边。
• 二目运算符:可以带二个 操作数,操作数放在运算 符的两边。
• 三目运算符:可以带三个 操作,这三个操作数用三 目运算符分隔开。
思考题
1. 模块由哪几部分组成?
• Verilog 模块的结构由在module和endmodule 关键词之间的四个主要部分组成:
第三章 模块的结构、数据类型、 变量和基本运算符
3.1 模块的结构
module 模块名(端口信息); 输入/输出说明 内部信号声明 逻辑功能描述
endmodule
3.1 模块的结构
Verilog 模块由两部分组成:端口信息和内部功能。
module block1(a, b, c, d, e); input a, b, c; output d, e;
- 块内的赋值语句同时赋值;
- b 的值被赋成新值 a 的操作, 是与块内其他赋值 同时完成的;
语句
- 建议在时序电路的模块中使用不阻塞赋值;组合逻辑的模 块中使用阻塞赋值。
• 阻塞(blocking) 赋值语句 ( b = a):
- 完成该赋值语句后才能做下一句的操作;
- b 的值立刻被赋成新值 a;
- 输入/输出说明 : input a, b, c ;
- 内部信号: - 功能定义:
output d ; wire x; assign d = a | x ;
assign x = ( b & ~c );
endmodule
编写Verilog HDL模块的练习
• 请在下面的空格中填入适当的符号 使其成为右图的Verilog 模块 :
module block1(a, b, c , d, e ); input a, b, c; output d, e ; assign d = a | ( b & ~c) ; assign e = ( b & ~c );
endmodule
a d
b e
c
模块的端口定义与调用
module block (a,b,c); output c; input a,b; ……;
memory型:通过对reg 型变量建立数组来对存储器 建模,可以描述RAM 型存储器,ROM 存储器和 reg文件。数组中的每一个单元通过一个数组索引 进行寻址。如:reg [3:0] mm [7:0];
mm[7] mm[6] mm[5] mm[4] mm[3] mm[2] mm[1] mm[0]
Verilog中reg与wire的不同点
• 用寄存器 (reg)类型变量生成组合逻辑举例:
module rw1( a, b, out1, out2 ) ;
input a, b;
output out1, out2; reg out1;
a
BUFF out2
wire out2;
assign out2 = a ; always (b) out1 = ~b; endmodule
Verilog模块中的信号
• 只有两种主要的信号类型: - 寄存器类型: reg
在always 块中被赋值的信号,往往代表
触发器,但不一定是触发器。 - 连线类型: wire
用 assign 关键词指定的组合逻辑的信号 或连线
Verilog模块中的信号要点 • 需要注意的是:
- 寄存器 ( reg )类型不一定是触发器。 - 它只是在 always 块中赋值的信号。
begin
b <= a ;
c <= b; end
clk
DQ
DQ
a
DFF
b
DFF
c
Verilog中两种不同的赋值语句
• 阻塞(blocking) 赋值语句:
always (posedge clk)
begin
b= a;
clk
b
c = b; end
DQ
a

DFF
c
两种不同的赋值语句区别要点
• 非阻塞(non-blocking) 赋值语句 ( b<= a):
wire W; top T(); endmodule
module block; parameter P=0;
endmodule
module top; wire W; block B1(); block B2();
endmodule
module note; defparam test.T.B1.P=2, test.T.B2.P=3;
9. 由连续赋值语句assign复制的变量能否是 reg型变量? 不能
思考题
10. 在always块中被赋值的变量能否是wire类 型的?如果不能,那么必须是什么类型的? 他们一定是实际的寄存器吗?
• 不能;必须是reg类型;不一定是实际的寄存器。
and2 and_inst ( qout, a, b);
// -----2
always (posedge clk or posedge clr) //-----3 begin if (clr) q<= 0; else if (en) q<= d; end
三条语句是并行的,它们产生独立的逻辑电路; 而在 always 块中: begin 与 end 之间是顺序执行的。
mm[3]=4’b0110;
mm[7] mm[6] mm[5] mm[4] mm[3] mm[2] mm[1] mm[0]
0110
3.3 运算符及表达式
运算符按其功能 可分为以下几类:
• 算术运算符(+,-,×,/,%) • 赋值运算符(=,<=) • 关系运算符(>,<,>=,<=) • 逻辑运算符(&&,||,!) • 条件运算符(?:) • 位运算符(~,|,^,&,^~) • 移位运算符(<<,>>) • 拼接运算符({ })
endmodule
module decode(A,F); parameter Width=1; parameter P=2; ….
endmodule
参数(parameter)型
在一个模块改变另一模块的参数时,使用defparam命 令
`include “top.v” `include “block.v” `include “note.v” module test;
• 端口分为输入输出和双向端口。
3. 为什么端口要声明信号的位宽?
• 端口代表了电路的输入输出连接线,因此要明确 连线的数量。
4. 能否说模块相当于电路图中的功能模块, 端口相当于功能模块的引脚? 能
思考题
5. 模块中的功能描述可以由哪几类语句或语 句块组成?它们出现的顺序会不会影响功能 的描述?
endmodule
note
test
T top
B2 block
B2 block
3.2.2 变量
变量即在程序运行过程中其值可以改变的量
网络数据类型:表示结构实体之间的物理连接
– wire型:用来表示单个门驱动或连续赋值语句驱动的网络 型数据,默认值为z,常用assign语句或实例元件的输出 赋值。
- 端口信息:
module block1(a, b, c, d );
- 输入/输出说明 : input a, b, c ;
- 内部信号: - 功能定义:
output d ; wire x; assign d = a | x ;
assign x = ( b & ~c );
endmodule
思考题
2. 端口分为几种?
assign d = a | ( b & ~c) ; assign e = ( b & ~c );
a
d
b e
c
endmodule
Verilog HDL模块的结构
• Verilog 模块的结构由在module和endmodule 关键词之间的四个主要部分组成:
- 端口信息:
module block1(a, b, c, d );
端口实现模块互连,要保证连接正确。
Verilog HDL模块中的逻辑表示
• 在Verilog 模块中有三种方法可以生成逻辑电路: - 用 assign 语句(连续赋值语句):
assign cs = ( a0 & ~a1 & ~a2 ) ; a
d
- 用 元件的实例调用:
b
and2 and_inst ( q, a, b);
• 功能描述由:assign语句、实例化门电路和 always块组成。不会。
6. 这几类描述中哪一种直接与电路结构有关?
• 实例化门电路。
思考题
7. 最基本的Verilog变量有哪几种?
• 最基本的Verilog变量:wire和reg
8. wire和reg型变量的差别是什么?
• 无记忆和有记忆 • assign语句赋值和always块内赋值
相关文档
最新文档