1.1 模块的结构
Verilog的基本设计单元是模块(block)。一个模块是由两部分组成的,一部分描述接口,另一部分描述逻辑功能,即定义输入是如何影响输出的。
例:
module block(a,b,c,d);
input a,b;
output c,d;
assign c = a | b;
assign d = a & b;
endmodule
从这个例子可以看出,Verilog结构位于module和endmodule声明语句之间,每个程序有4个主要部分:端口定义、I/O说明、内部信号声明和功能定义。
1.1.1 模块的端口定义
模块的端口声明了模块的输入输出口。其格式如下:
module 模块名(口1,口2,口3,口4,.......);
模块的端口表示的是模块的输入和输出口名,也就是说它与别的模块联系端口的标识。在模块被引用时,在引用的模块中,有些信号要输入到被引用的模块中,有的信号需要从被引用的模块中取出来。在引用模块时其端口可以用两种方法连接。
(1)在引用时,严格按照模块定义的端口顺序来连接,不用标明原模块定义时规定的端口名,例如:
模块名(连接端口1信号名,连接端口2信号名,连接端口3信号名,.......)
(2)在引用时用“.”符号,标明原模块是定义时规定的端口名,例如:
模块名(.端口1名(连接信号1名),.端口2名(连接信号2名),.端口3名(连接信号3名).......)
这样表示的好处是在于可以用端口名与被引用的模块的端口相对应,而不必严格按照端口顺序对应,提高了程序的可读性和可移植性。
3.1.2 模块内容
1、I/O说明的格式
输入口:input [信号位宽-1:0]端口名1;
input [信号位宽-1:0]端口名2;
输出口:outputp[信号位宽-1:0]端口名1
outputp[信号位宽-1:0]端口名2
输入/输出口:inout[信号位宽-1:0]端口1
inout[信号位宽-1:0]端口2
IO说明也可以写在端口声明语句里,如module modulename (input a,output b,inout c)
2、内部信号说明
在模块内用到的和端口有关的wire和reg类型变量的声明
如:reg[width-1:0]R变量1,变量2....
3、功能定义
模块中最重要的部分是逻辑功能定义部分,有三种方法可在模块中产生逻辑。
(1)用assign声明语句,如assign a = b &c
(2)用实例元件 如and #2 u1(a,q,b)
(3)用always 块,如always @(posedge clk or posedge clr)....
4、要点总结
Verilog初学者一定要深入理解并记住
(1)在模块中所有过程块(如initial块;always块)、连续赋值语句、实例引用都是并行的
(2)它们表示的是一种通过变量名互相连接的关系
(3)在同一模块中这三者出现的先后顺序没有关系
(4)只有连续赋值语句assign和实例引用语句可以独立于过程快而存在于模块的功能定义部分,
以上四点和C语言有很大的不同,许多与C语言类似的语句只能出现在过程块中,而不能随意的出现在模块功能定义的范围内。
1.2 数据类型及其常量和变量
Verilog HDL总共有19种数据类型,数据类型是用来表示数字电路硬件中的数据存储和传送元素的。
先介绍4种最基本的数据类型,它们是:reg型、wire型、integer型、parameter型
其余类型是:large型、medium型、scalared型、time型、small型、tri型、tril型、triand型、trior型、trireg型、vectored型、wand型、wor型
2.1 常量
在程序中,其值不能被改变的量称为常量。
1、数字
(1)整数 在verilog种,整型常量即整常数有以下四种进制表示形式:
1)二进制数(b或B)
2)十进制数(d或D)
3)十六至进制数(h或H)
4)八进制数(o或O)
数字表达方式有以下3种:
1)<位宽><进制><数字>,这是一种全面描述的方式
2)在<进制><数字>这种描述方式中,数字的位宽采用默认位宽(这由具体的机器系统决定,至少32位)
3)在<数字>这种描述方式中,采用默认进制(十进制)
(2)x和z值,在数字电路中,x表示不定值,z代表高阻值。
(3)负数 一个数字可以被定义为负数,只需在位宽表达式前加一个负号,负号必须写在数字定义表达式的最前面。
注意,负号不能放在位宽和机制之间,也不可放在进制和具体的数之间。
(4)下划线 下划线可以用来分隔开数的表达以提高程序的可读性。
2、参数(parameter)型
用parameter来定义一个标识符代表一个常量,称为符号常量。即标识符形式的常量
parameter 参数名1 = 表达式,参数名2 = 表达式,......,参数名n = 表达式;
2.2 变量
变量是一种在程序运行过程中可以改变其值的量,在Verilog中变量的数据类型有很多种,这里指对常用的几种进行介绍。
网络数据类型表示结构实体(如门)之间的物理连接。网络类型的变量不能存储值,而它必须受到驱动器(例如门或连续赋值语句assign)的驱动。如果么有驱动器连接到网络类型的变量上,则该变量就是高阻值的。其值为z。常用的网络连接型包括wire型和tri型。
1、wire型
wire型数据常用来表示用以assign关键字指定的组合逻辑信号。Verilog程序中,输入输出信号默认类型是自动定义为wire型。wire型信号可以用作任何方程式的输入,有可以用做assign语句或实例元件的输出。
2、reg型
寄存器是数据存储单元的抽象。寄存器数据类型的关键字是reg。通过赋值语句可以改变寄存器存储的值,其作用与改变触发器存储的值相当。
注意:reg型信号只表示被定义的信号将用在always中,理解这一点很重要。并不是说,reg信号一定是寄存器或者触发器的输出,虽然reg常常是这么做的,但并不一定总是这样。
3、memory型
Verilog HDL通过对reg型变量建立数组来对存储器建模,可以描述RAM存储器、ROM存储器和reg文件。数组中的每一个单元通过一个数组索引进行寻址。在Verilog中没有多维数组,memory型数据是通过扩展reg型数据的地址范围来生成的。其格式如下:
reg [n-1:0] 存储器名[m-1:0]
在这里定义的是一个有m个寄存器的存储器,并且寄存器是n位的
3、运算符及表达式
1)算术运算符(+、-、*、/、%)
2)赋值运算符(=、<=)
3)关系运算符(<、>、>=、<=)
4)逻辑运算符(&&、||、!)
5)条件运算符(?:)
6)位运算符(~、|、^、&、^~)
7)移位运算符(<<、>>)
8)拼接运算符({})
9)其他
小结
1、在Verilog模块中所有过程块(如initial和always块)、连续赋值语句、实例应用都是并行的。
2、它们表示的是一种通过变量名互相连接的关系
3、在同一模块中各个过程块、各条连续赋值语句和各条实例引用语句这三者出现的先后次序没有关系
4、只有连续赋值语句和实例引用语句,可以独立于过程块而存在于模块的功能定义部分。
5、被实例引用的模块,其端口可以通过不同名的连线或寄存器类型变量连接到别的模块相应输出、输入信号端
6、在always模块内被赋值的每一个信号都须定义为reg型。
最后
以上就是搞怪小霸王最近收集整理的关于Verilog HDL学习——模块的结构、数据类型、变量和基本运算符号的全部内容,更多相关Verilog内容请搜索靠谱客的其他文章。
发表评论 取消回复