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

这篇具有很好参考价值的文章主要介绍了【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。

这个例子是要实现一个与门,抽象出的电路结构应该是这样的:
【FPGA】Verilog描述电路的三种方式(结构化、数据流和行为化),Verilog语法,fpga开发,Xilinx,IC,FPGA,altera
如果采用结构化描述方式来实现这个功能,那么就是调用一个与门:

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@(*)begin
	if(A == 1'b1 && B == 1'b1)
		C = 1'b1;
	else
		C = 1'b0;
end

endmodule 

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

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

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

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

半加器实例

如果觉得上面的例子不够直观,那么再来看一个半加器的例子。下面是半加器的真值表:
【FPGA】Verilog描述电路的三种方式(结构化、数据流和行为化),Verilog语法,fpga开发,Xilinx,IC,FPGA,altera

从真值表可以很快地推断出其电路的实现形式:
【FPGA】Verilog描述电路的三种方式(结构化、数据流和行为化),Verilog语法,fpga开发,Xilinx,IC,FPGA,altera

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

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生成的电路:
【FPGA】Verilog描述电路的三种方式(结构化、数据流和行为化),Verilog语法,fpga开发,Xilinx,IC,FPGA,altera
就是个半加器,具体怎么实现的不知道(抽象级别很高),因为电路的具体实现工作被交给了综合工具。文章来源地址https://www.toymoban.com/news/detail-801373.html

总结

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

  • 📣您有任何问题,都可以在评论区和我交流📃!
  • 📣本文由 孤独的单刀 原创,首发于CSDN平台🐵,博客主页:wuzhikai.blog.csdn.net
  • 📣您的支持是我持续创作的最大动力!如果本文对您有帮助,还请多多点赞👍、评论💬和收藏⭐

到了这里,关于【FPGA】Verilog描述电路的三种方式(结构化、数据流和行为化)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构|二叉树的三种遍历方式,你掌握了几种?

    目录 1、遍历方式 2、前序遍历 3、中序遍历 学习二叉树的结构,最简单的方式就是遍历二叉树。遍历二叉树就是 通过某条线路对二叉树的各个结点进行一次访问 ,访问的方法有三种分为前序遍历、中序遍历、后续遍历,层序遍历它们的遍历顺序如下所示: 前序遍历: 根节点

    2023年04月16日
    浏览(46)
  • 数电实验3:从电路到代码+结构化设计

    西南交大数电实验 练习写HDL的好地方 1、巩固组合逻辑电路设计、仿真方法。 2、学习Verilog HDL层次化文件设计。 实验内容按以下步骤,用Verilog HDL描述和仿真图示电路。该电路实现1位二进制加法,X、Y分别是加数、被加数,CIN是低位来的进位,COUT是向高位的进位,S是相加的

    2024年02月08日
    浏览(37)
  • 【算法与数据结构】二叉树的三种遍历代码实现(下)—— 非递归方式实现(大量图解)

     上篇: 【算法与数据结构】二叉树的三种遍历代码实现(上)—— 用递归序知识点讲解_Hacynn的博客-CSDN博客 https://blog.csdn.net/zzzzzhxxx/article/details/133609612?spm=1001.2014.3001.5502 目录 前言 1、先序遍历 1.1、详细图解描述 1.2、先序遍历非递归代码实现  2、中序遍历 2.1、详细图解描

    2024年02月08日
    浏览(37)
  • 恒流电路的三种设计方案

    作为硬件研发工程师相信对恒流电路不会陌生,本文介绍下三种恒流电路的原理图。 三极管恒流电路 三极管恒流电路     三极管的恒流电路,主要是利用Q2三极管的基级导通电压为0.6~0.7V这个特性;当Q2三极管导通,Q1三极管基级电压被拉低而截止,负载R1不工作;负载R1流

    2024年02月11日
    浏览(49)
  • 全减器---Verilog实现(结构描述,数据流描述,行为描述,层次结构描述)

    全减器真值表—引用知乎:链接: 全减器真值表怎么理解 代码部分 原理图 代码部分 原理图 代码部分 原理图 代码部分 原理图

    2024年02月12日
    浏览(57)
  • 【【典型电路设计之片内存储器的设计之RAM的Verilog HDL描述一】】

    RAM是随机存储器,存储单元的内容可按需随意取出或存入。这种存储器在断电后将丢失所有数据,一般用来存储一些短时间内使用的程序和数据。 其内部结构如下图所示: 例:用Verilog HDL 设计深度为8,位宽为8的单端口RAM。 单口RAM,只有一套地址总线,读和写操作是分开的

    2024年02月12日
    浏览(46)
  • 三种常见平方根算法的电路设计及Verilog实现与仿真

    数学是物理的基础,是广大世界的基本组成部分,而数学运算是数学理论的核心部分,数学运算有加减乘除乘方等基本运算,拓展的运算里有一项是开方运算,开方运算在数字计算、图形显示等领域具有重要的地位,所以如何在硬件上实现该运算可以提高计算单元的性能,加

    2024年02月15日
    浏览(43)
  • 线程创建的三种方式

    目录 1. Thread类 2. Runnable接口 3. Callable接口 4. 线程的生命周期 新建  就绪 运行 阻塞 等待 结束 继承Thread类的方式创建线程 定义Thread类的子类,并重写该类的run()方法,该run()方法的方法体就代表了线程需要完成的任务 创建Thread类的子类,即创建了线程对象 调用线程对象的

    2024年02月09日
    浏览(42)
  • Servlet的三种映射方式

    Servlet支持三种映射方式,以达到灵活配置的目的。 首先先创建Servlet(创建方式略),然后再web.xml中就行配置。 配置方式:         (1)、 指名道姓的方式         注:此种方式,只有和映射配置一模一样时,Servlet才会接收和响应来自客户端的请求。 示例:         (

    2024年02月06日
    浏览(44)
  • 解决NPE的三种方式

    NullPointerException(空指针异常,NPE)是Java编程中常见的错误。解决NPE的方法可以从以下三个方面考虑: 明确处理空引用情况: 在某些情况下,无法避免使用可能为空的引用对象。此时,需要明确处理空引用情况,以避免抛出NPE。可以使用条件判断,例如使用if-else语句或者三

    2024年02月22日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包