1、状态机的问题,尽量不要写出太大的状态机,宁愿用一些小型的状态机来相互关联。

2、推荐大家使用timequest来做时序约束,好处是,它可能对你的时序约束和你的设计对照做分析,在做时序分析之前,先对你的约束做分析,然后告诉你,你有多少该做的事情而没有做的(为被约束的路径)还有多少你要求做的,而没有被做的(被忽略的时序要求)。

3、对时钟的约束,要重点关注两个现象。首先是尽量少的在时钟路径上引入逻辑,否则可能造成了时钟和时钟之间的skew。另外就是一种上下沿都需要用来采集数据的时钟。对于时钟的约束有很多的地方需要注意,否则你的电路都不知道会飞到哪里去。

4、约束中最重要的一个关键,不要过约束。过约束的坏处一大堆,增加编译时间,资源使用过度,导致其他的时序问题。如果你对自己的约束有些不太放心,又或者说可能器件和器件之间会有很细微的差别,你可以给约束做一些余量,但是过约束是万万要不得的。

5、IP的作用就是为了完成一个特定的功能,所以我们并不需要知道它是如何实现的。作为一个IP,最重要的,其实是接口,因为你最重要的是需要知道是怎么让它工作起来,而不是它怎么工作的。所以在看文档的时候,最主要看的就是接口信号,对所有的信号的作用有一个了解。例如,NiosII CPU作为一个比较大型的模块,使用的是Avalon MM 点对点接口,它与普通的PCI接口不同的地方是,他可以支持同时多线控制。因为它没有总线的概念,不会在总线被占据的时候,其他任何通讯都无法进行。NiosII是在SOPC builder 中被直接使用的,我们不需要知道具体有哪些信号,因为没有非常需要,我们是看不到这些接口的。在NiosII中,我们有两个Master Avalon MM 接口,一个是Instruction Master Port, 这是CPU用来读取指令的接口。CPU通过这个端口从Memory上读取指令。另一个是Data master port, 很简单,这是用来连接数据通道的。比如说你要读取的数据,你要存储的数据,都是走这个通道。这两个端口可以连接同一个内存,在这种时候需要特别小心,很有可能自己把自己的指令给改掉了。但是反过来思考一下,其实我们可以做什么?可以按照状况改变软件代码。NiosII中还有第三个端口,这是用来做Debug用的端口。还有其他的一些接口,比如TCM接口。我们需要知道这些接口的存在,但是不需要知道细节,只有在用到的时候再去看相关的文档就好了。

6、作为系统设计,是需要有一种粗旷型的大气魄,不需要在细节上浪费时间。你会发现很多的细节是没有意义的。并不是说我们不需要去研究细节,细节是很重要的,但是细节需要在被用到的时候才去关注就好了。

7、在使用IP的时候,会遭遇到意想不到的痛苦的。所以,尽量不要依靠假设来臆想了模块的设置。而是尽量的适应环境,来配置自己的设计。作为一个FPGA的玩家,这种依照环境来改变的能力是必须的。

8、考虑Cashes的设置,Cash 有两种,一种是用来做指令缓存的,一种是用来做数据缓存的。Cash的大小对程序的运行速度是有影响的。当然也没必要使用过多的资源。够用就好了。

9、自定义指令设置。这是最有价值的设置。所谓自定义指令,并不是一个软件宏或者函数。而是一块硬件。当CPU调用到这个指令的时候,事实上它调用的就是这个硬件模块,它被嵌入在CPU中。而这其实就是NiosII好玩的地方。

10、SOPC builder是QuartusII中用来建立,开发,维护系统的平台。虽然很多时候我们用它作为NiosII的一个嵌入式系统的开发环境,但我不要把思路只是局限在NiosII上面。它将成为一个包容全部系统内容的一个平台。

11、Avalon接口分成两种,一种是Avalon-MM接口,另一种是Avalon-ST 接口。MM接口,是通过地址来读写数据,更多的是用在控制逻辑上面。ST接口是用于点到点的流数据接口,更多的可以用在有高速通过率的模块中间。这两个接口本身并没有矛盾,不是说势不两立的,一个模块中既可以有MM接口,甚至几个MM接口,也可以同时存在ST接口。作为一个点对点的接口定义,Avalon可以做到高效的接口效果。这与PCI之类的总线接口是有本质区别的。PCI总线可以看作是铁路轨道,当一个火车在轨道上行驶的时候,就不可以有另一个火车同时使用轨道。Avalon接口更多好像高速公路,车辆可以双向行驶。

12、作为FPGA设计中比较独特的一个原则就是,这个世界不是你创造的,所以你必须去适应它,而不是顽固自己的意图。

13、在FPGA中,除了门与门之间的延迟是固定的(时钟频率)外,一切的组合电路的延迟都是不确定的。记住这样一个规律就好了,凡是没有被门关过的信号都是不稳定的,都只是暂时的。

14、在生成新的再生门(一些逻辑的结果作为时钟去驱动一个门,我们且管他叫作再生门吧)之前,你最好把这个时钟信号用原来的那种门在关一下。这样你获得的会是一个干净的,纯粹的时钟信号。

15、针对新的一些器件,器件本身可以提供一些时钟控制模块,当你需要使用门锁(gated lock)的时候,尽量的使用这些模块,会让你的时钟变得安全(clock control block)。

16、如果你不得不使用逻辑电路来锁门,而你的器件又没有特定的模块。那么最好的情况就是,你可以先用那个时钟,把你的门锁信号关一下。这样的好处就是可以把毛刺信号完全的规避在门外面,使你的时钟更加安全。

17、上电初始值
在通常的状况下,所有的门在上电的时候输出为低。但是这并不是不能改变的。你可以把上电设置为高,这样综合工具可能会做两种事情,把输出反向,或者使用preset控制(如果存在的话)把初始值放进门里。
      当时上电为高的做法,并不是非常必要,因为你其实是可以使用复位信号来获得你想要的初始状态的。如果你觉得这是必须的,那么有几种方法你可以做:
      ? 首先是在QuartusII里面你可以针对某个或者某些门设置power-up level为高或低。
      ? 在代码中使用altera_attribute
      ? 直接写代码设置初始值:
            reg q = 1'b1;
            always @ (posedge clk or posedge aclr)
            begin
                       if (aclr)
                          q <= 1'b0;
                      else
                          q <= d;
            end

18、门的次级管理信号,按照优先级排列一下:
       1. 异步清零信号 – aclr
       2. 上电复位信号, - pre
       3. 异步载入信号 – aload
       4. 使能信号 – ena
       5. 同步清零信号 – sclr
       6. 同步载入信号 – sload
       7. 数据输入信号 – data

19、在FPGA设计中,只有在输入输出上可以使用双向信号,双向信号是不能使用在内部逻辑上的。一定不要用这种信号,否则工具会综合出一个你都不知道会是什么东西的东西。针对一个双向端口,你需要把它变成一个输入信号 in,一个输出信号:out, 和一个输出使能信号: output_enable. 所以代码其实很简单:
               Assign birsignal = output_enable ? out: 1’bz;
               Assign in = birsignal
     这里有一个小小的提示,在写代码的时候突然不太清楚语法怎么写的时候,你可以在quartus里面按一下右键,你可以发现一个insert template…的选择。试试看吧。

20、状态机是设计过程中的核心部分,所以我们需要特别的提一下写状态机的一些注意事项。为了实现利益最大化,建议在FPGA中使用one hot 模式的状态机,而在CPLD中使用最少比特数的状态机。在具体的设计中需要注意的是:
?    1、把状态机写全,也就是说不要漏写了 Default:。没有这个首先会出现什么?对了,会有假门(latch)。
?    2、状态机作为控制核心部分,尽量把它和算法功能和数据分离开来。好像你看到好的流水线,控制流水线的电脑和流水线本身是分开的。这样可以保持相对的独立性。
?    3、如果一种操作设计到几个状态,尽量把操作剥离状态机本身。
?    4、使用一个简单的复位信号来定义上电状态。如果你的状态机会被比较多的复位信号复位的话,工具就不会把它当作状态机来对待。
       总之,尽量的保持状态机的很傻很单纯是很重要的。尽量的不要加重核心部分的复杂性。其实道理很简单,好比在一个公司里面,真正在工作的,其实一定不是一个这个公司的核心。

转载于:https://www.cnblogs.com/Jerome_Lee/archive/2009/11/19/1606358.html

