Verilog是一种硬件描述语言。
Idea→行为级描述→RTL描述→门(Gate)级网表→物理版图
module
);module
和endmodule
之间;input
、output
或inout
);endmodule
等少数语句外,每个语句的最后必须有分号 。//······
/*······*/
1、模块声明包括:模块名字,模块输入、输出端口列表。
2、格式:
module 模块名(端口1,端口2,端口3,……)
3、模块结束的标志为关键字 endmodule
1、端口分类:
端口是模块与外界连接和通信的信号线
● input:输入端口
● output:输出端口
● inout:双向端口
2、格式:
input 端口名1,端口名2,…………端口名n; //输入端口
output 端口名1,端口名2,…………端口名n; //输出端口
inout 端口名1,端口名2,…………端口名n; //双向端口
3、注意:!!!
● 每个端口需要进行端口类型声明(输入、输出还是双向端口)和数据类型声明(wire型、reg型还是其他类型)
● 输入和双向端口不能声明为寄存器型。
●在测试模块中不需要定义端口。
●模块中所有用到的信号(包括端口信号、节点信号等)都必须进行数据类型的定义。
●Verilog语言提供的各种信号类型,分别模拟实际电路中的 各种物理连接和物理实体。
●若信号的数据类型没有定义,则综合器将其默认为是wire
型。
●在Verilog-2001标准中,规定可以将端口声明和信号类型声明放在一条语句中完成。
●端口声明和信号类型声明可以都放在模块列表中,而不是模块内部。
1、用assign持续赋值语句定义。
●assign语句一般用于组合逻辑的赋值,称为持续赋值方式
●格式:assign 结果信号名=表达式;
例:assign f=~((a&b)|(~(c&d)));
2、用always过程块定义。
●格式:
always @(敏感信号列表)
begin
//过程赋值
//if-else,case语句;for循环语句
//task,function调用
end
●例:见 例
描述3,4
3、调用元件(元件例化)。
例
F = a b + c d ‾ ‾ F=\overline{ab+\overline{cd}} F=ab+cd
用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