电子说
数据类型及常量、变量
数据类型
数据类型是用来表示数字电路中的数据存储和传送单元
4种基本的数据类型
integer(整形)
parameter类型
reg
wire(线网)
常量
在程序运行的过程中,其值不允许被改变
包括:
数字(包括整形,x和z值,负数)
parameter常量(或称符号常量)
1. 整数型常量
二进制 (b/B)
十进制 (d/D)
十六进制 (h/H)
八进制 (o/O)
整常数的3种表达方式
<位宽>'<进制><数字> | 完整的表达方式 | 8'11000101或 8'hc5 |
<进制><数字> | 缺省位宽,有机器系统决定,至少32位 | hc5 |
<数字> | 缺省进制为十进制,位宽默认为32位 | 197 |
表达方式 | 说明 | 举例 |
---|
注:位宽表示二进制时的宽度
2.x和z值
x表示不定值(8'b1001xxxx或8’h9x);
z表示高阻值(8'b1001zzzz或8’h9z);
每个字符代表的二进制的宽度取决于所用的进制;
当用二进制表示时,以表明位宽的数若用x或者z表示某些位,则只有在最左边的x或z具有扩展性例如:8'bzx = 8'bzzzz_zzzx 8'b1x = 8'b0000_001x
?是z的另一种表示符号,建议在case语句中使用?表示高阻态z。
casez (select) 4'h???1: out=a; 4'h??1?: out=b; 4'h?1??: out=c; 4'h1???: out=d; endcase
3.负数
在位宽前边加一个负号,表示负数;
如:-8’d5 //5的补数 =8'11111011
负号不能放在位宽和进制之间,也不能放在进制和数字之间
4.parameter常量(符号常量)
用parameter来定义一个标示符,代表一个常量,称为符号常量
格式:
parameter 参数名1 = 表达式, 参数名2 = 表达式;
parameter 参数型数据的确认符,后边的为赋值语句表
每个赋值语句的右边必须为常数表达式,且只能包含数字或先前定义过的符号常量:
parameter addrwidth =16; //合法
parameter addrwidth = addrwidth * 2 //非法
常用参数来定义延时时间和变量宽度
可用字符串表示的任何地方,都可用定义的参数来代替;
参数是本地的,其定义只在本模块有效;
在模块或实例例化时,可通过参数传递改变在被引用模块或实例中已定义的参数
localparam 符号常量:
格式:
localparam 参数名1 = 表达式, 参数名2 = 表达式;
localparam 参数型数据的确认符,后边的为赋值语句表
parameter可作为在顶层模块中例化底层模块时传递参数的接口;
localparam的作用域仅仅限于当前module,不能作为参数传递的接口;
实例:
module mod (out, ina, inb); ... parameter cycle = 8, real_cinstant = 2.039; ... endmodule module test; ... mod #(6,3.19) mk(out,ain,bin); //对mod模块的实例引用及参数的传递 ... endmodule
变量
在程序运行过程中,其值可以改变的量,称为变量;
常用的有3种:
网络型(nets)
寄存器型(register)
数组(memory)
1.net型变量
输出始终随输入的变化二变化的变量(表示结构实体之间的物理连接)
常用的net变量为wire。
wire型变量
最常用的nets型变量,常用来表示以assign语句赋值的组合逻辑信号
模块中的输入/输出信号类型缺省为wire型
可用做任何方程式的输入,或“assign”语句和实例元件的输出。
2.register 型变量
对应具有状态保持作用的电路元件(如触发器,寄存器)
常用来表示过程块语句(initial always,task,function)内的指定信号
常用register型变量:
reg:常代表触发器
integer:32位带符号整数型变量
real:64位带符号实数型变量
time:无符号时间变量
register变量与net变量的根本区别:register变量要被明确的赋值,并且在被重新赋值前一直保持原值
register变量必须通过过程语句块赋值,不能使用assign语句块赋值
在过程语句块内赋值的每个信号必须定义成register型。
reg型变量
在过程块中被赋值的信号,往往代表触发器,但不一定就是触发器(也可以是组合逻辑信号)
· reg与wire的区别:
//reg型变量既可以生成触发器,也可以生成组合逻辑 //wire型变量只能生成组合逻辑 //用reg变量生成组合逻辑 module rw1(a,b,out1,out2); input a,b; output out1, out2; reg out1; wire out2; assign out2 = a; //连续赋值语句 always @(b) //电平触发 out1 <=~b; //过程赋值语句 endmodule //用reg变量生成触发器 module rw2(clk,d,out1,out2); input clk,d; output out1, out2; reg out1; wire out2; assign out2 = d & ~out1; //连续赋值语句 always @(posedge clk) //边沿触发 begin out1 <= d; //过程赋值语句 end endmodule
· 边沿触发和电平触发的区别:
边沿触发:posedge定义为上升沿触发,只有在后面信号由低变高的时候才触发,negedge正好相反,为下降沿触发。
电平触发:当敏感信号发生变化是触发
3.memory型变量——数组
有若干个相同宽度的reg向量构成的数组
Verilog 通过reg型变量简历数组来对存储器建模
memory型变量可描述RAM,ROM和reg文件
memory型变量通过扩展reg型变量的地址范围来生成
reg [n-1:0] 存储器名[m-1:0]; 每个存储单元位宽为n,共有m个存储单元
例:
reg [n-1:0] rega; //一个n位的寄存器;
reg mema [n-1:0] ; //n个一位寄存器组成的存储器
赋值方式不同:
一个n位的寄存器可用一条赋值语句赋值,一个完整的存储器则不行,若要对某存储器中的存储单元进行读写操作,必须指明该单元在存储器中的地址!
例:
rega=0; //合法赋值语句
mema=0; // 非合法赋值语句
mema[8]=1;//合法赋值语句
mema[1023:0]=0; //合法赋值语句
审核编辑:刘清
全部0条评论
快来发表一下你的评论吧 !