【FPGA】Verilog描述电路的三种方式(结构化、数据流和行为化)

前言

众所周知,Verilog是作为一种HDL(Hardware Description Language,硬件描述语言)出现的,它的主要功能是在不同的抽象层级上描述电路,从而实现电路设计。那么到底该如何描述电路?Verilog提供了3种不同的方式:

  • 结构化描述方式(结构模型,Structural Modeling)
  • 数据流描述方式(数据模型,Dataflow modeling)
  • 行为级描述方式(行为模型,Behavior Modeling)

结构化描述方式

结构化描述方式是抽象级别最低的描述方式,但它也最接近底层电路的具体实现。先来看一个例子:

输入信号分别为1bit的信号A和信号B,输出信号为1bit的信号C。只有当A和B同时为逻辑1时,输出C才为逻辑1,其他情况输出C为逻辑0。

这个例子是要实现一个与门,抽象出的电路结构应该是这样的:
在这里插入图片描述
如果采用结构化描述方式来实现这个功能,那么就是调用一个与门:

module test(input	A,B,output	C
);and and_test(C,A,B);	//与门实现,这是与门的原语endmodule 

这种实现方式其实就是在直接用门电路来搭建电路,电路规模小的时候还好,一旦要设计的电路变大、变复杂后,再用这种方式显然就非常低效了,同时这种方式对设计人员也是一种考验与折磨。

目前,这种搭建式的方法在FPGA设计中已经不常使用了。首先,它难以描述复杂的电路;其次这种方法需要抽象出电路的具体实现,相当于本该综合工具干的活被你自己给干了,那你觉得这种工作你能干得比综合工具快?比综合工具好?

但是,结构化描述方法在日常设计中仍然以一种特殊的形式而存在–实例化(Instantiation)。由于当前的FPGA设计大多采用模块化的设计方法,所以实例化仍然必不可少。

数据流描述方式

数据流描述方式比结构化描述方式的抽象级别高一些,因为它不需要直接描述出电路的底层实现方式,而只需要对数据是如何流动的这一现象进行描述,从而实现电路功能。

仍然采用上面的例子,看看数据流描述方式是如何描述电路的:

module test(input	A,B,output	C
);assign C = A & B;endmodule 

这种方式清晰地描述了数据从输入到输出的流动情况,即从A\B输入,彼此相与后再从C输出。

这种方法比上一种方法简单不少,原本需要用门电路搭建的电路只需要用一个 与运算符(&) 即可实现,而具体的实现方式就交给了综合工具。

行为级描述方式

行为级描述方式是抽象级别最高的描述方式,多用于大型设计。同样的例子,它是这样描述电路的:

module test(input		A,B,output	reg	C
);always@(*)beginif(A == 1'b1 && B == 1'b1)C = 1'b1;elseC = 1'b0;
endendmodule 

重点在这一句“ if(A == 1’b1 && B == 1’b1) C = 1’b1;”,即描述电路的行为:只有当A和B同时为逻辑1时,输出C才为逻辑1,其他情况输出C为逻辑0

行为级描述方式不需要抽象出电路的具体实现,也不需要管数据的流动方式,只需要对电路的外在表现,即电路的具体行为进行描述。这种方法最符合人类的直观思维,抽象级别最高,概括能力最强。

但这种方式也是有缺点的,缺点也恰恰是因为它太抽象了!所以很多时候设计人员根本就不知道底层电路是什么样子的,这使得有时候做FPGA设计,不像是在设计硬件,反而像是在设计软件!

因此在实践中,往往都是三种描述方式混用,这样既保证了一定的抽象程度,使得大规模的电路设计成为现实,同时也能让设计人员对底层电路保持一定的了解,以便对电路进行面积与速度上的优化。

半加器实例

如果觉得上面的例子不够直观,那么再来看一个半加器的例子。下面是半加器的真值表:
在这里插入图片描述

从真值表可以很快地推断出其电路的实现形式:
在这里插入图片描述

所以采用结构化描述方式来对半加器进行描述,是这样的:

module half_adder(input	A,B,output	S,C
);xor xor_test(S,A,B);	//异或门,底层原语
and and_test(C,A,B);    //与门,底层原语endmodule 

这种方式直接描述出了电路的底层实现(用门电路实现),抽象级别很低,不适用于大规模的设计。

同样从真值表,可以推断出数据的流动方式:S = A ^ B; C = A & B; 所以用数据流描述方式来描述电路,是这样的:

module half_adder(input	A,B,output	S,C
);assign S = A ^ B; 
assign C = A & B;endmodule 

这种方式隐式地描述了电路的实现方式,同时也具备一定的抽象层级。

