第8章FPGA设计技巧与设计经验介绍
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第1节基本设计技巧
乒乓操作
1 操作过程
2 从外部看,数据流没有停顿的进出
3 用低速模块处理高速数据流
4 实际上,用两个缓冲模块实现了串并转换,两个预处理模块并行,面积换速度;串并转换
串并转换
1 FPGA设计的一个重要技巧
2 数据流处理的常用手段
3 面积与速度互换思想的直接体现
串并转换的实现方法多种多样,根据数据的排序和数量的要求,可以选用:
1 寄存器:小设计
2 RAM:数据量比较大的情况
3 状态机:复杂的串并转换
流水线操作
1 流水线处理是高速设计中的一个常用设计手段
2 如果某个设计的处理流程分为若干步骤,而且整个数据处理是“单流向”的,即没有反馈或
者迭代运算,前一个步骤的输出是下一个步骤的输入,则可以考虑采用流水线设计方法提高系统的工作频率。
3 将适当划分的n个操作步骤单向串连起来
4 数据流在流水线各个部分的处理,从时间上看是连续的
5 数据流依次流经n个模块,完成每个步骤的操作
6 流水线设计时,时序要进行合理安排,每个操作步骤的划分要合理,仔细考虑各个步骤间的数据流量
7 如果前级操作时间恰好等于后级的操作时间,设计最为简单,前级直接输出到后级的输入即可
8 如果前级操作时间大于后级的操作时间,则后级会经常空闲。可以对前级的输出数据适当缓存,再输出到后级的输入端如果前级操作时间小于后级的操作时间,则必须通过复制逻辑,将数据流分流和并行预处理,或者在前级对数据采用存储、后处理方式,否则会造成后级数据溢出
数据接口的同步
1 两种易出问题的设计习惯
--手工加入非门调整数据延迟,从而保证本级时钟对上级数据的建立、保持时间的要求
--为了有稳定的采样,时而用正沿打一下数据,时而用负沿打一下数据,以调整数据的采样位置
2 问题
--一旦芯片更新换代,或者移植到其它器件系列的芯片上,采样实现必须重新设计
--这两种做法造成电路实现的时序余量不够,一旦外界条件变换(比如温度升高),采样时序就有可能紊乱,造成电路不能完成预定的功能
3 如果输入数据的节拍和本系统处理时钟同频,可以直接用本系统的主时钟对输入数据寄存器采样,完成输入数据的同步化如果输入数据的节拍和本系统处理时钟同频,可以直接用本系统的主时钟对输入数据寄存器采样,完成输入数据的同步化
4 为了避免异步时钟域产生错误的采样数据,一般使用RAM、FIFO缓存的方法完成异步时钟域的数据转换。在输入端口使用上级时钟写数据,在输出端口使用本级时钟读数据,就非
第2节FPGA设计思考
硬件描述语言的层次含义
HDL是目前数字ASIC、FPGA、CPLD等最重要的一种设计输入方式:
1 利于自顶向下的设计
2 利于模块划分与复用
3 可移植性好、通用性好
4 与工艺无关等常用的概念层次系统级功能模块级行为级寄存器转移级门级
Coding Style
1 使用高层次HDL进行硬件设计,所带来的问题是设计者的设计思考与实际电路结构是脱节的;
2 实际设计中,由于每个设计者对语言规则、电路行为的理解不同,编程风格不同,往往对同样的系统功能,描述的方式是不一样的。所综合出来的电路结构更是大相迳庭; 即使最后综合出来的电路都能实现相同的逻辑功能,其复杂程度和延时特性都会有较大差别; 与设计层次有关;
3 与综合工具相关;
--挥综合工具的最大潜能
--不同综合工具对一些语法细节的解释略有不同。
4 与器件的硬件结构相关
--充分、合理的使用硬件资源
分层次的模块化设计
1 结构层次化编码是模块化设计思想的一种体现。目前大型设计中必须采用结构层次化编码风格,以提高代码的可读性,易于模块划分,易于分工协作,易于设计仿真测试激励;
2 最基本的结构化层次由一个顶层模块和若干个子模块构成,每个子模块根据需要还可以包含自己的子模块。
3 结构的层次不宜太深;
4 顶层模块仅包含对所有模块的组织和调用;
5 所有I/O信号的描述在顶层模块完成;
6 子模块之间可以有接口;不要建立子模块之间跨层次的接口;
7 子模块的合理划分很重要,应该综合考虑子模块的功能、结构、时序、复杂度等多方面因素。
模块划分的技巧
1 结构层次化设计方法的第一个要点就是模块划分,模块划分非常重要,关系到能否最大程度上发挥项目成员协同设计的能力,更重要的是它直接决定着设计的综合、实现的耗时与效率。
2 模块划分的基本原则如下:
--对每个同步时序设计的子模块的输出使用寄存器,有利于综合工具对逻辑进行优化;
--关的逻辑或可以复用的逻辑划分在同一模块内;
--将不同优化目标的逻辑分开;
--将松约束的逻辑归到同一模块;
--将存储逻辑独立划分成模块;
--合适的模块规模。
尽量避免使用锁存器
1 寄存器:时钟沿敏感,利用时钟沿确定数据传输到输出的时刻;
2 锁存器:电平敏感,只要时钟是高电平(或低电平),就允许数据从输入传输到输出。
3 锁存器会造成设计和时序验证中的各种困难。
--锁存器对输入数据的毛刺非常敏感,会将其传送到输出
--软件无法确定使用锁存器的设计人员的设计意图;
--其他设计者不容易进行设计移植和代码重用。
4 FPGA拥有大量的寄存器,基于锁存器的设计比基于寄存器的设计要占用更多的逻辑资源,性能降低。
5 如果坚持用锁存器设计必须保证输入信号绝对没有毛刺,且满足保持时间。
6 同步时序设计应该尽量避免使用锁存器Latch;
7 综合出锁存器的主要原因:
--不完全的条件判断语句;
--设计中有组合逻辑的反馈环路等异步逻辑。