首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

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

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

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
综合后会出现下面的错误

对上述模块进行仿真,程序如下:
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
仿真结果如下图:

根据上面的仿真结果可以得出多驱动源时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

仿真结果如上图,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;  //非法赋值语句
综合以后会出现下面的错误。

4.real型为双精度的带符号浮点变量,用法与integer相同,但不可综合。
5.time型是64位无符号整数变量,用于仿真时间的保存与处理。
6.realtime与real内容一致,但可以用作实数仿真时间的保存与处理。
总之,不管是网络(net)连接类型,还是寄存器(Register)类型,都能变出多种类型,总之变量数据类型是变的。
返回列表