Verilog HDL有两种常用的数据类型, 线网(Net)类型及变量 类型(REG)。
常量的值是不能够被改变的,变量的值是可以被改变的,例如寄存器型的变量reg。
从逻辑值和常量式开始,对于线网类型重点是常用的wire型变量,对于变量类型重点是reg型。
1 逻辑值和常量
1.1 逻辑值
1.2 数的表达
位宽表示的是二进制的位数
4’h5实际上就是4’b0101,只不过是用十六进制表示
8’h2x是8位二进制数,对应二进制数的值是8’b0010xxxx,低4位不确定
16(默认)是32位的二进制数,十进制的值是16
2 线网型wire
线网(net)型变量最常用的就是wire,最大的问题就是怎么去理解wire。可以将wire直接的理解为连线。
例如一个D触发器reg1的输出是Q,这个Q连接到端口out1上,那么out1的值始终跟随着reg1的值的变化而变化。
wire clk_out;
assign clk_out=c_out;
wire型信号的定义格式如下:
定义一个n位的wire变量: wire [n-1:0] 变量名;
定义m个n位的wire变量: wire [n-1:0] 变量名1,变量名2,……变量名m;
下面给出2个例子:
wire [7:0] a, b, c; // a, b, c都是位宽为8位的wire
wire d; //d是1位的wire
3 寄存器类型reg
寄存器必须在时钟的驱动下(有效边沿)才能改变其内容
reg型也称为寄存器型。数字电路中的触发器只在时钟有效边沿到来的时候,保存的值才能够发生改变。
wire clk_out;
reg c_out;
assign clk_out=c_out;
always @ (posedge clk_in)
begin
c_out=~c_out;
end
reg型信号的定义格式如下:
定义一个n位的寄存器变量:reg [n-1:0] 变量名;
定义m个n位的寄存器变量:reg [n-1:0] 变量名1,变量名2,……变量名m;
下面给出2个例子:
reg [7:0] a, b, c; // a, b, c都是位宽为8位的寄存
器
reg d; //1位的寄存器d
4 符号常量
如果用关键词parameter来定义一个标识符,代表一个常量,这个常量就被称为符号常量。
例如:parameter width=3;//符号常量width的值是3,如果未进行重定义,当在程序中出现width时就用3代替。
parameter idle=1,one=2,two=3,stop=4; //定义了4个符号常量。如果未进行重定义,当代码中出现idle就用1代替,出现one就用2代替,出现tow就用3代替,出现stop就用4代替。
parameter width=3;那么width就一定是3吗?这是不一定的,因为使用parameter定义的常量,仍然可以重定义。重定义方法如下:
5 存储器型变量
存储器实际上是一个寄存器数组。存储器使用如下方式定义:
reg [ msb: lsb] memory1 [ upper1: lower1]
从高到低或从低到高均可(msb是最高有效位,lsb是最低有效位)。
例如:
reg[3:0] mymem1[63:0] //mymem1为64个4位寄存器的数组。
reg dog [1:5] //dog为5个1位寄存器的数组。
dog[4] = 1 ; //合法赋值语句,对其中一个1位寄存器赋值(即第4个寄存器赋值)。
dog[1:5] = 0 ;//合法赋值语句,对存储器大范围赋值。