Verilog 学习笔记(一)代码结构,数据类型和运算符

什么是Verilog?

硬件描述语言(HDL, hardware description language)是一种用形式化方法来描述数字电路和系统的语言。数字电路系统的设计者利用这种语言可以从上层到下层(从抽象到具体)逐层描述自己的设计思想,用一系列分层次的模块来表示极其复杂的数字系统。然后利用电子设计自动化(EDA)工具逐层进行仿真验证,再把其中需要变为具体物理电路的模块组合经由自动综合工具转换到门级电路网表。接下去再用专用集成电路(ASIC)或现场可编程门阵列(FPGA)自动布局布线工具把网表转换为具体电路布线结构的实现。

简而言之,HDL是将数字电路使用代码形式表示出来的语言。如果代码对应的电路可以实现,则称代码是“可综合的”,反之则为不可综合的,通常用于验证。

Verilog HDL是硬件描述语言的一种,和VHDL是目前最为常用的两种HDL。两者各有其特点。

Verilog 代码的基本结构

模块是Verilog结构的基本单元。一个复杂电路的完整Verilog模型由多个Verilog模块构成,每个Verilog模块又由多个小模块构成。

一个Verilog模块由两部分构成:一部分描述接口,另一部分描述逻辑功能。

如图所示的Verilog模块,Verilog结构位于module 和 endmodule 之间,表示模块的开始和结束,block为模块名。括号内为模块的输入和输出。

模块内部内容包括对输入和输出的说明,其形式为:

input [信号位宽-1:0] 端口名1;
input [信号位宽-1:0] 端口名2;
...
output [信号位宽-1:0] 端口名1;
output [信号位宽-1:0] 端口名2;

 I/O说明也可以写在模块名内:

module 模块名  (input 端口名1,input 端口名2,...output 端口名1,output 端口名2);

模块内部还包括内部信号和各种功能定义。

Verilog代码的注释可以用两种方法:

module top_module( input in, output out );
    //双斜线后的一整行都是注释。
	assign out = in;
    /双斜线之间也可以写注释
    表示两条斜线之间的部分都是注释/
endmodule

数据类型:常量

Verilog中有19种不同的数据类型。在程序运行过程中,其值不能被改变的量称为常量。

1.数字 Verilog中数字表达方式有以下3种:
1)<位宽>'<进制><数字>,这是一种全面的描述方式。
2)在<进制><数字>这种描述方式中,数字的位宽采用默认位宽(这由具体的机器系统决定,但至少32位)。
3)在<数字>这种描述方式中,采用默认进制(十进制)。

8'b10101100  //位宽为8的数的二进制表示,'b表示二进制
8'ha2        //位宽为8的数的十六进制表示,'h表示十六进制

位宽表示数字的精确位数,可以当作需要存储这个数字所需的空间的大小。

进制有四种:二进制整数(b或B);十进制整数(d或D);十六进制整数(h或H);八进制整数(o或O)。

2.不定和高阻 在数字电路中,x代表不定值,z代表高阻值。

3. 表示负数需要在最前面加负号。

4.下画线(underscore_)下画线可以用来分隔开数的表达以提高程序可读性。它不可以用在位宽和进制处,只能用在具体的数字之间。不会参与编译。

在Verilog 中用parameter定义常量,即用 parameter来定义一个标识符代表一个常量,称为符号常量。parameter型数据是一种常数型的数据。右侧只能加数字或之前定义过的变量。

parameter 参数名1=表达式,参数名2=表达式,...,参数名n=表达式;

数据类型:变量

Verilog中常用的变量类型有三种:wire,reg,和memory。

1.wire

wire型数据常用来表示用以assign关键字指定的组合逻辑信号。Verilog程序模块中输入,输出信号类型默认时自动定义为wire型。wire型信号可以用做任何方程式的输人,也可以用做“assign”语句或实例元件的输出。

wire 变量名;
wire [变量位宽-1:0] 变量名;
wire [变量位宽-1:0] 变量名1,变量名2;

wire可以理解为一条连接两个变量的电线。没有声明位宽时,wire的位宽为1。

2.reg

reg是寄存器数据类型的关键字。通过赋值语句可以改变寄存器储存的值,其作用与改变触发器储存的值相当。reg 型数据常用来表示“always”模块内的指定信号,常代表触发器。reg类型数据的默认初始值为不定值x。

reg [变量位宽-1:0] 变量名1, 变量名2,...;

3.memory

memory通过对reg型数据进行拓展范围得到。

reg [n—1:0] 存储器名[m-1:0];

表示定义一个有m个n位存储器的存储器。有m个存储单元。对存储器进行地址索引的表达式必须是常数表达式。

算术运算符和位运算符

在Verilog中算术运算符又称为二进制运算符,共有下面几种:

(1)+ (加法运算符,或正值运算符);
(2)- (减法运算符,或负值运算符);
(3)× (乘法运算符);
(3)/  (除法运算符);
(4)% (模运算符,或称为求余运算符,要求%两侧均为整型数据)。

在进行整数除法运算时,结果值要略去小数部分﹐只取整数部分;而进行取模运算时,结果值的符号位采用模运算式里第一个操作数的符号位。在进行算术运算操作时,如果某一个操作数有不确定的值x,则整个结果也为不定值x。

算术表达式结果的长度由最长的操作数决定。在赋值语句下,算术操作结果的长度由操作左端目标长度决定。

Verilog中还有物种位运算符号,对于变量的每一位分别进行计算。

(1) ~  按位取反
(2) &  按位与
(3) |  按位或
(4) ^  按位异或
(5) ^~ 按位同或

如果有多个操作数且两个操作数的长度不相等,将会对较短的数高位补零,使输出结果的长度与位宽较长的操作数的长度保持—致。
当操作数中有不定值x时,结果如下:

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值