fpga_feixiang 发表于 2020-7-1 16:41:56

Verilog中的信号

Verilog中,电路里面的一个信号就代表一个特定类型的线网(net)或变量。这里线网指的两个或更多电路结点的相互连接。

      一个线网或变量的声明格式如下:

      type signal_name{,signal_name};

      方括号中range(范围)是可选的,如果没有指定范围,默认情况下表示该信号是标量,是只有一位的单位信号。大括号中表示允许加入的条目,也就是说一个在一行里面可以声明多个线网或变量。

      范围表示为的形式,它定义了矢量信号的范围。范围可以增大或减小。在任何情况下,Ra都表示一个矢量信号的最高有效位(最左边),Rb表示一个矢量信号的最低有效位(最右边)。Ra和Rb可以是正整数和负整数。

比如:

   wire x1,x2;

   wire Array;

   reg y1,y2;   //y1和y2没有指定范围,只有一位。

标识符
      在verilog中,线网或变量名字是通过标识符来表示的。标识符是由一些字母,数字,下划线或美元符号组成。但必须注意两点:标识符不能以数字开头,也不能使用verilog中的关键字。Verilog标识符中也可以出现转义字符,比如 \abc,如果用转义字符,则可以用特殊字符,比如\*cd,但是通常写代码过程中,不要用转义字符来定义变量,这种转义字符通常是其它语言用工具翻译成verilog语言时自动插入的。另外注意的一点就是verilog是区分大小写的,m和M是两个不同的变量。

合法的标识符:

f, x, x1, x_y, Byte

非法的标识符:

1x, 100, x*y,default(verilog关键字)

      Verilog中一些系统任务或函数以开头,比如display, fopen,monitor等等。Verilog中还定义一些编译指示,以`开头,比如:`timescale 1ns/1ns,定义时间单位和时间精度。

信号的值
Verilog支持单位信号表示的标量(一位信号)或者矢量(多位信号),每个单位信号有四种可能的值:0,1,z(或者Z),x(或者X)。

0, 逻辑值0

1, 逻辑值1,

在正逻辑系统中,逻辑值0表示低电平,逻辑值1表示高电平。负逻辑系统中正好相反。在教程中,我们总是用正逻辑系统。



clip_image002

      我们用阈值电压来表示电平的逻辑值。 在上图中,最低电压为 Vss,表示接地。VDD表示最高电压,表示接电源,通常电源在5v到1v之间。VDD~V1,min之间的范围对应逻辑值1,V0,max~Vss之间的范围对应逻辑值0。典型的V1,min 是60%Vdd,V0,max是40%Vdd

    X, 通常表示多驱动值的冲突,为未初始化的值或者两个反相信号(如0和1)的短接。Verilog中线网和变量的初始值都为X。

clip_image002

Z, 通常表示未驱动的高阻值,此时在电源和地之间没有电流流动。比如在三态门中,E=0,则输出为Z。

clip_image002

Verilog中的数字
信号值如果为标量,则为一位的0,1,x或z。例如:

a = 1’b0; b = 1’b1;

c = x; d = z;

      对于矢量,通常表示为:’constant, 标量也可以当作size=1的矢量。其中size表示常数的位数,radix为常数的基数。如果没有指定基数,则默认为十进制。Verilog支持的基数有:d(十进制),b(二进制),h(十六进制),o(八进制)。如果定义的位数大于所需要的位数时,通常在前面补0,但是如果最高位是x或z时候,就用x和z来填充。在常量表示中间,可以任意插入下划线,把数字隔开,以方便阅读。可以在基数前面加s(或者S)以表示这是一个有符号数,若未指定一个整数的进制类型,则默认是有符号数,若指定了进制类型,仅当基数前有s,则其为有符号数,否则为无符号数。对于有符号数,如果定义的位数大于所需要的位数时,前面补最高有效位(MSB),如下表中的8’sha9。

下面是一些实例:

数字表示

二进制

注释

reg a = 8'sha9

‘11111111111111111111111110101001

8位有符号数,所以进行MSB位扩展,

reg b = 4'd5

’00000000000000000000000000000101

4位无符号数,高位补0

reg c = 12'h5b_3

‘00000000000000000000010110110011

忽略下划线,12位的无符号数,高位补0

reg d = -8'b101

’11111111111111111111111111111011

负数转为补码表示,MSB位扩展到32位

reg e= 10'o752

‘00000000000000000000000111101010

8进制无符号数,高位补0

reg f = 8'hf

’00000000000000000000000000001111

16进制无符号数,高位补0

reg g = 12'hxa

‘00000000000000000000xxxxxxxx1010

左边补x直到12位,然后高位补0

reg h = -8'sha9

’00000000000000000000000001010111

补码表示负数,扩展MSB位,

reg i = 8'ha9

‘00000000000000000000000010101001

无符号数,高位补0

reg j = -4'sha

’00000000000000000000000000000110

补码表示负数,扩展MSB位。

实现这些实例的verilog代码为:

复制代码
`timescale 1ns/1ns
module verilogdisnum;
reg a = 8'sha9;
initial $displayb("a=",a);
reg b = 4'd5;
initial $displayb("b=",b);
reg c = 4'h5b_3;
initial $displayb("c=",c);
reg d = -8'b101;
initial $displayb("d=",d);
reg e= 10'o752;
initial $displayb("e=",e);
reg f = 8'hf;
initial $displayb("f=",f);
reg g = 12'hxa;
initial $displayb("g=",g);
reg h = -8'sha9;
initial $displayb("h=",h);
reg i = 8'ha9;
initial $displayb("i=",i);
reg j = -4'sha;
initial$displayb("j=",j);
endmodule

大鹏 发表于 2020-7-1 17:23:54

Verilog中的信号
页: [1]
查看完整版本: Verilog中的信号