Verilog HDL模块化程序设计
2017-11-24向兵
向兵
摘 要:电子技术设计的核心是EDA,目前,EDA技术的设计语言主要有Verilog HDL和VHDL两种,相对来说Verilog HDL语言相对简单,上手快,其语法风格与C语言类似,据统计,Verilog HDL和VHDL的使用比率大概是80%和20%,在中国,大多数电子行业企业都采用Verilog。而模块化的设计让Verilog HDL语言具有思路清晰、逻辑关系明确、可读性强等特点,模块化的设计在Verilog HDL语法设计中也成为主流。
关键词:Verilog EDA 模块化
中图分类号:TP334.7 文献标识码:A 文章编号:1672-3791(2017)09(c)-0012-02
1 EDA的发展现状
在全球范围内,自动化软件市场已比较成熟,年增长速度大概在9%左右,目前,全球知名的自动化软件厂商不足20家,亚洲由于中国和印度是发展中的大国,自动化软件的应用潜力比较大,所以整个亚洲年增长速度大概在15%左右,当然其基数也比较低。
现在EDA技术的发展可以用日新月异来形容,目前EDA技术已在各个方面得到了广泛使用,例如在医疗器械制造过程中,从设计、性能测试及特性分析,都可能涉及到EDA技术。
在EDA软件开发方面,目前主要集中在美国,其中三大商业巨头为Synopsys、Mentor、Cadence,虽然,目前中国的EDA技术已经逐渐在走向成熟,但是想要与美国的设计工程师形成更有力的竞争,中国的设计队伍应该在EDA技术中更深入的了解,研发,必要的时候还可以购入一些最新的EDA技术。可见EDA在以后的发展中有着不可估量的地位。
2 为什么要进行模块化设计
在实际运用中,如果所有的功能都由一个模块来实现,那么会造成模块的设计复杂,思路不清晰,Verilog HDL的模块化设计是一种非常重要的设计方法,不仅能够简化设计流程,而且主流设计思想是“自顶向下”。模块化设计就是将一个大的模块分为一个顶层模块和N个子模块,而顶层模块只需要通过简单的程序代码对子模块进行调用就能实现整体功能。
模块化设计,就和小时候玩积木游戏是一样的,根据不同的应用需求,设计不同的子模块,每个子模块实现不同的功能,各个模块之间都是并行运行的,顶层模块可以通过调用子模块来实现复杂的设计,如果想将所有的子模块连接成一个完整的系统,那么可以通过顶层模块将所有的子模块连接起来。一个子模块也可以在另一个子模块中被调用。
3 顶层模块与子模块的关系图
顶层模块与子模块的关系图如图1所示。
4 模块的概念及其特点
Verilog HDL中的模块可分为顶层模块与子模块,顶层模块可调用任意子模块,子模块内部也可调用其他子模块。而子模块一般是具有具体功能的一段verilog代码,例如一个简单的与门、非门、或门。在顶层模块中,可以同时调用多个模块进行功能的组合。无论是顶层模块还是子模块,都具有以下特点。
(1)每一個模块都是以关键词module开始,以关键词endmodule结束的一段程序。
(2)每一个模块都能完成一种特定的功能。
(3)模块之间都是并行运行的。
(4)模块内部都有端口的声明。
各个子模块之间的端口可用线型变量进行连接。
5 模块的结构
Verilog HDL模块化设计的主要思想就在于“模块设计”。一个模块内部主要由三部分构成:端口声明,变量描述,功能描述(见图2)。
一个简单的模块结构如下:
module <模块名>(<端口描述>);
< 变量描述>
<功能描述>
endmodule
模块名和端口的声明中可以包含英文字母、数字和下划线,并且只能以英文字母开头,它是模块的唯一标识符。
端口描述:定义了该模块与其他模块通讯的外部接口,可作为PLD器件的引脚,也可作为模块之间的连线,根据数据流的方向可以分为输入,输出及双向端口。
变量描述:根据进程模块中数据的需要,可以定义所需要的寄存器变量、线型变量、常量、整型数据等。
功能描述:对具体的端口或变量进行算术运算、逻辑运算、关系运算、位运算等操作。
例如一个简单的单输入D触发器模块设计如下:
module Dtrigger(clk,d,q);//端口描述
input clk,d; //clk,d定义为输入端口
output q;//q定义为输出端口
reg q;//q定义为寄存器类型
always@(posedge clk)// clk信号的上升沿触发
begin
q<=d;//功能描述
end
endmodule
6 模块与模块的连接
若两模块之间的端口需要进行连接,那么首先必须定义好连接端口所用的导线,那么,在Verilog HDL中,可作为导线的变量只有wire类型,所以,在模块调用的时候,常用到wire类型变量来进行端口的连接。
7 模块的调用
模块调用一般是指在顶层模块中对子模块的调用,调用方法有两种一种是位置映射法,严格按照模块定义的端口顺序来连接,不用注明原模块定义时规定的端口名,其语法结构为:
模块名 实例名(连接端口1的信号名,连接端口2的信号名, 连接端口3的信号名,…);
另一种为信号映射法,即利用“.”符号,表明原模块定义时的端口名,再使用括号指明真是端口或导线,其语法结构为:
模块名 实例名(.端口1信号名(连接端口1的信号名),
.端口2信号名(连接端口2的信号名),
.端口3信号名(连接端口3的信号名),
…);
显然,信号映射法同时将信号名和被引用端口名列出来,不必严格遵守端口顺序,不仅降低了代码易错性,还提高了程序的可读性和可移植性。因此,在良好的代码中,一般不使用位置调用法,而采用信号映射法。
参考文献
[1] 康磊,宋彩利,李润洲.数字电路设计及Verilog HDL实现[M].西安电子科技大学出版社,2010.
[2] 周润景,姜攀.基于Quartus II的数字系统Verilog HDL设计实例详解[M].2版.电子工业出版社,2010.
[3] 王静霞.FPGA/CPLD应用技术(Verilog语言版)[M].2版.电子工业出版社,2010.endprint