明德扬论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信扫一扫,快捷登录!

查看: 7345|回复: 0

【FPGA至简设计原理与应用】第一篇 第三章硬件描述语言Verilog第3节模块结构

[复制链接]
发表于 2020-9-7 18:31:12 | 显示全部楼层 |阅读模式

马上注册,看完整文章,学更多FPGA知识。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本案例的编号为:001500000128,如果有疑问,请按编号在下面贴子查找答案:MDY案例交流【汇总贴】_FPGA-明德扬科教 (mdy-edu.com)
本文为明德扬原创及录用文章,转载请注明出处

大家好,近期我们会连载《FPGA至简设计原理与应用》一书,有兴趣的同学可以学习,也希望大家可以对我们的书提出宝贵的意见和建议。


FPGA至简设计原理与应用》书籍连载索引目录

http://www.fpgabbs.cn/forum.php?mod=viewthread&tid=989


读过的朋友可积极在贴后留言,书籍正式出版时,我们会从留言者中挑选20位幸运读者,幸运读者可获潘老师亲笔签名书籍一本。

注:手机浏览可能格式会乱,建议用电脑端进行浏览。






第3节 模块结构


3.1 模块介绍

本文档编号:001100000036
需要看对应的视频,请点击视频编号:001100000051
1. 本节主要介绍模块结构,模块(module)是verilog的基本描述单位,是用于描述某个设计功能或结构及与其他模块通信的外部端口,有5个主要部分:端口定义、参数定义(可选)、I/O说明、内部信号声明、功能定义。     
2. ALTERA和VIVADO文档
   
    模块(module)是Verilog 的基本描述单位,是用于描述某个设计的功能或结构及与其他模块通信的外部端口。

    模块在概念上可等同一个器件,就如调用通用器件(与门、三态门等)或通用宏单元(计数器、ALUCPU)等。因此,一个模块可在另一个模块中调用,一个电路设计可由多个模块组合而成。一个模块的设计只是一个系统设计中的某个层次设计,模块设计可采用多种建模方式。

    Verilog 的基本设计单元是模块。采用模块化的设计使系统看起来更有条理也便于仿真和测试,因此整个项目的设计思想就是模块套模块,自顶向下依次展开。在一个工程的设计里,每个模块实现特定的功能,模块间可进行层次的嵌套。对大型的数字电路进行设计时,可以将其分割成大小不一的小模块,每个小模块实现特定的功能,最后通过由顶层模块调用子模块的方式来实现整体功能,这就是Top-Down的设计思想。本书主要以Verilog硬件描述语言为主,模块是Verilog的基本描述单位,用于描述每个设计的功能和结构,以及其他模块通信的外部接口。
   
    模块有五个主要部分:端口定义、参数定义(可选)、 I/O说明、内部信号声明、功能定义。模块总是以关键词module开始,以关键词endmodule结尾。它的一般语法结构如下所示:



下面笔者详细分析一下这段代码:

3.2 模块名和端口定义
第1至5行声明了模块的名字和输入输出口。其格式如下:
module 模块名(端口 1,端口 2,端口 3,……);
其中模块是以module开始,以endmodule结束。模块名是模块唯一的标识符,一般建议模块名尽量用能够描述其功能的名字来命名,并且模块名和文件名相同。
模块的端口表示的是模块的输入和输出口名,也是其与其他模块联系端口的标识。

3.3 参数定义

    第8行参数定义是将常量用符号代替以增加代码可读性和可修改性。这是一个可选择的语句,用不到的情况下可以省略,参数定义一般格式如下:
parameter DATA_W = x;

3.4 接口定义

    第912行是I/O(输入/输出)说明,模块的端口可以是输入端口、输出端口或双向端口。其说明格式如下。
输入端口:     input [信号位宽-1 0] 端口名 1
                 input [信号位宽-1 0] 端口名 2
                 ……;
输出端口:     output [信号位宽-1 0] 端口名 1
                 output [信号位宽-1 0] 端口名 2
                 ……;
双向端口:inout [信号位宽-1 0] 端口名 1
inout [信号位宽-1 : 0] 端口名 2;
                 ……;

3.5 信号类型

    第14至17行定义了信号的类型。这些信号是在模块内使用到的信号,并且与端口有关的 wire 和 reg 类型变量。其声明方式如下:
    reg [width-1 : 0] R 变量 1, R 变量 2 ……;
wire [width-1 : 0] W 变量 1W 变量 2……
如果没有定义信号类型,默认是wire型,并且信号位宽为1。

3.6 功能描述

    第21至31行是功能描述部分。模块中最重要的部分是逻辑功能定义部分,有三种方法可在模块中产生逻辑。
1.       用“assign”声明语句,如描述一个两输入与门:assign  a = b & c。详细功能见“功能描述-组合逻辑”一节。
2.       用“always”块。即前面介绍的时序逻辑和组合逻辑。
3.       模块例化。详细功能见“模块例化”一节。

3.7 模块例化

    对数字系统的设计一般采用的是自顶向下的设计方式,可将系统划分成几个功能模块,每个功能模块再划分成下一层的子模块。每个模块的设计对应一个module ,每个module 设计成一个Verilog HDL 程序文件。因此,对一个系统的顶层模块采用结构化设计,即顶层模块分别调用了各个功能模块。
    一个模块能够在另外一个模块中被引用,这样就建立了描述的层次。

模块实例化语句形式如下:
module_name instance_name(port_associations) ;
信号端口可以通过位置或名称关联,但是关联方式不能够混合使用。
端口关联形式如下:
port_expr / /通过位置。
.PortName (port_expr) / /通过名称。
1
  
2
  
3
  
4
  
5
  
6
  
7
  
8
  
9
  
10
  
11
  
12
  
13
  
14
  
15
  
16
  
17
module  and  CAB);
  
input  AB
  
output   C
  
//省略
  
endmodule
  
//在下面的“and_2”块中对上一模块“and”进行例化,可以有两种方式:
  
module and_2(xxxxx)
  
...
  
//方式一:实例化时采用位置关联,T3对应输出端口CA对应AB对应B
  
and A1 (T3, A, B );  
  
//方式二:实例化时采用名字关联,.Cand 器件的端口,其与信号T3相连
  
and  A2
  
.CT3),
  
.AA),
  
.BB));
  
  
endmodule;
建议:在例化的端口映射中请采用名字关联,这样,当被调用的模块管脚改变时不易出错。
在实例化中,可能有些管脚没用到,可在映射中采用空白处理,如:
1
  
2
  
3
  
4
  
5
  
6
DFF d1 (
  
.Q(QS),
  
.Qbar ( ),      // 该管脚悬空
  
.Data (D ) ,
  
.Preset ( ),     // 该管脚悬空
  
.Clock (CK) ); //名称对应方式。
输入管脚悬空端口的输入为高阻 Z,由于输出管脚是被悬空的,该输出管脚废弃不用。



您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|MDYBBS ( 粤ICP备16061416号 )

GMT+8, 2024-11-23 00:38 , Processed in 0.050402 second(s), 21 queries .

Powered by Discuz! X3.4

本论坛由广州健飞通信有限公司所有

© 2001-2019 Comsenz Inc.

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