半加器要实现的功能就是没有进位输入、但有进位输出的两个1bit数的加法(电路行为),即 {C,S} = A + B; 所以用行为级描述方式来描述电路,是这样的:

module half_adder(input	A,B,output	S,C
);assign {C,S} = A + B;endmodule 

这是用vivado生成的电路:
在这里插入图片描述
就是个半加器,具体怎么实现的不知道(抽象级别很高),因为电路的具体实现工作被交给了综合工具。

总结

  • 结构化描述方式抽象层级最低,但也最接近底层电路;描述大型电路时效率低,所以在当前设计中较少见,但作为其另一形式存在的实例化在实践中仍然比不可少
  • 数据流描述方式抽象层级居中,但需要设计人员对电路有较深的理解,与行为级描述方式并称为RTL级描述
  • 行为级描述方式抽象层级最高,不需要对底层电路有过多的理解,最符合人类大脑直觉,开发效率最高

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/411940.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Android] Android架构体系(1)

文章目录 Android 的框架Dalvik 虚拟机JNI原生二进制可执行文件Android NDK中的binutils Bionic谷歌考虑到的版权问题Bionic与传统的C标准库(如glibc)的一些不同 参考 Android 的框架 Android 取得成功的关键因素之一就是它丰富的框架集。 没有这些框架…

【数学建模】2024年华数杯国际赛B题-光伏发电Photovoltaic Power 思路、代码、参考论文

1 问题背景 中国电力构成包括传统能源(如煤炭、石油、天然气)、可再生能源(如水电、风能、太阳能、核能)和其他形式的电力。这些发电模式在满足中国巨大的电力需求方面发挥着至关重要的作用。据最新数据显示,中国总发电量超过20万亿千瓦时,居世界第一。…

CSS||选择器

目录 作用 分类 基础选择器 标签选择器 ​编辑类选择器 id选择器 通配符选择器 作用 选择器(选择符)就是根据不同需求把不同的标签选出来这就是选择器的作用。 简单来说,就是选择标签用的。 选择器的使用一共分为两步: 1.…

微信小程序+前后端开发学习材料2-(视图+基本内容+表单组件)

学习来源 视图 1.swiper 滑块视图容器。其中只可放置swiper-item组件,否则会导致未定义的行为。 显示面板指示点indicator-dots 基础内容 1.icon 图标组件 实例演示 2.progress 进度条。组件属性的长度单位默认为px,咱用rpx。 实例演示 这…

Ubuntu20.04-剪贴板

针对图形界面用户 1.两种方式 1.1 安装Parcellite 简单轻量级剪贴板管理器 sudo apt install parcellite 1.2 安装Gpaste 更强大的剪贴板管理器,包含历史记录和同步功能 sudo apt install gpaste

wox 启动的cmd无法识别npm

安装软件步骤:everything->wox->nvm->npm->yarn 新打开的任意cmd窗口均发现可以识别npm和yarn命令,但是wox启动的cmd窗口就不行 联想到cmd的特性是一个cmd窗口打开后,其运行环境就会固定,不会随着你系统环境变量的更…

【昕宝爸爸小模块】深入浅出之POI是如何做大文件的写入的

➡️博客首页 https://blog.csdn.net/Java_Yangxiaoyuan 欢迎优秀的你👍点赞、🗂️收藏、加❤️关注哦。 本文章CSDN首发,欢迎转载,要注明出处哦! 先感谢优秀的你能认真的看完本文&…

逆向使用webpack打包的网站

webpack webpack 是 JavaScript 应用程序的模块打包器,可以把开发中的所有资源(图片、js文件、css文件等)都看成模块,通过loader(加载器)和 plugins (插件)对资源进行处理,打包成符…

SpringBoot项目里用MultipartFile作为入参获取到的file为什么null

前言: 最近在项目中用到了Excel模板导入功能,但是在测试阶段用Postman测试时,通过Post请求,传到后端的File一直为null。其中前端传参和请求都没问题,后端的接参也没问题,问题出在过滤器的复用上。 问题场…

Windows如何安装VNC+Viewer+cpolar实现远程Ubuntu桌面?

文章目录 前言1. ubuntu安装VNC2. 设置vnc开机启动3. windows 安装VNC viewer连接工具4. 内网穿透4.1 安装cpolar【支持使用一键脚本命令安装】4.2 创建隧道映射4.3 测试公网远程访问 5. 配置固定TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址5.3 测试…

2.4 网络层01

2.4 网络层01 2.4.1 网络层概述 网络层的主要任务是实现网络互连,进而实现数据包在各网络之间的传输。 异构网络内部的计算机要想实现通信是不需要实现网络互联的,异构网络之间要想实现通信就必须实现网络互连。 路由器工作在五层协议体系结构的网络…

计算机毕业设计 基于Java的国产动漫网站的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…