FPGA Design's Tips相关推荐

  1. Verilog Design's Tips

    FPGA设计简易流程: 1.读要用到的芯片手册,主要看输入输出端口定义.设计约束及示例说明: 2.通过给定要求,构建设计模块的电路图及定义端口: 3.使用Verilog HDL代码实现电路: 4.使用 ...

  2. How to design an FPGA from scratch-1_FPGA_8_24

    Editor's Note: As you will soon discover, the author – Sven – has created the most fantastic on-goin ...

  3. (转)FPGA的速度等级(speed grade)

    2008-06-06 17:04 XILINX公司FPGASpartan 3E系列XC3S500E速度等级为4.但一直不知道是什么意思. 通过学习知道, (1)CPLD与FPGA的速度等级定义的区别 ...

  4. 学习篇--FPGA学习网站

    1.  OPENCORES.ORG这里提供非常多,非常好的PLD了内核,8051内核就可以在里面找到.进入后,选择project或者由 http//www.opencores.org/browse.c ...

  5. 资源整理 IC/FPGA

    核心会议和期刊(本人只做网络整理,侵删) 会议 IEEE International Solid-State Circuits Conference,简称:ISSCC,国际固态电路会议 IEEE In ...

  6. 学习FPGA绝佳网站推荐

    1.  OPENCORES.ORG这里提供非常多,非常好的PLD了内核,8051内核就可以在里面找到.进入后,选择project或者由 http//www.opencores.org/browse.c ...

  7. FPGA和外围接口-第一章 爱上FPGA(1.4 FPGA开源网站和论坛))

    FPGA开源网站和论坛 1.1.1 25个FPGA开源网站 1.OPENCORES.ORG 网站地址::http://www.opencores.org 图1‑31 OPENCORES.ORG网站截图 ...

  8. 【FPGA——工具篇】32个FPGA开源网站

    1. OPENCORES.ORG 这里提供非常多,非常好的PLD了内核,8051内核就可以在里面找到. 进入后,选择project或者由http//www.opencores.org/browse.c ...

  9. FPGA开源网站和论坛介绍

    学习FPGA,找不到资料?-FPGA开源网站和论坛介绍 碎碎思 目录 学习FPGA,找不到资料?-FPGA开源网站和论坛介绍 1.25个FPGA开源网站 1.1 http://OPENCORES.OR ...

最新文章

  1. 合工大建筑和计算机专业哪个好,合肥工业大学最好的专业是什么(10大热门专业排名)...
  2. 史上最全的SpringCloud入门学习教程
  3. 专家称 AI 可以在 120 年内接管人类的所有工作
  4. 去哪儿对垒携程 在线旅游静悄悄的革命
  5. php 微信证书,【微信支付】企业付款开发者文档
  6. Ubuntu18.04编译Android源码openssl版本过高
  7. 使用docker环境编译驱动
  8. 上海联影医疗公司软件开发工程师面试经历
  9. 基于javaweb+jsp房屋租赁系统(java+SSM+jsp+mysql+maven)
  10. 【BZOJ1491】[NOI2007]社交网络 Floyd
  11. 移动端车牌识别,交警助力
  12. 使用imageio写视频文件指定输出质量
  13. 信誉管理软件的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  14. [百家号]大英帝国的人口和面积比现在的英国大多少?
  15. SSD Trim介绍
  16. linux 查询usb端口名称,在Linux系统里识别USB设备名字的4种方法
  17. 学好SEO需要掌握哪些知识要点?
  18. R与结构方程模型(2):潜变量
  19. hmacsha256 java实现_java实现HMACSHA256(md5私钥key)加密签名
  20. 多媒体实验 Visual Studio 图像显示与处理 对图像进行二值化、求边缘、增强等处理

热门文章

  1. cmd命令【实施工程师技能】
  2. scip 练习2.18
  3. 20162318 2018-2019-2《网络对抗技术》Exp1 PC平台逆向破解
  4. Leetcode 回文数字判断
  5. Golang源码探索(三) GC的实现原理
  6. Vue学习笔记进阶篇——Render函数
  7. 数学 希腊字母 Greek Alphabet
  8. ajax 填充,自动填充ajax请求
  9. callback回调使用 vue_前端动画必知必会:React 和 Vue 都在用的 FLIP 思想实战
  10. C语言入门题-7-1 最大和最小 (10分)