Verilog的逻辑系统及数据类型(一):四值逻辑系统

微信公众号获取更多FPGA相关源码:
在这里插入图片描述

1. Verilog采用的四值逻辑系统

Verilog采用的四值逻辑系统

2.主要数据类型

Verilog主要有三类(class)数据类型:

  • net (线网) : 表示器件之间的物理连接
  • register (寄存器) :表示抽象存储元件
  • parameters(参数) : 运行时的常数(run-time constants)

2.1 net(线网)

  • net需要被持续的驱动,驱动它的可以是门和模块。
  • 当net驱动器的值发生变化时, Verilog自动的将新值传送到net上。在例子中,线网out由or门驱动。
  • 当or门的输入信号置位时将传输到线网net上。

net(线网)

有多种net类型用于设计(design-specific)建模和工艺(technology-specific)建模

多种net类型

**特别注意:**没有声明的net的缺省类型为 1 位(标量)wire类型。

  • wire类型常用于组合电路描述。
  • wire类型是最常用的类型,只有连接功能。
  • wire和tri类型有相同的功能。用户可根据需要将线网定义为wire或tri以提高可读性。tri型的信号综合后具有三态的功能。
  • wand、wor有线逻辑功能。
  • trireg类型很象wire类型,但trireg类型在没有驱动时保持以前的值。这个值的强度随时间减弱。
  • 修改net缺省类型的编译指导:
`default_nettype  <nettype>

其中nettype不能是supply1和supply0。

2.2 寄存器类 (register)

  • 寄存器类型在赋新值以前保持原值
  • 寄存器类型大量应用于行为模型描述及激励描述。在下面的例子中,reg_a、reg_b、reg_sel用于施加激励给2:1多路器。
  • 用行为描述结构给寄存器类型赋值。给reg类型赋值是在过程块中。

寄存器类 (register)

下表给出了寄存器类有四种数据类型:

寄存器类型功能
reg可定义的无符号整数变量,可以是标量(1位)或矢量,是最常用的寄存器类型
integer32位有符号整数变量,算术操作产生二进制补码形式的结果。通常用作不会由硬件实现的的数据处理。
real双精度的带符号浮点变量,用法与integer相同。
time64位无符号整数变量,用于仿真时间的保存与处理
realtime与real内容一致,但可以用作实数仿真时间的保存与处理

2.3 Verilog中net和register声明语法

2.3.1 net声明

 <net_type> [range] [delay] <net_name>[, net_name];
变量含义
net_typenet类型
range矢量范围,以[MSB:LSB]格式
delay定义与net相关的延时
net_namenet名称,一次可定义多个net, 用逗号分开。

2.3.2 寄存器声明

<reg_type> [range] <reg_name>[, reg_name];
变量含义
reg_type寄存器类型
range矢量范围,以[MSB:LSB]格式。只对reg类型有效
reg_name寄存器名称,一次可定义多个寄存器,用逗号分开

举例:

	reg a;     //一个标量寄存器
	wand w; // 一个标量wand类型net
	reg [3: 0] v; // 从MSB到LSB的4位寄存器向量
	reg [7: 0] m, n; // 两个8位寄存器
	tri [15: 0] busa; // 16位三态总线
	wire [0: 31] w1, w2; // 两个32位wire,MSB为bit0

2.4 选择正确的数据类型

选择正确的数据类型

2.5 选择数据类型时常犯的错误

2.5.1 信号类型确定方法总结

  1. 信号可以分为端口信号和内部信号。出现在端口列表中的信号是端口信号,其它的信号为内部信号。
  2. 对于端口信号,输入端口只能是net类型。输出端口可以是net类型,也可以是register类型。若输出端口在过程块中赋值则为register类型;若在过程块外赋值(包括实例化语句),则为net类型。
  3. 内部信号类型与输出端口相同,可以是net或register类型。判断方法也与输出端口相同。若在过程块中赋值,则为register类型;若在过程块外赋值,则为net类型。

2.5.2 常出的错误及相应的错误信息(error message)

  1. 用过程语句给一个net类型的或忘记声明类型的信号赋值。
    报错信息:illegal …… assignment.
  2. 将实例的输出连接到声明为register类型的信号上。
    报错信息:<name> has illegal output port specification.
  3. 将模块的输入信号声明为register类型。
    报错信息:incompatible declaration, <signal name> ……

2.5.3 选择数据类型时常犯的错误举例

修改前:

module example(o1, o2, a, b, c, d);
     input a, b, c, d;
     output o1, o2;
     reg c, d;
     reg o2
     and u1(o2, c, d);
     always @(a or b)
          if (a) o1 = b; else o1 = 0;
endmodule

修改前编译信息:

Compiling source file "example.v"
Error!    Incompatible declaration, (c) defined as input                       
          at line 2                                         [Verilog-IDDIL]    
          "example.v", 5: 
Error!    Incompatible declaration, (d) defined as input                       
          at line 2                                         [Verilog-IDDIL]    
          "example.v", 5: 
Error!    Gate (u1) has illegal output specification        [Verilog-GHIOS]    
          "example.v", 8: 
3 errors

修改后:

module example(o1, o2, a, b, c, d);
     input a, b, c, d;
     output o1, o2;
//     reg c, d;
//     reg o2
     reg o1;
     and u1(o2, c, d);
     always @(a or b)
          if (a) o1 = b; else o1 = 0;
endmodule

修改后编译信息:

Compiling source file "example.v"
Error!    Illegal left-hand-side assignment                 [Verilog-ILHSA]    
          "example.v", 11: o1 = b;
Error!    Illegal left-hand-side assignment                 [Verilog-ILHSA]    
          "example.v", 12: o1 = 0;
2 errors

微信公众号获取更多FPGA相关源码:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值