上升沿触发的T触发器的UDP描述: Primitive t_trrgger(q,clk,t_in); Output q; Reg q;
Input t_in,clk; Table //clk (01) (01) (01) (10) (0x) (1x) ?
t_in 0 1 1 ? 0 0
:state :? :? :? :? :? :? :?
:q :-; :1; :0; :-; :-; :-; :-;
(??)
Endtable Endprimitive
其中(??)表示0、1、x中的一个状态跳到其中的一个状态。
26
Table表项定义 缩记符号 0 1 X或x - 逻辑0 逻辑1 为不定态 输出状态保持不变 说明 用来描述输入输出信号 用来藐视输入输出信号 用来描述输入输出信号 只能用来描述时序逻辑电路的UDP的输出状态 ? B或b (VW) 0或1或x(任意态) 不能用来对输出进行描述 0或1 不能用来对输出进行描述 输入从逻辑值v变化不能用来对输出进行描述,其中的v,w到逻辑值w 是1、0、x、?中的一个 R或r 等价于(01)输入上升不能用来对输出进行描述 跳变 F或f 等价于(10)输入上升不能用来对输出进行描述 跳变 P或p (01)(0x)(x1)中的不能用来对输出进行描述 任意一个表示输入端包含x态的正跳变 N或n (10)(1x)(x0)中的不能用来对输出进行描述 任意一个表示输入端包含x态的负跳变 * 等价于(??)表示输不能用来对输出进行描述 入端的任意变化 第八章:结构描述
结构描述方式就是将硬件描述成一个分级子模块系统的一种描述方式。由于
任何硬件电路都是由一级级不同层次的若干功能单元组成的,所有结构描述方式很适合于用来对电路的结构特点进行描述,这也是“结构描述方式的由来”。
在verilog中,一个模块可以对其它的模块进行调用(也成模块的实例语化),其中调用模块成为层次结构中的上级模块,而被调用模块成为下级模块。
27
与函数调用不同,模块调用实现的不是程序流程的改变,而时代变硬件电路的复制过程:调用模块每一次对被调用的模块进行调用,被调用的模块对应的电路结构就会在调用模块内复制一次,这个硬件拷贝在调用模块内被称为“被调用模块的一个实例”。
如果在一个模块内置包含了对下级模块进行调用的语句(称之为“模块实例语句”),不包含任何行为藐视语句是,则成该模块是采用了结构描述方式的一个“行为描述模块”。
1、在verilog中硬件电路中的各级功能单元被描述成模块,模块具有如下结构: 2、Module<模块名>(端口列表) 声明语句 模块组项 函数与任务定义 Specify Endmodule
其中:声明部分用来对模块端口类型(输入、输出、双向)、模块内部变量(寄存器、连线和存储器类型)以及模块悲惨是进行说明。
模块组项部分是模块功能的描述题部分,用来对模块的功能特点进行描述,在这一部分可以出现具有行为描述性质的语句结构(initial过程块和always过程块或连续赋值语句),也可以出现结构描述项语句(模块实例语句、门及元件实例语句、开关及元件实例语句。如果在这个“模块组项”中只是用了结构描述语句,则改模块就是一个“结构描述模块”。
“specify”用来对模块输入、输出端口之间的路径延时时间量进行说说明,同时还可以用来进行时序检查。 3、对上述的具体说明:
端口的分隐式端口名形式和显式端口名形式两种形式 隐式端口名形式:
(<端口表达式1><端口表达式2>?<端口表达式n>)
其中端口表达式可以是模块被的某个变量的标识符,模块内某个矢量的变量的某一位或某几位,或者是以上三种组合。
28
显式端口名形式:
(.<端口名1>(<端口表达式1>),.<端口名2>(<端口表达式2>),.<端口名n>(<端口表达式n>))
端口声明的作用对象智能是模块端口的内部变量,而不能是端口名。 4、模块实例语句
模块实例语句的基本格式:
<模块名><参数值列表><实例名>(<端口连接表>)
其中<模块名>是在进行模块定义是为被调用模块指定的模块名。
模块名和实例名的区别:模块名标志着不同的模块,用来区分电路单元的不同种类;实例名则标志着不同的模块实例,用来区分电路系统中的不同硬件电路单元。 如果需要在当前模块内对同一个模块进行多次调用,则可以采用如下所示的模块实例语句:
<模块名><参数值列表1><实例名1>(<端口连接表1>),
<参数值列表2><实例名2>(<端口连接表2>), <参数值列表n><实例名n>(<端口连接表n>);
5、模块调用时的阵列调用方式
<被调用模块><实例名阵列>[阵列左边界:阵列右边界](<端口连接表>); 如:NAND NAND_ARREY[3:1](out,ina,inb); 6、模块调用参数的更改:
两种方式:使用带有参数值的模块实例语句和使用参数重定义语句(defparam语句)
(1)、使用带有参数值的模块实例语句格式:
在实例名字前加“参数列表”:#(<参数值1><参数值2>。。<参数值n>) 如定义了一个4乘4的乘法器 要把他变成8乘8的 则用下面给的语句 Chengfaqi #(8,8) u1 (a,b,result);其中参数值必须相对应及时有的参数没有改变也要把原来的参数值写上去。 (2)、使用参数重定义语句(defparam语句) 格式: defparam <参数名1>=<参数值1>, <参数名2>=<参数值2>,
29
<参数名n>=<参数值n>;
这种形式的参数名必须采用分级路径名的形式,因为在模块层次结构中,只有分级路径名形式的参数名才能唯一标识某个模块实例中的某个参数。 例:defparam u1.wide1=8, u1.wide2=6;
区别:在采用第一个参数值修改方式的情况下,由于需要在模块实例语句中列出新的参数值,而模块实例语句只能用来对下一级模块进行调用。所以这种方式只能对于本模块直接调用的下一级模块内的参数进行修改,而不能对布什由本模块直接调用的模块或更低层次模块内的参数进行修改。第二种则没有这种限制。 7、门级建模
Verilog中含的基本元件模型有26种,14种基本门级建模,12中开关机元件。 基本的门级电路包括:
(1)、多数入门:and、nand、or、nor、xor(异或门)、xnor(异或非门)。 (2)、多数出门:buf(缓冲器)、not(非门)。
(3)、三态门:bufif0(低电平使能缓冲器)、bufif1(高电平使能缓冲器)、notif0(低电平使能非门)、notif1(高电平使能非门)。 (4)、上拉、下拉电阻:pullup、pulldown。
基本门级元件的调用是通过“门级元件实例语句”来实现的,这种实例语句的基本格式为:
<门级元件名><驱动强度说明>#(<门级延迟量>)<实例名>(端口连接表); 其中中间的三项可以省略的;
<门级元件名>是上面指定的14种的一种不可以省略;
<驱动强度>可以省略,其格式为:(<对高电平的驱动强度>,<对低电平的驱动强度>) 在结构描述中,一条连线可能会有多个前几输出端同时驱动,该连线最终的逻辑状态将取决于各个驱动端的不同驱动能力,因此,有必要对元件实例的输出驱动能力进行说明,对门级电路,驱动强度说明部分由“对高电平的驱动”和对“低电平的驱动”两部分组成。分为下面几个等级: Supply1 strong1 pull1 weak1 highz1 Supply0 strong0 pull0 weak0 highz0
30
#(<门及延迟>)的()可以省略默认为0;
对同一个元件多次调用的元件实例语句格式: <门级元件名><驱动强度>#(<门级延迟量>) <实例名1>(端口连接表1), <实例名2>(端口连接表2), <实例名n>(端口连接表n);
A、多数入门:<门级元件名>(<输出端口><输入1><输入2>。。。<输入端口n>) 在多输入逻辑状态的x和z的处理方式是相同的,多输入门的逻辑状态不会是z。 And a1(out1,in1,in2); Or a2(a,b,c,d);
也可以写作And (out1,in1,in2);Or (a,b,c,d);
B、多输出门:<门级元件名>(<输出端口1><输出2>.。。<输出n><输入端口>)
31