【FPGA】学习笔记—{Verilog}—{一、Verilog设计初步}
1.1 Verilog简介
Verilog是一种硬件描述语言。
Idea→行为级描述→RTL描述→门(Gate)级网表→物理版图
1.2 Verilog模块的结构
1.2.1 Verilog程序的特点
- ●Verilog程序的基本设计单元是“模块”(
module
);
●每个模块的内容都嵌在module
和endmodule
之间;
●每个模块实现特定的功能。 - ●每个模块首先要进行端口定义;
●并说明输入和输出口(input
、output
或inout
);
●再对模块的功能进行定义。 - ● 除
endmodule
等少数语句外,每个语句的最后必须有分号 。 - 注释:
●//······
●/*······*/
1.2.2 Verilog程序的4个主要部分
1、模块声明
1、模块声明包括:模块名字,模块输入、输出端口列表。
2、格式:
module 模块名(端口1,端口2,端口3,……)
3、模块结束的标志为关键字 endmodule
2、端口(Port)定义
1、端口分类:
端口是模块与外界连接和通信的信号线
● input:输入端口
● output:输出端口
● inout:双向端口
2、格式:
input 端口名1,端口名2,…………端口名n; //输入端口
output 端口名1,端口名2,…………端口名n; //输出端口
inout 端口名1,端口名2,…………端口名n; //双向端口
3、注意:!!!
● 每个端口需要进行端口类型声明(输入、输出还是双向端口)和数据类型声明(wire型、reg型还是其他类型)
● 输入和双向端口不能声明为寄存器型。
●在测试模块中不需要定义端口。
3、信号类型声明
●模块中所有用到的信号(包括端口信号、节点信号等)都必须进行数据类型的定义。
●Verilog语言提供的各种信号类型,分别模拟实际电路中的 各种物理连接和物理实体。
●若信号的数据类型没有定义,则综合器将其默认为是wire
型。
●在Verilog-2001标准中,规定可以将端口声明和信号类型声明放在一条语句中完成。
●端口声明和信号类型声明可以都放在模块列表中,而不是模块内部。
4、逻辑功能定义
1、用assign持续赋值语句定义。
●assign语句一般用于组合逻辑的赋值,称为持续赋值方式
●格式:assign 结果信号名=表达式;
例:assign f=~((a&b)|(~(c&d)));
2、用always过程块定义。
●格式:
always @(敏感信号列表)
begin
//过程赋值
//if-else,case语句;for循环语句
//task,function调用
end
●例:见 例
描述3,4
3、调用元件(元件例化)。
例
用Verilog对该电路描述:
描述1:
module aoi(a,b,c,d,f); //模块名为aoi,端口列表a,b,c,d,f
input a,b,c,d; //模块输入端为a,b,c,d
output f; //模块输出端为f
wire a,b,c,d,f; //定义信号的数据类型
assign f=~((a&b)|(~(c&d))); //逻辑功能描述
endmodule
描述2:
module aoi //将端口类型和信号类型的声明都放在模块列表
(input wire a,b,c,d, //在Verilog-2001标准中,规定可以将端口声明和信号类型声明放在一条语句中完成。
output wire f);
assign f=~((a&b)|(~(c&d)));
endmodule
描述3:
module aoi(a,b,c,d,f);
input a,b,c,d;
output f;
reg f; //在always过程块中赋值的变量应定义为reg型
always @(a or b or c or d) //always过程块及敏感信号列表
begin
f=~((a&b)|(~(c&d))); //逻辑功能描述
end
endmodule
描述4:
module aoi //模块声明采用Verilog-2001格式
(input a,b,c,d,
output reg f);
always @(*) //通配符,等价于a or b or c or d
begin
f=~((a&b)|(~(c&d))); //逻辑功能描述
end
endmodule