Verilog数字系统设计教程【夏宇闻】笔记3

本文详细解释了Verilog编程中的模块结构,包括模块的组成部分(接口与逻辑功能)、端口定义、I/O说明(输入/输出及双向总线端口)、内部信号声明(wire和reg类型变量)以及功能定义(assign、实例元件与always块)。强调了并行执行和顺序执行的区别。
摘要由CSDN通过智能技术生成

模块的结构

Verilog 的基本设计单元是“模块”(block)。一个模块是由两部分组成的,一部分描述接口,另一部分描述逻辑功能,即定义输入是如何影响输出的,图 1.3.1是模块结构组成图。

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

端口定义

模块的端口声明了模块的输入输出口。格式如下:
module 模块名(口1,口 2,口 3,口4);
模块的端口表示的是模块的输入还是输出口名,也就是说它与别的模块联系端口的标识。在模块被引用时,在引用的模块中,有些信号要输入到被引用的模块中,有些信号需要从被引用的模块中取出来。用在引用模块时其端口可以两种方法连接:
(1)在引用时,严格按照模块定义的端口顺序来连接,不用标明原模块定义时规定的端口名,例如:模块名( 连接端口1信号名,连接端口2信号名连接端口3信号名,……,);
(2)在引用时用“.”符号,标明原模块是定义时规定的端口名,例如:模块名(.端口1名(连接信号1名),端口2名(连接信号2名),……,);这样表示的好处在于可以用端口名与被引用模块的端口相对应,而不必严格按端口顺序对应,提高了程序的可读性和可移植性。

I/O 说明的格式

输入口: input[信号位宽-1:0]端口名1;
input[信号位宽-1:0]端日名2;
……
input[信号位宽-1:0]端口名i; //(共有i个输入口)
输出口:
output[信号位宽-1:0]端口名1;
output[信号位宽-1:0]端口名2;
……
output[信号位宽-1:0]端口名j; //(共有j个输出口)
输入/输出口;
inout[信号位宽-10]端口名1:
inout[信号位宽-1;]端口名 2;
……
inout[信号位宽-1:0端口名 k;//(共有k个双向总线端口)
I/O说明也可以写在端口声明语句里。其格式如下:
module module_name(input portl ,input port2 ,… output portl ,output port2… );

内部信号声明

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

功能定义

模块中最重要的部分是逻辑功能定义部分。有3种方法可在模块中产生逻辑。
1)用“assign”声明语句
如;assign a = b & c;
这种方法的句法很简单,只需写一个“assign”,后面再加一个方程式即可。例中的方程式描述了一个有两个输入的与门。
2)用实元件
如:and #2 ul(q,a,b);
采用实例元件的方法像在电路图输入方式下调入库元件一样,键入元件的名字和相连的引脚即可,表示在设计中用到一个跟与门(and)一样的名为 u1的与门,其输人端为 a,b,输出为q。输出延迟为2个单位时间。要求模块中每个具体化后的实例元件的名字必须是惟一的,以避免与其他调用与门(and)的实例混滑
3)用“always”块
如:always @(posedge clk or posedge clr)
begin
if(clr) g<=0;else if(en)q<=d;
end
采用“assign语句是描述组合逻辑最常用的方法之一。而“always”块既可用于描述组合逻辑也可描述时序逻辑。上面的例子用“always”块生成了一个带有异步清除端的 D触发器“always”块可用很多种描述手段来表达逻辑,例如上例中就用了 if-else 语句来表达逻辑关系。如按一定的风格来编写“always”块,可以通过综合工具把源代码自动综合成用门级结构表示的组合或时序逻辑电路。
如果用 Verilog 模块实现一定的功能,首先应该清楚哪些是同时发生的,哪些是顺序发生的。上面的例子分别采用了“assign”语句实例元件和“always”块。这3个例子描述的逻辑功能是同时执行的。也就是说,如果把这3 项写到一个 Verilog 模块文件中去,它们的顺序不会影响实现的功能。这 3 项是同时执行的,也就是并发的
然而在“always”模块内,逻辑是按照指定的顺序执行的。“always”块中的语句称为“顺序语句”,因为它们是顺序执行的,请注意,两个或更多的“always”模块也是同时执行的,但是模块内部的语句是顺序执行的。
总结
(1)在 Verilog 模块中所有过程块(如:initial 块always 块)、连续赋值语句、实例引用都是并行的;
(2)它们表示的是一种通过变量名互相连接的关系;
(3)在同一模块中这三者出现的先后顺序没有关系;
(4)只有连续赋值语句 assign 和实例引用语可以独立于过程块而存在于模块的功能定义部分。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值