集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 951|回复: 0

Verilog HDL的基本语法

[复制链接]
LYF 发表于 2021-7-28 08:50:59 | 显示全部楼层 |阅读模式
模块的结构
Verilog的基本设计单元是“模块”(block)。一个模块是由两部分组成的,一部分描述接口,另一部
分描述逻辑功能,即定义输入是如何影响输出的。下面举例说明:

module block (a,b,c,d);
input a,b;
output c,d;
assign c= a | b ;
assign d= a & b;
endmodule

a
b
c
d
请看上面的例子,程序模块旁边有一个电路图的符号。在许多方面,程序模块和电路图符号是一致的,
这是因为电路图符号的引脚也就是程序模块的接口。而程序模块描述了电路图符号所实现的逻辑功
能。上面的Verilog设计中,模块中的第二、第三行说明接口的信号流向,第四、第五行说明了模块
的逻辑功能。以上就是设计一个简单的Verilog程序模块所需的全部内容。
从上面的例子可以看出,Verilog结构完全嵌在module和endmodule声明语句之间,每个Verilog程序
包括四个主要部分:端口定义、I/O说明、内部信号声明、功能定义。
3.1.3.模块的端口定义

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

3.1.4.模块内容

模块的内容包括I/O说明、内部信号声明、功能定义。
y I/O说明的格式如下:
输入口: input 端口名1,端口名2,………,端口名i; //(共有i个输入口)
输出口: output 端口名1,端口名2,………,端口名j; //(共有j个输出口)
I/O说明也可以写在端口声明语句里。其格式如下:
module module_name(input port1,input port2,…
19
第三章 Verilog HDL 基本语法
--------------------------------------------------------------------------------------------------------------------------------------------
------
output port1,output port2… );
y 内部信号说明:在模块内用到的和与端口有关的wire 和 reg 变量的声明。
如: reg [width-1 : 0] R变量1,R变量2 。。。。;
wire [width-1 : 0] W变量1,W变量2 。。。。;
………..
y 功能定义: 模块中最重要的部分是逻辑功能定义部分。有三种方法可在模块中产生逻辑。
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”块既可用于描述组合逻辑也可
描述时序逻辑。上面的例子用“always”块生成了一个带有异步清除端的D触发器。“always”块可
用很多种描述手段来表达逻辑,例如上例中就用了if...else语句来表达逻辑关系。如按一定的风格
来编写“always”块,可以通过综合工具把源代码自动综合成用门级结构表示的组合或时序逻辑电路。
注意:
如果用Verilog模块实现一定的功能,首先应该清楚哪些是同时发生的,哪些是顺序发生的。上面三个
例子分别采用了“assign”语句、实例元件和“always”块。这三个例子描述的逻辑功能是同时执行的。
也就是说,如果把这三项写到一个 VeriIog 模块文件中去,它们的次序不会影响逻辑实现的功能。
这三项是同时执行的,也就是并发的。
然而,在“always”模块内,逻辑是按照指定的顺序执行的。“always”块中的语句称为“顺序语句”,
因为它们是顺序执行的。请注意,两个或更多的“always”模块也是同时执行的,但是模块内部的语
句是顺序执行的。 看一下“always”内的语句,你就会明白它是如何实现功能的。 if..else… if
必须顺序执行,否则其功能就没有任何意义。如果else语句在if语句之前执行,功能就会不符合要求!
为了能实现上述描述的功能,“always”模块内部的语句将按照书写的顺序执行。
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|小黑屋|手机版|Archiver|fpga论坛|fpga设计论坛 ( 京ICP备20003123号-1 )

GMT+8, 2024-11-15 19:36 , Processed in 0.057321 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表