“always”块可用很多种描述手段来表达逻辑,例如上例中就用了“if...else”语句来表达逻辑关系。如按一定的风格来编写“always”块,可以通过综合工具把源代码自动综合成用门级结构表示的组合或时序逻辑电路。需要注意的是,如果用Verilog模块实现一定的功能,首先应该清楚哪些是同时发生的,哪些是顺序发生的。
上面3个例子分别采用了“assign”语句、实例元件和“always”块。这3个例子描述的逻辑功能是同时执行的。也就是说,如果把这3项写到一个Verilog模块文件中去,它们的次序不会影响逻辑实现的功能。这3项是同时执行的,也就是并发的。
然而,在“always”模块内,逻辑是按照指定的顺序执行的。“always”块中的语句称为“顺序语句”,因为它们是顺序执行的。请注意,两个或更多的“always”模块也是同时执行的,但是模块内部的语句是顺序执行的。
看一下“always”内的语句,就会明白它是如何实现功能的。“if…else… if”必须顺序执行,否则其功能就没有任何意义。如果else语句在if语句之前执行,功能就会不符合要求。为了能实现上述描述的功能,“always”模块内部的语句将按照书写的顺序执行。
例4:自行设计的三态驱动器。
module trist1(out,in,enable); //三态启动器模块端口声明
output out; //端口说明
input in, enable;
mytri tri_inst(out,in,enable);//实例化由mytri模块定义的实例元件tri_inst
endmodule
module mytri(out,in,enable); //三态启动器模块端口声明
output out; //端口说明
input in, enable;
assign out = enable? in : 'bz; //三态启动器算法描述
endmodule
这个例子通过另一种方法描述了一个三态门。在这个例子中存在着两个模块。模块trist1调用由模块mytri定义的实例元件tri_inst。模块trist1是顶层模块。模块mytri则被称为子模块。
通过上面的例子可以看到。
模块的内容包括I/O声明、I/O说明、内部信号声明和功能定义。
模块的端口声明了模块的输入输出端口,其格式如下:
Module 模块名(端口1,端口2,端口3,端口4, …);
I/O说明的格式如下:
输入口:input 端口名1,端口名2,…,端口名i; //(共有i个输入口)
输出口:output 端口名1,端口名2,…,端口名j; //(共有j个输出口)
上一页 [1] [2] [3] [4] [5] [6] [7] 下一页
本文关键字:程序 电脑-单片机-自动控制,电子学习 - 基础知识 - 电脑-单片机-自动控制