Menu Close

Verilog 变量中位的数值类型

Verilog 变量中位的数值类型

Verilog变量中每个位(bit)的数值类型有四种,分别为1,0,Z,X。其中1,0比较明确就是高、低电平。而x, z在逻辑设计中也经常用到来建模。X,Z既可以大写,也可以使用小写字母。

  • 0:逻辑 0 或 “假”
  • 1:逻辑 1 或 “真”
  • x 或 X:未知
  • z 或 Z:高阻
  • X表示其值不确定,可能为0,也可能为1;
  • 从高低电平的角度看,四值含义如下表所示:
Verilog中4个逻辑值
逻辑 0 表示低电平,对应电路 为GND,或逻辑电路输出为低电平。
逻辑 1 表示高电平,对应电路的 VCC,或逻辑电路输出为高电平
逻辑 X 表示未知,有可能是高电平,也有可能是低电平。
逻辑 Z 表示高阻态,是一个悬浮状态,如三态门,OC门,OD门等。

关于X和Z的用法,可以参见 Verilog中X的用法,Verilog中 Z的用法。

数值表示方法

数字声明时,合法的基数格式有 4 中,包括:十进制(‘d 或 ‘D),十六进制(‘h 或 ‘H),二进制(’b 或 ‘B),八进制(’o 或 ‘O)。数值可指明位宽,也可不指明位宽。位宽就是在进制符号前加一个数字表示该数字对应的二进制的位数。如 8’d11,表示数字的大小是十进制的11,但位的宽度为8位的二进制数。也就是8’b0000_1011;

下划线”_”用来起到隔离的作用,不影响数值的大小,目的是提高代码的可读性。

二进制:

二进制数可以用0,1 ,Z,X;如果使用二进制,必须使用’b 或’B引导。

例:

wire a = 1’b0;

reg   b = 1’b1;

wire c;

assign c = 1’bZ;

wire [7:0] tmp_a = 8’b100Z_XX01;

十进制:

十进制的基数是0,1,2,3,4,5,6,7,8,9。即0~9十个数字。

其中十进制整数可以直接使用,如果没有指定基数格式的整数,默认为十进制。十进制中不能包含X或Z的值。如 wire [7:0] a=7;没有指定位宽,编译器会实现自动匹配,匹配方式为右对齐。 即 a[7:0] = 8’b0000_0111;左边以0补齐。

wire [7:0] a = 7;//等效为 wire [7:0] a = 8’d7;

其中8’表示位宽,是8位二进制位宽,d表示十进制数。

16进制

十六进制的基数除了0~9十个数字外,还包含a,b,c,d,e,f六个字符,每个16进制字符可以等效4位2进制数。如:4’h6与4’b0110等效。如果使用X或Z,则表示4位二进制的值都是X或Z。如4’hZ 等效为4’bZZZZ,4’hX 等效为4’bXXXX。16‘H12Z0等效于16’b0001_0010_ZZZZ_0000。

8进制:

8进制的基数只有0~7,没有8,9 两个数字,逢8进1.

8进制的用法与16进制的用法类似,每个八进制符号表示3位二进制数。wire [7:0] a=8’o367;等效的2进制表达方式 wire [7:0] a=8’b11_110_111;由于受位宽的限制,该八进制数的最左边的只有两位,因此最大只能是3,

例:

wire         a = 1’b1; 
wire [3:0]   b = 4’HZ;
 
reg  [7:0]   c = 8’d24;
reg  [15:0]  d = 16’H5ZX3;
reg  [9:0]   count = 10;       //10默认为十进制数
reg  [7:0]   ma = ’b1010_0011; //没有指定位宽,编译器自动推断

 

相关文章 :Verilog 中’X’的应用

Posted in FPGA, FPGA, IC, Verilog, Verilog

3 Comments

    • tzhuang

      实际上在FPGA或IC的设计中一般都是要对变量进行位宽限制的,特别是wire,reg型变量在声明时如果给定位宽后,操作变得及其方便。如: wire a0,a1,a2,a3; wire b0,b1,b2,b3; wire c0,c1,c2.c3; 如果要做4位加法器,直接使用刚才的声明可不可以呢,当然可以,只是不方便。 加法器: assign {c3,c2,c1,c0}={a3,a2,a1,a0}+{b3,b2,b1,b0}; 之后每次使用结果都要引用{c3.c2.c1.c0},是不是很繁琐: 如果采用向量的方式 如,wire [3:0] a,b,c; assign c=a+b; 之后引用结果时,只要用c就可以了。
      integer 变量声明时可以不用指定位宽,一般系统默认32位。

    • tzhuang

      位宽表示方法,用b,o,d,h分别表示2,8,10,16进制,一般10进制可以直接使用,也可以指定位宽。新的verilog 语法中也可以不指定其它格式的位宽,由系统推断,如wire [7:0] a=’b0110;则系统推断为’b0110为4位位宽,在赋值时自动扩展成8位位宽后赋给a.

发表评论

相关链接