always用在可综合的描述当中,一般情况下由敏感列表触发(至于什么是敏感列表,敏感列表怎么用,请参考其他书籍,我后面也会做一些记载),也就是用在描述RTL级的描述当中,通常被用来对硬件的功能进行描述,可以实现组合逻辑和实现逻辑的功能。
上面没有给出initial格式和always格式只是提了一下简单应用。
⑦程序的主体大多可以由结构描述和行为描述构成
模块的例化:
①模块的例化主要是为实现总体的功能,比如说我要设计一块芯片,这个芯片的某个功能可以有某个芯片来完成,那我就可以调用这个芯片,例化就是调用这么一个概念。
②例化可以使用位置映射,也可使用名称映射,由于位置映射可读性太差,容易出错,所有建议使用名称映射。下面是名称映射的格式:
被调用(例化)的模块名字 自定义的例化模块名(
被调用(例化)模块的端口名 (本模块中的线网变量名),
被调用(例化)模块的端口名 (本模块中的线网变量名)
③悬空处理:
在模块例化时,如果被例化的模块输入管脚悬空,则该输入为高阻Z,相当于与外界隔绝,但是实际电路中。。。
如果将输出管脚悬空,则该输出管脚将被废弃掉。
④不同端口位宽处理
当模块例化端口和被例化的端口位宽不同时,端口通过无符号数的右对齐截断方式进行匹配。举个例子说:
参数定义与映射:
①参数定义就是parameter 那一部分了,也就是可以用一个标识符表示一个固定的参数,当然`define这种宏定义也可以实现这种功能,这样子提高程序的可维护性和可读性。
使用`define时语法为:`define A 2‘b10 或者`define A 2.
一般把`define宏定义语句放在模块最前面,并且要注意,无论是在子模块还是顶层模块中,A 的值都代表2(调用时为 `A)(全局参数)。
使用parameter定义的语法为 parameter A = 2或者parameter A= 2’d2;
一般放在模块名字和模块端口列表之间:模块名 #(parameter A = XX,。。。。。)(端口列表);使用parameter定义的参数只在当前模块中有用(局部参数)
localparam定义时,上层模块不能调用传递参数。
②参数传递:
参数传递就是在编译或者仿真的时候,进行维护时,对参数空闲重新复制而更改其值。传递的参数是子模块中定义的parameter,传递的方法有两种:
(1)使用’#’符号:在同一模块中使用’#’符号,参数赋值顺序必须与原始模块定义的顺序相同,并不是一定要给所以的参数赋值,但是不允许跳过任何一个参数,即使是保持不变的值也要写在相应的位置。说了这么一大坨,还是举个例子吧: