热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

FPGA设计基本原则及设计思想

今天给大侠带来FPGA设计基本原则及思想,话不多说,上货。FPGA设计基本原则及思想一、硬件设计基本原则1、速度与面积平衡和互换原则:一

今天给大侠带来FPGA设计基本原则及思想,话不多说,上货。

 

 

 

 

 

 

 

FPGA设计基本原则及思想

 

 

一、硬件设计基本原则

1、速度与面积平衡和互换原则:一个设计如果时序余量较大,所能跑的频率远高于设计要求,能可以通过模块复用来减少整个设计消耗的芯片面积,这就是用速度优势换面积的节约;反之,如果一个设计的时序要求很高,普通方法达不到设计频率,那么可以通过数据流串并转换,并行复制多个操作模块,对整个设计采用“乒乓操作”和“串并转换”的思想进行处理,在芯片输出模块处再对数据进行“并串转换”。从而实现了用面积复制换取速度的提高。

2、硬件原则:理解HDL本质。

3、系统原则:整体把握。

4、同步设计原则:设计时序稳定的基本原则。

 

 

 

 

 

二、Verilog的分层建模

Verilog HDL 作为一种HDL语言,对系统行为的建模方式是分层次的。比较重要的层次有系统级(system)、算法级(Algorithm)、寄存器传输级(RTL)、逻辑级(Logic)、门级(Gate)、电路开关级(Switch)。

 

 

 

 

 

三、有关for循环

实际工作中,除了描述仿真测试激励(Testbench)时使用for循环语句外,极少在RTL级编码中使用for循环,这是因为for循环会被综合器展开为所有变量情况的执行语句,每个变量独立占用寄存器资源,不能有效的复用硬件逻辑资源,造成巨大的浪费。一般常用case语句代替。

 

 

 

 

 

四、关于if…else…和case

if…else…和case在嵌套描述时是有很大区别的,if…else…是有优先级的,一般来说,第一个if的优先级最高,最后一个else的优先级最低。而case语句是平行语句,它是没有优先级的,而建立优先级结构需要耗费大量的逻辑资源,所以能用case的地方就不要用if…else…语句。

补充:1.也可以用if…; if…; if…;描述不带优先级的“平行”语句。

 

 

 

 

 

五、关于Block RAM

3种块RAM结构,M512 RAM(512bit)、M4K RAM(4Kbit)、M-RAM(64Kbit).

M512 RAM:适合做一些小的Buffer、FIFO、DPRAM、SPRAM、ROM等;

M4K RAM: 适用于一般的需求;

M-RAM: 适合做大块数据的缓冲区。

Xlinx 和 Lattice FPGA的LUT可以灵活配置成小的RAM、ROM、FIFO等存储结构,这种技术被称为分布式RAM。

在一般的设计中,不提倡用FPGA的片内资源配置成大量的存储器,这是处于成本的考虑,所以尽量采用外接存储器。

 

 

 

 

 

六、合理利用芯片内部的PLL或DLL资源

善用芯片内部的PLL或DLL资源完成时钟的分频、倍频率、移相等操作,不仅简化了设计,并且能有效地提高系统的精度和工作稳定性。

 

 

 

 

 

七、异步电路和同步时序电路的区别

异步电路:

电路核心逻辑是用组合电路实现,异步时序电路的最大缺点是容易产生毛刺,不利于器件移植,不利于静态时序分析(STA)、验证设计时序性能。

 

同步时序电路:

电路核心逻辑是用各种触发器实现,电路主要信号、输出信号等都是在某个时钟沿驱动触发器产生的,同步时序电路可以很好的避免毛刺,利于器件移植,利于静态时序分析(STA)、验证设计时序性能。

 

 

 

 

 

八、同步设计中,稳定可靠的数据采样必须遵从以下两个基本原则

1、在有效时钟沿到达前,数据输入至少已经稳定了采样寄存器的Setup时间之久,这条原则简称满足Setup时间原则;

2、在有效时钟沿到达后,数据输入至少还将稳定保持采样寄存器的Hold时钟之久,这条原则简称满足Hold时间原则。

 

 

 

 

 

九、同步时序设计注意事项

 异步时钟域的数据转换,组合逻辑电路的设计方法,同步时序电路的时钟设计,同步时序电路的延迟。

同步时序电路的延迟最常用的设计方法是用分频或者倍频的时钟或者同步计数器完成所需的延迟&#xff0c;对比较大的和特殊定时要求的延时&#xff0c;一般用高速时钟产生一个计数器&#xff0c;根据计数产生延迟&#xff1b;对于比较小的延迟&#xff0c;可以用D触发器打一下&#xff0c;这样不仅可以使信号延时了一个时钟周期&#xff0c;而且完成了信号与时钟的初次同步。在输入信号采样和增加时序约束余量中使用。另外&#xff0c;还有用行为级方法描述延迟&#xff0c;如“#5 a<&#61;4’0101;”这种常用于仿真测试激励&#xff0c;但是在电路综合时会被忽略&#xff0c;并不能起到延迟作用。

Verilog HDL 定义的reg型&#xff0c;不一定综合成寄存器。在Verilog代码中最常用的两种数据类型是wire和reg型&#xff0c;一般来说&#xff0c;wire型指定的数据和网线通过组合逻辑实现&#xff0c;而reg型指定的数据不一定就是用寄存器实现。

 

 

 

 

 

十、模块划分基本原则

1、对每个同步时序设计的子模块的输出使用寄存器&#xff08;用寄存器分割同步时序模块原则&#xff09;。

2、将相关逻辑和可以复用的逻辑划分在同一模块内&#xff08;呼应系统原则&#xff09;。

3、将不同优化目标的逻辑分开。

4、将送约束的逻辑归到同一模块。 

5、将存储逻辑独立划分成模块。

6、合适的模块规模。 

7、顶层模块最好不进行逻辑设计。

 

 

 

 

 

十一、组合逻辑的注意事项

1、避免组合逻辑反馈环路&#xff08;容易毛刺、振荡、时序违规等&#xff09;。

解决方法&#xff1a; 

1)、牢记任何反馈回路必须包含寄存器&#xff1b;

2)、检查综合、实现报告的warning信息&#xff0c;发现反馈回路&#xff08;combinational loops&#xff09;后进行相应修改。

 

2、替换延迟链。

解决方法&#xff1a;用倍频、分频或者同步计数器完成。

 

3、替换异步脉冲产生单元&#xff08;毛刺生成器&#xff09;。

解决方法&#xff1a;用同步时序设计脉冲电路。

 

4、慎用锁存器。 

解决方法&#xff1a; 

1)、使用完备的if…else语句&#xff1b;

2)、检查设计中是否含有组合逻辑反馈环路&#xff1b; 

3)、对每个输入条件&#xff0c;设计输出操作&#xff0c;对case语句设置default操作。特别是在状态机设计中&#xff0c;最好有一个default的状态转移&#xff0c;而且每个状态最好也有一个default的操作。

4)、如果使用case语句时&#xff0c;特别是在设计状态机时&#xff0c;尽量附加综合约束属性&#xff0c;综合为完全条件case语句。

小技巧&#xff1a;仔细检查综合器的综合报告&#xff0c;目前大多数的综合器对所综合出的latch都会报“warning”&#xff0c;通过综合报告可以较为方便地找出无意中生成的latch。

 

 

 

 

 

十二、时钟设计的注意事项

同步时序电路推荐的时钟设计方法

时钟经全局时钟输入引脚输入&#xff0c;通过FPGA内部专用的PLL或DLL进行分频/倍频、移相等调整与运算&#xff0c;然后经FPGA内部全局时钟布线资源驱动到达芯片内所有寄存器和其他模块的时钟输入端。

 

 

 

 

 

十三、常用设计思想与技巧

1、乒乓操作&#xff1b;

2、串并转换&#xff1b;

3、流水线操作&#xff1b;

4、异步时钟域数据同步。

 

未待完续……

 

 

END

 

后续会持续更新&#xff0c;带来Vivado、 ISE、Quartus II 、candence等安装相关设计教程&#xff0c;学习资源、项目资源、好文推荐等&#xff0c;希望大侠持续关注。

大侠们&#xff0c;江湖偌大&#xff0c;继续闯荡&#xff0c;愿一切安好&#xff0c;有缘再见&#xff01;

 

 

 

 

 

精彩推荐

 

 

 

 

《模拟电子技术基础》第五版 童诗白 电子版

数字电子技术基础&#xff08;第六版&#xff09;教材 闫石 电子版

时序分析理论和timequest使用_中文电子版

欢迎加入FPGA技术江湖交流群&#xff01;


推荐阅读
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • C语言注释工具及快捷键,删除C语言注释工具的实现思路
    本文介绍了C语言中注释的两种方式以及注释的作用,提供了删除C语言注释的工具实现思路,并分享了C语言中注释的快捷键操作方法。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • switch语句的一些用法及注意事项
    本文介绍了使用switch语句时的一些用法和注意事项,包括如何实现"fall through"、default语句的作用、在case语句中定义变量时可能出现的问题以及解决方法。同时也提到了C#严格控制switch分支不允许贯穿的规定。通过本文的介绍,读者可以更好地理解和使用switch语句。 ... [详细]
  • 加密世界下一个主流叙事领域:L2、跨链桥、GameFi等
    本文介绍了加密世界下一个主流叙事的七个潜力领域,包括L2、跨链桥、GameFi等。L2作为以太坊的二层解决方案,在过去一年取得了巨大成功,跨链桥和互操作性是多链Web3中最重要的因素。去中心化的数据存储领域也具有巨大潜力,未来云存储市场有望达到1500亿美元。DAO和社交代币将成为购买和控制现实世界资产的重要方式,而GameFi作为数字资产在高收入游戏中的应用有望推动数字资产走向主流。衍生品市场也在不断发展壮大。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • 本文讨论了如何使用IF函数从基于有限输入列表的有限输出列表中获取输出,并提出了是否有更快/更有效的执行代码的方法。作者希望了解是否有办法缩短代码,并从自我开发的角度来看是否有更好的方法。提供的代码可以按原样工作,但作者想知道是否有更好的方法来执行这样的任务。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • This article discusses the efficiency of using char str[] and char *str and whether there is any reason to prefer one over the other. It explains the difference between the two and provides an example to illustrate their usage. ... [详细]
  • 本文介绍了OpenStack的逻辑概念以及其构成简介,包括了软件开源项目、基础设施资源管理平台、三大核心组件等内容。同时还介绍了Horizon(UI模块)等相关信息。 ... [详细]
  • 本文讨论了编写可保护的代码的重要性,包括提高代码的可读性、可调试性和直观性。同时介绍了优化代码的方法,如代码格式化、解释函数和提炼函数等。还提到了一些常见的坏代码味道,如不规范的命名、重复代码、过长的函数和参数列表等。最后,介绍了如何处理数据泥团和进行函数重构,以提高代码质量和可维护性。 ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
author-avatar
白猫警员123
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有