Verilog HDL的基本语法

1.Verilog HDL的基本语法

1.1简单的Verilog HDL模块

1.1.1简单的Verilog HDL程序特点

  • Verilog HDL程序是由模块构成的。每个模块的内容都是嵌在module和endmodule两个语句之间。每个模块实现特定的功能。模块是可以进行层次嵌套的。正因为如此,才可以将大型的数字电路设计分割成不同的小模块来实现特定的功能,最后通过顶层模块调用子模块来实现整体功能;
  • 每个模块要进行端口定义,并说明输入输出口,然后对模块的功能进行行为逻辑描述;
  • Verilog HDL程序的书写格式自由,一行可以写几个语句,一个语句也可以分写多行;
  • 除了endmodule语句外,每个语句和数据定义的最后必须有分号;
  • 可以用//和//…对Verilog HDL程序的任何部分作注释。一个好的,有使用价值的源程序都应当加上必要的注释,以增强程序的可读性和可维护性。

1.1.2模块的结构

  • Verilog的基本设计单元是“模块”(block)。一个模块是由两部分组成的,一部分描述接口,另一部分描述逻辑功能,即定义输入是如何影响输出的。
  • 每个Verilog程序包括四个主要部分: 端口定义 、I/O说明、内部信号声明、功能定义。

1.1.3模块的端口定义

模块的端口声明了模块的输入、输出口。其格式如下:
module 模块名(口1,口2,口3,口4, ………);

1.1.4模块内容

模块的内容包括I/O说明、内部信号声明、功能定义。

  • I/O说明的格式如下:

输入口: input 端口名1,端口名2,………,端口名i; //(共有i个输入口)
输出口: output 端口名1,端口名2,………,端口名j; //(共有j个输出口)
I/O说明也可以写在端口声明语句里。其格式如下:
module module_name(input port1,input port2,…output port1,output port2… );

  • 内部信号说明:

在模块内用到的和与端口有关的wire 和reg变量的声明,如:
reg [width-1 : 0] R变量1,R变量2 。。。。;
wire [width-1 : 0] W变量1,W变量2 。。。。;
…………

  • 功能定义:

模块中最重要的部分是逻辑功能定义部分。有三种方法可在模块中产生逻辑。
1)用“assign”声明语句
如: assign a = b & c;
这种方法的句法很简单,只需写一个“assign”,后面再加一个方程式即可。例子中的方程式描述了一个有两个输入的与门。
2)用实例元件
如: and and_inst( q, a, b ); 采用实例元件的方法象在电路图输入方式下,调入库元件一样。键入元件的名字和相连的引脚即可,表示在设计中用到一个跟与门(and)一样的名为and_inst的与门,其输入端为a, b,输出为q。要求每个实例元件的名字必须是唯一的,以避免与其他调用与门(and)的实例混淆。
3)用“always”块
如:always @(posedge clk or posedge clr)
begin
if(clr) q <= 0;
else if(en) q <= d;
end

采用“assign”语句是描述组合逻辑最常用的方法之一。
“always”块既可用于描述组合逻辑也可描述时序逻辑。

note:

  • 如果用Verilog模块实现一定的功能,首先应该清楚哪些是同时发生的,哪些是顺序发生的。
  • 在“always”模块内,逻辑是按照指定的顺序执行的。“always”块中的语句称为“顺序语句”,因为它们是顺序执行的。请注意,两个或更多的“always”模块也是同时执行的,但是模块内部的语句是顺序执行的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值