04 verilog基础语法-数据类型、常量及变量
虚拟机:VMware-workstation-full-14.0.0.24051
环 境:ubuntu 18.04.1
文章目录
一、学习内容(下半部分)
二、数据类型
数据类型用来表示数字电路中的数据存储和传送单元,Verilog HDL中共有19种数据类型,其中有4中基本数据类型,分别为:
-> integer型
-> parameter型
-> reg型
-> wire型
其它数据类型: large型、medium型、 scalared型、 small型、time型、tri型、tri0型、tri1型、triand型、trior型、trireg型、vectored型、wand型、wor型等
三、常量
在程序运行过程中,其值不能被改变的量,称为常量。数字(包括整数,x和z值,负数);parameter常量(或称符号常量)
(1)整数型变量
- 二进制整数(b或B);八进制整数(o或O);十进制整数(d或D);十六进制整数(h或H);
- 常见的3种整常数表达方式:
表达方式 | 说明 | 例子 |
---|---|---|
<位宽>’<进制><数字> | 完整的表达式 | 8‘b11000101或8’hc5 |
<进制><数字> | 缺省位宽,则有系统决定,至少32bit | hc5 |
<数字> | 缺省进制,表示十进制,位宽默认为32bit | 197 |
注:这里的位宽表示的是二进制数的位宽
(2)x和z
- x表示不定值,z表示高阻值;如8‘bxx100111,8‘b010111zz
- 每个字符代表的二进制数的宽度取决于所用的进制;
- 当用二进制表示时,已标明位宽的数若用x或z表示某些位,则只有在最左边的x或z具有扩展性!
[例1] 8’bzx = 8’bzzzz_zzzx
[例2] 8’b1x = 8’b0000_001x - “?”是z的另一种表示符号,一般在case语句中使用?表示高阻态z
[例3]
casez (select)
4’b???1: out = a;
4’b??1?: out = b;
4’b?1??: out = c;
4’b1???: out = d;
endcase
(3)负数
- 在位宽前加一个减号,即表示负数。 如:-8’d5 //5的补数,= 8‘b11111011
- 减号不能放在位宽与进制之间,也不能放在进制与数字之间!8 ’ d-5 //非法格式
- 可以在较长的数字之间使用下划线“_”隔开,16’b1011_1110_0011_1001 //合法;8’b_0110_1001//非法表达
(4)符号常量(parameter和localparam)
-
用parameter来定义一个标识符,代表一个常量——称为符号常量;
-
每个赋值语句的右边必须为常数表达式,即只能包含数字或先前定义过的符号常量;
-
在模块或实例引用时,可通过参数传递改变在被引用模块或实例中已定义的参数;
-
localparam 符号常量
-
parameter与localparam的区别
-> parameter可用作在顶层模块中例化底层模块时传递参数的接口;
-> localparam的作用域仅仅限于当前module,不能作为参数传递的接口 。 -
【推荐】 模块例化参数传递-方法一:利用特殊符号==“#”==
【例4】
module mod ( out, ina, inb);
…
parameter cycle = 8, real_constant = 2.039;
…
endmodule
module test;
…
mod # (5, 3.20) mk(out,ina,inb); // 对模块mod的实例引用
…
endmodule
- 【不推荐】 模块例化参数传递-方法二
【例5】
module mod ( out, ina, inb);
…
parameter cycle = 8, real_constant = 2.039,
file = “/user1/jmdong/design/mem_file.dat”;
…
endmodule
module test;
…
mod mk(out,ina,inb); // 对模块mod的实例引用
defparam mk.cycle = 6, mk.file = “../my_mem.dat”; // 参数的传递
…
endmodule
defparam一般情况下是不可综合的。所以在编写RTL代码时不要使用defparam语句,在模块的实例引用时,可用“#”号后跟参数的语法来重新定义参数。
四、变量
在程序运行过程中,其值可以改变的量。其数据类型有19种,常用的有3种:网络型(nets type)、寄存器型(register type )、数组(memory type)。
(1)nets型变量
- 定义:输出始终随输入的变化而变化的量,在实际电路中,表示结构实体(比如逻辑门)之间的物理连接。
- 常用的nets型变量:
- wire,tri:连线类型(两者功能一致)
- wor,trior:具有线或特性的连线(两者功能一致)
- wand,triand:具有线与特性的连线(两者功能一致)
- tri1,tri0:上拉电阻和下拉电阻
- supply1,supply0:电源(逻辑1)和地(逻辑0)
- wire型变量是最常用的变量,表示用assign语句赋值的组合逻辑信号。
wire型向量(总线)->wire[n-1:0] 数据名1,数据名2, ……,数据名m;或 wire[n:1] 数据名1,数据名2, ……,数据名m;都表示有m条总线。
(2)register型变量
- 定义:对应具有状态保持作用的电路元件(如触发器、寄存器等),常用来表示过程块语句(如initial,always,task,function)内的指定信号 。
- 常用register型变量:
- reg:常代表触发器
- integer:32位带符号整数型变量
- real:64位带符号实数型变量
- time:无符号时间变量
- reg型变量最常用,在过程块中被赋值的信号, 往往代表触发器,但不一定就是触发器(也可以是组合逻辑信号),见【例7】和【例8】。
reg型向量(总线):reg[n-1:0] 数据名1,数据名2, ……,数据名m;或 reg[n:1] 数据名1,数据名2, ……,数据名m;都表示有m个reg型向量
[ 例6 ] reg[4:1] regc, regd; //regc,regd 为4位宽的reg型向量
[ 例7 ] 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
[ 例8 ] reg型生成组合逻辑
module rw1( a, b, out1, out2 );
input a, b;
output out1, out2;
reg out1;
wire out2;
assign out2 = a;//连续赋值语句
always @(b) begin//电平触发,不是时钟触发
out1 <= ~b;//过程赋值语句
end
endmodule
(3)memory型变量(数组)
- 定义:由若干个相同宽度的reg型向量构成的数组
- 应用: Verilog HDL通过reg型变量建立数组来对存储器建模
· memory型变量可描述RAM、ROM和reg文件
· memory型变量通过扩展reg型变量的地址范围来生成
格式:reg[n-1:0] 存储器名[m-1:0];或 reg[n-1:0] 存储器名[m:1];表示每个存储单元位宽为n位,共有m个存储单元
[ 例9 ]
reg [n-1:0] rega;//表示一个n位寄存器
[ 例10 ]
reg mema [n-1:0];//表示n个1位寄存器组成的存储器
五、思考和小结
(1)思考
- 模块有几个部分组成?
- 连续赋值语句assign赋值的变量能否是reg类型?
- reg型与wire型,reg型与mem型变量的区别是什么?
(2)小结
作者:xlinxdu
版权:本文版权归作者所有
转载:欢迎点赞、评论和转载,但未经作者同意,必须保留此段声明,必须在文章中给出原文连接。
相关文章
- Oracle基础(五)pl/sql进阶(分页过程)
- Java基础之——Lambda表达式
- 技术栈系列基础篇4-正则表达式
- shell语法基础_实现shell
- JavaScript基础与变量
- 【Pytorch基础】梯度下降算法的改进
- [系统安全] 四十.Powershell恶意代码检测系列 (1)Powershell基础入门及管道和变量的用法
- 【原创】Java中的数组基础
- 算法0基础刷题——组合数
- 哥德尔90年前的「不完备性定理」,奠定了计算机与AI的理论基础
- PHP-基础语法-变量的概念和使用(一)
- PHP-基础语法-变量的概念和使用(三)
- Linux基础:Linux重定向用法详解
- postgresql 数据库基础 之 存储函数调用变量的几种不通方法
- Linux-基础(centos6.9)-超时时间-字符集-history详解程序员
- Swift基础语法(常量变量、数据类型、元组、可选、断言)详解手机开发
- Oracle创建主键表:基础指南(oracle建主键表)
- Linux 的依赖性:建立强韧的基础(linux依赖性)
- 初学者零基础Oracle入门:初学者必备指南(零基础oracle)
- php基础学习之变量的使用