关于这本书,算是囫囵吞枣地读完了。网上很多人推荐这本书,评价很不错。以我的观点来看,确实是本不错的关于FPGA方面的书,作者确实经验丰富,书中有很多值得学习的东西,但是可能不是很适合初学者看,比较适合有一定项目经验的人读。因为这本书本身就是将作者许多自己的亲身经历总结出来的经验编纂出来的,可能作者也是看烦了市面上一众读物都秉持着介绍某类知识一定要事无巨细地从头说到尾的风格,所以作者对基础的介绍非常少。初学者学习FPGA的开发和调试去看作者另一本《FPGA/CPLD边练边学--快速入门Verilog/VHDL》比较好。
说到底,我作为菜鸟,这本书很多内容我也还是一知半懂,可能还需要更多的积累。在这里记录一下这本书给我的新收获。
(1)避免使用门控时钟或系统内部逻辑产生的时钟,多用使能时钟去替代。
门控时钟指的是在数据无效时,将寄存器时钟关闭的技术,能够有效降低功耗,是低功耗设计的重要方法之一。组合逻辑中多用门控时钟,一般驱动门控时钟的逻辑都是只包含一个与门(或门)。如果有其它的附加逻辑,容易因竞争产生不希望的毛刺。
(2)对于需要分频或倍频的时钟,用器件内部的专用时钟管理(如PLL或DLL)单元去生成。
我的理解是FPGA内部逻辑资源宝贵,用来做时钟管理太浪费,而且有专用的干嘛不用呢。
(3)尽量对输入的异步信号用时钟进行锁存。
所谓异步信号,是指两个处于不同时钟频率或相位控制下的信号。这样的信号在相互接口的时候如果没有可靠的同步机制,则存在很大的隐患,甚至极有可能导致数据的误采集。所以需要学习一些异步信号的同步机制。
(4)避免使用异步信号进行复位或置位控制。
这一点很显然,异步信号会增加毛刺出现的可能性。
(1)减少关键路径的逻辑等级
很多时候时序不达要求是因为有几条关键路径内部逻辑门延时太长,可以通过修改代码减少某些路径的层级,但通常会导致其他路径多出一个或几个逻辑门,“面积换速度”。
(2)逻辑复制(减少重载信号的散出)与资源共享
如果某个信号扇出比较大,插入buffer可以解决,但是会增加延时。通过逻辑复制,即复制产生这个信号的逻辑来驱动后续电路,既使平均扇出降低又不增加延时,但面积会增大。
资源共享是逻辑复制的逆过程,可以节省面积,但以牺牲速度为代价。
(3)消除组合逻辑的毛刺
引入时序逻辑,即添加寄存器来锁存输出结果,在时钟有效沿再输出。
异步复位不稳定,同步复位消耗额外资源。这种异步复位、同步释放的双缓冲电路根本思想是将异步信号同步化。
综合后的电路:
FPGA设计的重要思想有:面积换速度、乒乓操作及串并转换设计、流水线设计、逻辑复制和模块复用、模块化设计等。
乒乓操作:一种数据流控制的处理技巧。
第一个周期,数据进入缓冲区1;第二个周期,数据进入缓冲区2,同时输出数据选择控制将缓冲区1内的数据送出去;第三个周期,数据进入缓冲区1,缓冲区2内的数据被送出。如此循环,可以实现数据的无缝缓冲和处理。
串并转换:高速数据流处理的重要技巧之一。
串行输入的数据通过FPGA内部的n个移位寄存器后,最后并行输出的是一个n位宽的并行总线数据。
目前经验尚浅,很多体会不是很深。
握手通信原理,即通信双方使用了专用控制信号进行状态指示,是一种常用的跨时钟域信号处理方式。
使用握手协议方式处理跨时钟域数据传输时,只需要双方的握手信号(req和ack)分别使用脉冲检测法进行同步。具体实现:发送域先将数据放入总线,然后发送req有效信号给接收域;接收域收到req有效信号后锁存数据总线,然后回送ack有效信号给发送域;发送域接收到ack有效信号后撤销当前req信号,接受域再检测到req信号撤销后也撤销ack信号,此时完成一次正常握手通信。
在编写testbench时,关于变量的定义一个常犯的错误就是将一个定义好的全局变量应用到了两个不同的always块中(如EX1C),由于两个always独立并行工作,会产生意想不到的后果。
解决方法是可以在begin...end之间定义always的块名,这样两个always块中的变量i就互不相关了。
连通性(Connectivity)、时间性(Time)和并行性(Concurrency)。
建立时间满足:
即
保持时间满足:
时钟满足: 由此可以计算FPGA的最大频率,系统时序优化主要是对传输路径延时 做文章。
其实这本书我还有很多地方没看明白,应该需要多看几遍。
参考文献:
《深入浅出玩转FPGA》第三版,吴厚航编著