博主最近刚开始学习FPGA设计,选用的开发语言是目前比较流行的Verilog,教材选用的是北京航空航天大学出版的《夏宇闻Verilog HDL数字系统设计教程》(第四版),这本书也是比较经典的一本教材,第四版是它的最新版本。在学习的过程中,博主对每一章的知识点进行了梳理,对其中重要的知识点(博主认为的)都做了归纳,当然也有些知识点被博主舍弃掉了。学习的过程中也存在一些没看太明白的地方,对于这些内容,有的没写在总结里,有的在总结里标注出了“存疑”二字,请各位读者阅读时留意。最后也欢迎各位读者指出文章中出现的错误!
第二章 Verilog语法的基本概念
2.1 五个抽象级别: 系统级、算法级、RTL级(寄存器传输级)、门级、开关级。
注: Verilog HDL程序是由模块构成的,每个模块实现特定功能,模块可以进行层次嵌套 除了endmodule 语句外,每个语句和数据的最后必须有分号;
第三章 模块的结构、数据类型、变量和基本运算符号 3.1 模块的结构: 端口定义、I/O说明、内部信号声明以及功能定义
3.1.1 端口定义: module 模块名(口1,口2,口3,......); 两种模块引用方式: 模块名(连接端口1信号名,连接端口2信号名,连接端口3信号名,......); 模块名(.端口名1(连接信号1名),.端口名2(连接信号2名),......); 方法一必须严格按照模块定义的端口顺序来连接,方法二不必严格按照端口顺序对应。
3.1.2 I/O说明: 3.1.2.1 输入口说明: input[信号位宽-1:0] 端口名1; input[信号位宽-1:0] 端口名2;
3.1.2.2 输出口说明: output[信号位宽-1:0] 端口名1; output [信号位宽-1:0] 端口名2;
3.1.2.3 输入/输出口: inout[信号位宽-1:0] 端口名1; inout[信号位宽-1:0] 端口名2;
3.1.3 内部信号说明: wire和reg类型变量的声明 reg[width-1:0] R变量1,R变量2,…; wire[width-1:0] W变量1,R变量2,...;
3.1.4 功能定义: 用assign连续赋值语句,常用来描述组合逻辑电路; 用always块,既可用来描述组合逻辑电路也可用来描述时序逻辑电路,常用来描述时序逻辑电路; 在Verilog模块中所有过程块、连续赋值语句、实例引用都是并行的,只有连续赋值语句和实例引用语句可以独立于过程块而存在于模块的功能定义部分;在always模块内,逻辑是按照指定的顺序执行的,always块内的语句称为“顺序语句”,所以always块也称为“过程块”
3.2 数据类型及其常量和变量: 常用的数据类型有:reg型、wire型、integer型、parameter型
3.2.1 常量: 3.2.1.1 整数的表示形式: <位宽>’<进制><数字>,这是一种全面的描述方式; ‘<进制>数字>采用默认位宽,由机器系统决定,至少32位; <数字>采用默认进制(十进制); 各种进制的表示方法: 二进制:b or B; 八进制:o or O; 十进制:d or D; 十六进制:h or H; 注:位宽指的是转换成二进制数以后的位数。
3.2.1.2 x和z值 x表示不定值,z代表高阻态。一个x可以用来定义十六进制数的4位二进制数的状态,八进制数的3位,二进制数的一位;z的表示方法同x类似,此外z还可写作“?”,在case表达式中建议这种写法,以提高程序的可读性。
3.2.1.3 负数 一个数可以被定义成负数,只须在位宽表达式前加一个减号,减号必须写在数字定义表达式的最前面。 下划线:下划线可以用来分割数的表达式以提高程序的可读性。
3.2.1.4 符号常量: 用parameter来定义一个标识符代表一个常量,称为符号常量; 说明格式如下: parameter 参数名1=表达式,参数名2=表达式,……参数名n=表达式; 参数型常数常用来定义延迟时间和变量宽度
3.2.2 变量: 3.2.2.1 wire型 网络型变量wire结构实体之间的物理连接,不能存储值,而且必须受到驱动器的驱动,没有驱动时该变量就是高阻的,即其值为z。wire型数据常用来表示以assign关键字指定的组合逻辑信号。Verilog程序模块中输入、输出信号类型默认定义为wire型。 wire型信号的定义格式如下: wire [n-1:0]数据名1,数据名2,……数据名i; wire[n:1]数据名1,数据名2,……数据名i;
3.2.2.2 reg型 寄存器是数据存储单元的抽象,寄存器数据类型的关键字是reg。reg数据类型的默认初始值为不定值x。reg型数据常用来表示“always”模块内的指定信号,常代表触发器,“always”模块内每一个被赋值的信号必须被定义成reg型。 reg型数据可以赋正值也可以赋负值,但当一个reg型数据是一个表达式中的操作数时,它的值被当做是无符号数,即正值。 3.2.2.3 memory型 verilog HDL通过对reg型变量建立数组来对存储器建模,格式如下: reg[n-1:0]存储器名[m-1:0]; reg[n-1:0]存储器名[m:1]; reg[n-1:0]定义了每一个存储单元的大小,该存储单元是一个n位的寄存器,[m-1:0] or [m:1]则定义了该存储器有多少个这样的存储单元。 注:在同一个数据类型声明语句里,可以同时定义存储类型数据和reg型数据。
3.3 运算符及表达式 Verilog HDL语言运算符按其功能可以分为以下几类: 算数运算符(+,-,*,/,%); 赋值运算符(=,<=); 关系运算符(<,>,=>,<=); 逻辑运算符(&&,||,!); 条件运算符(?:); 位运算符(~,|,^,&,^~); 拼接运算符({ })。 除法运算结果略去小数,只取整数部分;取模运算(%,也称求余运算符)时,结果的符号位采用模运算式里的第一个操作数的符号位。
注: 在进行算术运算操作时,如果有一个操作数有不确定的值x,则整个结果也为不定值x。 位运算:不同长度的数据进行位运算:系统自动按右端对齐,位数少的操作数会在相应的高位用0填满。 ———————————————— 本文来源于网络,作者「苑同学」
|