原创 那些年,我们拿下了FPGA-第8章拿下变量数据类型(2)

2012-11-4 03:03 3156 13 13 分类: FPGA/CPLD 文集: 那些年,我们拿下了FPGA

Trireg型

此线网存储数值(类似于寄存器),并且用于电容节点的建模,只能用于仿真,不可综合。当三态寄存器(trireg)的所有驱动源都处于高阻态,即值为z时,三态寄存器线网保存作用在线网上的最后一个值,也就是当所有驱动源都处于高阻态时,整个仿真就会暂停。在声明语句中,trireg可以指定处于电容状态下的电荷量强度(small,medium,large)。此外,三态寄存器线网的缺省初始值为x。如:
module trireg_module(

     ain,         bin,  //in

         cout            //out

         );

input ain,bin;

output cout;

trireg (large) cout;         //trireg  类型声明

 

assign cout=ain;

assign cout=bin;                //trireg 类型多驱动源

 

endmodule

综合后会出现下面的错误

8.6.jpg

 

对上述模块进行仿真,程序如下:

module trireg_test;

         reg ain,bin; // Inputs

         wire cout; // Outputs

//实例化模块

         trireg_module 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;

                   ain = 1'b0;

                   bin = 1'b0;  //没有仿真结果

                   #10;

                    $stop;              $stop;

         end

      endmodule

仿真结果如下图:

8.7.jpg

 

根据上面的仿真结果可以得出多驱动源时trireg型的真值表:

 

Trireg

0

1

X

Z

0

0

X

X

0

1

X

1

X

1

X

X

X

X

X

Z

0

1

X

最后的状态值

 

tri1, tri0型

这类net型变量可用于线逻辑的建模,不可综合。tri0(tri1)线网的特征是,若无驱动源驱动,它的值为0(tri1的值为1)。

module tri0_test(

   ain,     bin,  cin,   din, //in

         cout,         dout            //out

         );

input ain,bin,cin,din;

output cout,dout;

tri1  cout;         // tri1 类型声明

tri0 dout;                    // tri0类型声明

 

assign cout=bin;  

assign cout=ain;    // tri1 类型多驱动源

 

assign dout=cin;

assign dout=din;                // tri0类型多驱动源

 

endmodule

8.8.jpg

 

仿真结果如上图,cout为tri1型的仿真结果,dout为tri0型的仿真结ain,bin为对应的模块的ain,bin和cin,din输入对。

有仿真结果可以得出多驱动时的真值表:

 

tri0型真值表

 

tri0

0

1

X

Z

0

0

X

X

0

1

X

1

X

1

X

X

X

X

X

Z

0

1

X

0

 

 

tri1型真值表

 

tri1

0

1

X

Z

0

0

X

X

0

1

X

1

X

1

X

X

X

X

X

Z

0

1

X

1

 

 

2.寄存器(Register)类型

寄存器(Register)类型可以暂时存储数据,能保持其值,直到它被赋于新的值,大量应用于行为模型描述及激励描述。寄存器类型主要有reg型,memory型,integer型,real型,time型,realtime型六种大门派。

1.reg型为可定义的无符号整数变量,可以是标量(1位)或矢量,是                  最常用的寄存器类型。

2.memory型是通过reg型数据的地址范围生成的,是一个reg型数据的数组。

3.integer型是32位有符号整数变量,算术操作产生二进制补码形式的                 结果。它其实与32位的reg型数据是在实际意义上是相同的。但integer型不能作为位向量访问。如:

integer ss;

assign ss[10] = 0;  //非法赋值语句

综合以后会出现下面的错误。

8.9.jpg

 

4.real型为双精度的带符号浮点变量,用法与integer相同,但不可综合。

5.time型是64位无符号整数变量,用于仿真时间的保存与处理。

6.realtime与real内容一致,但可以用作实数仿真时间的保存与处理。

总之,不管是网络(net)连接类型,还是寄存器(Register)类型,都能变出多种类型,总之变量数据类型是变的。

文章评论0条评论)

登录后参与讨论
我要评论
0
13
关闭 站长推荐上一条 /2 下一条