《深入浅出玩转FPGA》笔记

关于这本书,算是囫囵吞枣地读完了。网上很多人推荐这本书,评价很不错。以我的观点来看,确实是本不错的关于FPGA方面的书,作者确实经验丰富,书中有很多值得学习的东西,但是可能不是很适合初学者看,比较适合有一定项目经验的人读。因为这本书本身就是将作者许多自己的亲身经历总结出来的经验编纂出来的,可能作者也是看烦了市面上一众读物都秉持着介绍某类知识一定要事无巨细地从头说到尾的风格,所以作者对基础的介绍非常少。初学者学习FPGA的开发和调试去看作者另一本《FPGA/CPLD边练边学--快速入门Verilog/VHDL》比较好。

说到底,我作为菜鸟,这本书很多内容我也还是一知半懂,可能还需要更多的积累。在这里记录一下这本书给我的新收获。

一、关于时钟的设计要点:

(1)避免使用门控时钟或系统内部逻辑产生的时钟,多用使能时钟去替代。

门控时钟指的是在数据无效时,将寄存器时钟关闭的技术,能够有效降低功耗,是低功耗设计的重要方法之一。组合逻辑中多用门控时钟,一般驱动门控时钟的逻辑都是只包含一个与门(或门)。如果有其它的附加逻辑,容易因竞争产生不希望的毛刺。

(2)对于需要分频或倍频的时钟,用器件内部的专用时钟管理(如PLL或DLL)单元去生成。

我的理解是FPGA内部逻辑资源宝贵,用来做时钟管理太浪费,而且有专用的干嘛不用呢。

(3)尽量对输入的异步信号用时钟进行锁存。

所谓异步信号,是指两个处于不同时钟频率或相位控制下的信号。这样的信号在相互接口的时候如果没有可靠的同步机制,则存在很大的隐患,甚至极有可能导致数据的误采集。所以需要学习一些异步信号的同步机制。

(4)避免使用异步信号进行复位或置位控制。

这一点很显然,异步信号会增加毛刺出现的可能性。

 

二、提升系统性能的代码风格

(1)减少关键路径的逻辑等级

很多时候时序不达要求是因为有几条关键路径内部逻辑门延时太长,可以通过修改代码减少某些路径的层级,但通常会导致其他路径多出一个或几个逻辑门,“面积换速度”。

(2)逻辑复制(减少重载信号的散出)与资源共享

如果某个信号扇出比较大,插入buffer可以解决,但是会增加延时。通过逻辑复制,即复制产生这个信号的逻辑来驱动后续电路,既使平均扇出降低又不增加延时,但面积会增大。

资源共享是逻辑复制的逆过程,可以节省面积,但以牺牲速度为代价。

(3)消除组合逻辑的毛刺

引入时序逻辑,即添加寄存器来锁存输出结果,在时钟有效沿再输出。

 

三、异步复位、同步释放

异步复位不稳定,同步复位消耗额外资源。这种异步复位、同步释放的双缓冲电路根本思想是将异步信号同步化。

《深入浅出玩转FPGA》笔记_第1张图片

综合后的电路:

《深入浅出玩转FPGA》笔记_第2张图片

四、乒乓操作及串并转换设计

FPGA设计的重要思想有:面积换速度、乒乓操作及串并转换设计、流水线设计、逻辑复制和模块复用、模块化设计等。

乒乓操作:一种数据流控制的处理技巧。

《深入浅出玩转FPGA》笔记_第3张图片

第一个周期,数据进入缓冲区1;第二个周期,数据进入缓冲区2,同时输出数据选择控制将缓冲区1内的数据送出去;第三个周期,数据进入缓冲区1,缓冲区2内的数据被送出。如此循环,可以实现数据的无缝缓冲和处理。

串并转换:高速数据流处理的重要技巧之一。

《深入浅出玩转FPGA》笔记_第4张图片

串行输入的数据通过FPGA内部的n个移位寄存器后,最后并行输出的是一个n位宽的并行总线数据。

 

五、同步设计的好处:

  1. 有效避免异步信号通信产生的冲突;
  2. 便于时序约束、时序分析及时序仿真;
  3. 便于板级时序问题定位;
  4. 有利于同器件间的代码移植,减少重复设计;
  5. 最小化器件升级对同一工程带来的影响。

目前经验尚浅,很多体会不是很深。

 

六、专用握手信号

握手通信原理,即通信双方使用了专用控制信号进行状态指示,是一种常用的跨时钟域信号处理方式。

《深入浅出玩转FPGA》笔记_第5张图片

使用握手协议方式处理跨时钟域数据传输时,只需要双方的握手信号(req和ack)分别使用脉冲检测法进行同步。具体实现:发送域先将数据放入总线,然后发送req有效信号给接收域;接收域收到req有效信号后锁存数据总线,然后回送ack有效信号给发送域;发送域接收到ack有效信号后撤销当前req信号,接受域再检测到req信号撤销后也撤销ack信号,此时完成一次正常握手通信。

 

七、关于变量的定义

在编写testbench时,关于变量的定义一个常犯的错误就是将一个定义好的全局变量应用到了两个不同的always块中(如EX1C),由于两个always独立并行工作,会产生意想不到的后果。

《深入浅出玩转FPGA》笔记_第6张图片

解决方法是可以在begin...end之间定义always的块名,这样两个always块中的变量i就互不相关了。

《深入浅出玩转FPGA》笔记_第7张图片

八、HDL的三个最基本思想

连通性(Connectivity)、时间性(Time)和并行性(Concurrency)。

 

九、Testbench书写技巧

  1. 封装有用的子程序;
  2. 结构化Testbench;
  3. 防止对同一个寄存器同时进行读写操作;(使用非阻塞语句可以解决)
  4. 防止同时调用task。(可以在task中引入检错机制,检查task当前是否被调用)

《深入浅出玩转FPGA》笔记_第8张图片

十、建立时间、保持时间

《深入浅出玩转FPGA》笔记_第9张图片

《深入浅出玩转FPGA》笔记_第10张图片

建立时间满足:

 即 

保持时间满足:

时钟满足:  由此可以计算FPGA的最大频率,系统时序优化主要是对传输路径延时  做文章。

 

十一、逻辑仲裁设计要点

  1. 复位状态;
  2. 切换时序;当前状态执行完可以通过仲裁直接进入另一状态或者维持现有状态,不必一定要返回中间状态。
  3. 轮流响应;防止某一状态长期霸占总线。
  4. 超时退出。

十二、FPGA+CPU

  • 潜在优势:
  • 更易于满足大多数系统的功能性要求;
  • 潜在的改善了系统的性能;
  • 在某些应用中的灵活性和可升级性大大提高;
  • 处理器连接到外设的接口能够得到优化;
  • 软硬件互联的接口性能获得极大的提升;
  • 有利于设计的重用和新设计的快速成型;
  • 简单化芯片甚至整板的PCB布局布线。

 

其实这本书我还有很多地方没看明白,应该需要多看几遍。

参考文献:

《深入浅出玩转FPGA》第三版,吴厚航编著

你可能感兴趣的:(Xilinx,SoC学习之路)