简单模块
Verilog的基本设计单元是“模块”(block)。一个模块是由两部分组成的,一部分描述接口,另一部分描述逻辑功能,即定义输入是如何影响输出的。
模块的端口声明了模块的输入输出口:
module 模块名(口1,口2,口3,口4, ………);
模块的内容包括I/O说明、内部信号声明、功能定义。
输入口: input 端口名1,端口名2,………,端口名i; //(共有i个输入口)
输出口: output 端口名1,端口名2,………,端口名j; //(共有j个输出口)
I/O说明也可以写在端口声明语句里。
其格式如下: module module_name(input port1,input port2,…output port1,output port2… );
内部信号说明:在模块内用到的和与端口有关的wire 和 reg 变量的声明。
功能定义:模块中最重要的部分是逻辑功能定义部分。有三种方法可在模块中产生逻辑。
1).用“assign”声明语句 如: assign a = b & c; 这种方法的句法很简单,只需写一个“assign”,后面再加一个方程式即可。
2).用实例元件 如: and and_inst( q, a, b ); 采用实例元件的方法像在电路图输入方式下,调入库元件一样。要求 每个实例元件的名字必须是唯一的,以避免与其他调用与门(and)的实例混淆。
3).用“always”块
采用“assign”语句是描述组合逻辑最常用的方法之一。而“always”块既可用于描述组合逻辑也可 描述时序逻辑。如按一定的风格 来编写“always”块,可以通过综合工具把源代码自动综合成用门级结构表示的组合或时序逻辑电路。
数据类型及常量、变量
四个基本类型:reg型、wire型、integer型、parameter型
常量
在程序运行过程中,其值不能被改变的量称为常量。
整数
数字声明时,合法的基数格式有 4 中,包括:十进制('d 或 'D),十六进制('h 或 'H),二进制('b 或 'B),八进制('o 或 'O)。数值可指明位宽,也可不指明位宽。一般直接写数字时,默认为十进制表示。
负数
通常在表示位宽的数字前面加一个减号来表示负数。
数值种类
在数字电路中,x代表不定值,z代表高阻值。一个x可以用来定义十六进制数的四位二进制数的状态, 八进制数的三位,二进制数的一位。z的表示方式同x类似。z还有一种表达方式是可以写作?。在使用 case表达式时建议使用这种写法,以提高程序的可读性。
参数(Parameter)型
用parameter来定义常量,即用parameter来定义一个标识符代表一个常量,称为符号 常量,即标识符形式的常量
parameter 参数名1=表达式,参数名2=表达式, …, 参数名n=表达式;
变量
变量即在程序运行过程中其值可以改变的量。
wire型:常用来表示用于以assign关键字指定的组合逻辑信号。Verilog程序模块中输入输出信号 类型缺省时自动定义为wire型。
wire [n-1:0] 数据名1,数据名2,…数据名i; //共有i条总线,每条总线内有n条线路
reg型:寄存器是数据储存单元的抽象。reg类型数据的缺省初始 值为不定值,x。
reg型数据常用来表示用于“always”模块内的指定信号,常代表触发器。通常,在设计中要由“always” 块通过使用行为描述语句来表达逻辑关系。在“always”块内被赋值的每一个信号都必须定义成reg 型。
reg [n-1:0] 数据名1,数据名2,… 数据名i;
reg型只表示被定义的信号将用在“always”块内,理解这一点很重要。并不是说reg型信号一定是寄 存器或触发器的输出。虽然reg型信号常常是寄存器或触发器的输出,但并不一定总是这样。
memory型:memory 型数据是通过扩展reg型数据的地址范围来生成的。
reg [n-1:0] 存储器名[m-1:0];
reg [7:0] mema[255:0];
定义了一个名为mema的存储器,该存储器有256个8位的存储器。该存储器的地址范围是0到 255。注意:对存储器进行地址索引的表达式必须是常数表达式。
一个n位的寄存器可以在一条赋值语句里进行赋值,而一个完整的存储器则不行。
运算符及表达式
1) 算术运算符(+,-,×,/,%)
2) 赋值运算符(=,<=)
3)关系运算符(>,<,>=,<=)
4)逻辑运算符(&&,||,!)
5)条件运算符(?:)
6)位运算符(~,|,^,&,^~)
7)移位运算符(<<,>>)
8)拼接运算符({})
9)其他
按其所带操作数的个数运算符可分为三种:
1) 单目运算符(unary operator):可以带一个操作数,操作数放在运算符的右边。
2) 二目运算符(binary operator):可以带二个操作数,操作数放在运算符的两边。
3) 三目运算符(ternary operator):可以带三个操作,这三个操作数用三目运算符分隔开。
基本的算数运算符
+,-,×,/,%
注意: 在进行算术运算操作时,如果某一个操作数有不确定的值x,则整个结果也为不定值x。
位运算符
1) ~ //取反
2) & //按位与
3) | //按位或
4) ^ //按位异或
5) ^~ //按位同或(异或非)
• 位运算符中除了~是单目运算符以外,均为二目运算符,即要求运算符两侧各有一个操作 数.
• 位运算符中的二目运算符要求对两个操作数的相应位进行运算操作。
逻辑运算符
1) && 逻辑与
2) || 逻辑或
3) ! 逻辑非
Verilog就直接看菜鸟教程的,已经很详细了,不必再自己整理了。