zl程序教程

您现在的位置是:首页 >  其他

当前栏目

04 verilog基础语法-数据类型、常量及变量

基础变量 语法 数据类型 04 Verilog 常量
2023-09-14 09:16:17 时间

虚拟机: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
<进制><数字>缺省位宽,则有系统决定,至少32bithc5
<数字>缺省进制,表示十进制,位宽默认为32bit197

:这里的位宽表示的是二进制数的位宽

(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型变量

  1. 定义:输出始终随输入的变化而变化的量,在实际电路中,表示结构实体(比如逻辑门)之间的物理连接。
  2. 常用的nets型变量:
- wire,tri:连线类型(两者功能一致)
- wor,trior:具有线或特性的连线(两者功能一致)
- wand,triand:具有线与特性的连线(两者功能一致)
- tri1,tri0:上拉电阻和下拉电阻
- supply1,supply0:电源(逻辑1)和地(逻辑0)
  1. wire型变量是最常用的变量,表示用assign语句赋值的组合逻辑信号。
    在这里插入图片描述
    wire型向量(总线)->wire[n-1:0] 数据名1,数据名2, ……,数据名m;或 wire[n:1] 数据名1,数据名2, ……,数据名m;都表示有m条总线。

(2)register型变量

  1. 定义:对应具有状态保持作用的电路元件(如触发器、寄存器等),常用来表示过程块语句(如initial,always,task,function)内的指定信号 。
  2. 常用register型变量:
    • reg:常代表触发器
    • integer:32位带符号整数型变量
    • real:64位带符号实数型变量
    • time:无符号时间变量
  3. 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型变量(数组)

  1. 定义:由若干个相同宽度的reg型向量构成的数组
  2. 应用: 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
版权:本文版权归作者所有
转载:欢迎点赞、评论和转载,但未经作者同意,必须保留此段声明,必须在文章中给出原文连接。