热度 16
2012-11-4 03:00
2683 次阅读|
0 个评论
拿下变量数据类型 在上一讲中,我们讲了常量数据类型的语法介绍,从如何表达一个整数,x和z的意义,参数(parameter)型常量的使用到常量一些默认的规律。常量数据类型在verilog HDL是很重要的,那么变量数据类型呢? 答案是肯定的,变量数据类型甚至更重要。 其实是可以变很多的 什么是变量呢?在程序运行过程中可以改变的量就是变量。既然是变量,那肯定是可以变出很多数据类型啊,总体来说有两大派系,一是网络(net)连接类型,另一个是寄存器(Register)类型变量。 我们怎么区分这两大派系呢?网络(net)连接类型不能存储数据,就好比家家户户的普通的连接管;而寄存器(Register)类型变量可以存储数据,直至被赋予新值,好比带源头的管子。后面的具体的门派好比管子又有很多,比如自来水管、下水道管,通风管、北方的暖气管等 下面我们来细说这两大派系。 1.网络(net)连接类型 网络(net)连接类型变量是用于结构实体之间的物理连接,它不能存储数值,必须要有驱动器(例如:模块或门驱动,连续赋值语句)的驱动,驱动器信号的改变其驱动变量的数值,若没有驱动器的驱动其变量的就是高阻的,其值为z;在多驱动源的情况下,逻辑值会发生冲突,产生不确定的值。 那么派系有什么具体的门派呢?其主要的有wire型, tri型,supply0型, supply1型,wor型,trior型,wand型, triand型,trireg型,tri1型,tri0型等。 各个门派都是有什么绝技的呢? wire, tri 型 此类变量主要用于连接单元的连线,是最常见的net类型变量。wire型变量通常用来表示单个驱动源驱动的net型变量,而tri型(用于建模仿真)变量通常用来表示多驱动器驱动的网络型数据。在不同的场合用不同的net类型,只是为了区分用的场合而已,而wire型与tri型语法和语义一致,可以相互替换。我们还是看个多驱动源的例子吧。 模块程序如下: module or_test( ain, bin, cout ); input ain; input bin; output cout; tri cout; assign cout=bin; assign cout=ain; endmodule 上面的双驱动模块不可综合,但可以仿真,仿真结果想如下: 综合以后会有以下语法错误。 对上面的双驱动模块进行仿真,程序如下: module testbench; reg ain,bin; // Inputs wire cout; //实例化模块 or_test uuu ( .ain(ain), .bin(bin), .cout(cout) ); initial begin ain = 0; bin = 0; #10; ain = 0; bin = 1; #10; ain = 0; bin = 1'bx; #10; ain = 0; bin = 1'bz; #10; ain = 1; bin = 0; #10; ain = 1; bin = 1'bx; #10; ain = 1; bin = 1'bz; #10; ain =1'b x; bin = 1'bx; #10; ain = 1'bx; bin = 1'bz; #10; ain = 1'bz; bin = 1'bz; #10; $stop; end endmodule 下面仿真的结果 根据上面的仿真可以得出多驱动源时的真值表: wire,tri 0 1 X Z 0 0 X X 0 1 X 1 X 1 X X X X X Z 0 1 X Z supply1, supply0型 supply0型变量用于对“地”建模,即低电平0;supply1型变量用于对电源建模,即高电平1。这类变量是可以综合的。例如: module or_test( cout,dout ); output cout; output dout; supply0 ain; // supply0对应的地 supply1 bin; // supply1对应的地 assign dout=bin; assign cout=ain; endmodule 下图为综合出来的电路图,,supply1对应的是电源。 wor, trior型 此类型数据对应于有多个驱动源的线或逻辑连接,综合出来的结果相当于或门。当有多个驱动源驱动线或(wor)和三态线或(trior)数据时,就会产生线或结构。线或(wor)和三态线或(trior)如果某个驱动源为1,这类变量的值也为1。 举个例子吧。 module wor_test( ain, bin, cin, din, //in cout, dout //out ); input ain,bin,cin,din; output cout,dout; wor cout; //wor 类型声明 trior dout; //trior类型声明 assign cout=bin; assign cout=ain; //wor 类型多驱动源 assign dout=cin; assign dout=din; //trior类型多驱动源 endmodule 上面是一个用两个驱动源驱动一个wor型和tri型的变量,其综合出来的电路如下,从图可以看出,他就是一个双输入的或门电路。 大家可以仿照wire和tri型仿真程序进行仿真,根据仿真结果(大家可以自己做一下,篇幅有限,不在重复),同样可以得出多驱动源时的真值表: wor,trior 0 1 X Z 0 0 1 X 0 1 1 1 1 1 X X 1 X X Z 0 1 X Z wand, triand型 此类型数据对应于有多个驱动源的线与逻辑连接,综合出来的结果相当于与门。当有多个驱动源驱动线或(wand)和三态线或(triand)数据时,就会产生线与结构。线与(wand)和三态线与(triand)如果某个驱动源为0,这类变量的值也为0。比如: module wand_triand_test( ain, bin, cin, din, //in cout, dout //out ); input ain,bin,cin,din; output cout,dout; wand cout; //wand 类型声明 triand dout; //triand类型声明 assign cout=bin; assign cout=ain; //wand 类型多驱动源 assign dout=cin; assign dout=din; //triand类型多驱动源 endmodule