FPGA逻辑设计.ppt_第1页
FPGA逻辑设计.ppt_第2页
FPGA逻辑设计.ppt_第3页
FPGA逻辑设计.ppt_第4页
FPGA逻辑设计.ppt_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

FPGA逻辑设计 逻辑设计是一种并行的思想 不同于软件设计 同一时刻 有多个语句块同时执行 逻辑设计者要明白写的代码将会综合成什么电路 逻辑设计分时序设计与算法设计两部分 Action 主要内容 设计命名 主要内容 设计技巧 信号与变量 信号的缩写模块设计过程中 为了避免各信号命名冗余过长 对信号采取简写方式命名 示例 reset n简写为rst n clock 20m简写为clk 20m write enable简写为wr en 常用的信号简写如表 常用信号缩写 系统级信号 系统级信号系统级信号指复位信号 置位信号 时钟信号等需要输送到各个模块的全局信号 系统信号以前缀 sys 开头 示例 sys rst 系统复位信号sys clk 系统时钟sys set 系统置位信号 低电平信号是指低电平有效的信号 加后缀 n 示例 rst n 代表低电平复位有效 en n 代表低电平使能有效 锁存器锁存信号组合逻辑信号经过锁存器锁存后的信号 加后缀 r 与锁存前的信号相区分 示例 wr en经锁存后 命名为 wr en r 多拍信号为了考虑数据对齐或者同步 需要对信号进行多级锁存延时 经多级锁存的信号可加后缀dx x 0 1 2 3 示例 mii rx en延时三拍的信号 分别命名为 mii rx en d0 mii rx en d1 mii rx en d2 时钟信号为了体现时钟的频率 相位 对时钟信号除了加前缀clk外 还要加表标示时钟频率及时钟相位的后缀 示例 相位为90度的125MHz时钟 命名为clk 125m 90 对相位为0度的时钟 可不加相位指示 跨时钟域的同步信号当一个信号在一个时钟域生成 进入另一时钟域时 需要对该信号进行同步 同步的信号可加syn前缀 必要时加同步前的时钟做为后缀 以表示该信号来自哪个时钟域 示例 read ip由50MHz的时钟生成 进入100MHz时钟域时 经同步后 命名为syn read ip 或者命名为syn read ip 50m 模块说明格式 模块说明格式为了便于后期的维护 对每个模块需要进行详细的说明 可采用如下格式 ZTENetView Project ETNMS Module frame top v Description thetopmoduleofFramer CreatedDate 2009 05 25 Author CamelKing zhou xuebing Department Power Chain Platform QuartusII9 1 Simulators Modelsim6 4a Synthesizers Revisions RevisionNumber Version Date Modifier name Description 语句块的对齐同一个层次的所有语句左端对齐 Initial always等语句块的begin end关键词起到承上启下的作用 可对always initial语句左端对齐 if elseif else中的begin可跟在语句块后面 end新起一行 这样做的好处是避免因begin独占一行而造成行数太多 always posedgesys clkornegegesys rst n beginif sys rst n data out 4 b0000 elseif ld en data out data in elsedata out data out 1 b1 end 空格的使用 一 不同变量 以及变量与符号 变量与括号之间都应当保留一个空格 例如 x a b 1 b1 1 b0 Verilog关键字与其它任何字符串之间都应当保留一个空格 例如 always 使用大括号和小括号时 前括号的后边和后括号的前边应当留有一个空格 逻辑运算符 算术运算符 比较运算符等运算符的两侧各留一个空格 与变量分隔开来 单操作数运算符例外 直接位于操作数前 不使用空格 assignSramAddrBus AddrBus 31 24 AddrBus 7 0 assignDivCntr 3 0 DivCntr 3 0 4 b0001 assignResult Operand 语句块的缩进不同层次之间的语句使用Tab键进行缩进 每加深一层缩进一个Tab 建议一个Tab四个字符 语句块的注释在endmodule endtask endcase等标记一个代码块结束的关键词后面要加上一行注释说明这个代码块的名称 大小写对所有的信号名 变量名和端口名都用小写 这样做是为了和业界的习惯保持一致 对常量名和用户定义的类型用大写 模块例化在例化模块时 最好采用名字相关的显式映射而不要采用位置相关的隐式映射 提高代码的可读性和方便debug连线错误 示例 mux4uut a a b b c c d d sel sel y y TB文件命名 测试向量文件为了与模块文件区分 测试文件要加后缀tb 比如 e1 framer的测试文件可命名为 e1 framer tb 逻辑设计命名逻辑设计技巧 逻辑设计技巧 阻塞与非阻塞赋值 区别 非阻塞赋值 语句右端表达式计算完后并不立即赋值给左端 而是同时启动下一条语句继续执行 可以理解为所有的右端表达式RHS1 RHS2等在进程开始时同时计算 计算完后 等进程结束时同时分别赋给左端变量LHS1 LHS2等 阻塞赋值 语句在每个右端表达式计算完后立即赋给左端变量 即赋值语句LHS1 RHS1执行完后LHS1是立即更新的 同时只有LHS1 RHS1执行完后才可执行语句LHS2 RHS2 依次类推 前一条语句的执行结果直接影响到后面语句的执行结果 阻塞与非阻塞赋值 使用建议 1 时序逻辑建模时 使用 非阻塞赋值 2 为锁存器 latch 建模 使用 非阻塞赋值 3 用always块为组合逻辑建模 使用 阻塞赋值 4 当在同一个always块里面既为组合逻辑又为时序逻辑建模 使用 非阻塞赋值 建议不要有这样的语句5 不要在同一个always块混合使用 阻塞赋值 和 非阻塞赋值 编译时通不过 6 不要在两个或两个以上always块里面对同一个变量进行赋值 编译时通不过 信号延时信号的延时 强烈建议不要采用门电路延时来实现 不同工艺 不同厂家的器件门延时不一样 建议采用计数器或者移位寄存器来实现 Altera LCELL 避免子模块内部三态 内部双向IO避免在子模块内部使用三态电路 否则会增加其功耗 要把三态信号及使能信号引到顶层做三态门处理 避免子模块内部双向IO避免子模块内部采用双向IO 最好把把双向IO分开为输入 输出口处理比较好 If与case语句1 if语句if elseif else语句是有优先级的 第一个if的优先级最高 最后一个else的优先级最低 2 case语句case语句是 平行 的结构 所有的case的条件和执行都没有 优先级 但casex casez例处 3 建议a 能用case语句的地方最好采用case语句 避免消耗更多的逻辑资源 b if语句中 一定要有else语句 否则在组合逻辑设计中容易综合成锁存器 latch c case语句中 一定要有default项 否则组合设计中 容易综合成锁存器 信号敏感表在verilog 97版本中 always 的敏感表一定要完善 否则逻辑综合后 达不到预期的效果 但在verilog 2001版本中 此问题可不予考虑 因为采用always 描述方式 软件会自动增加敏感信号 因此建议采用verilog 2001版本描述逻辑 状态编码 码型实例 状态机的一般设计原则 binary gray code编码使用最少的触发器 较多的组合逻辑 而one hot编码反之 CPLD多使用gray code FPGA多使用one hot编码 小型设计使用gray和binary编码更有效 而大型状态机使用ONE HOT更有效 在实际应用中 没有必要一定把某些状态编码强行综合为one hot方式 软件会根据状态数量自动综合为最佳方式 基本逻辑块xilinx的最小逻辑单元是slice 一个slice包含2个FF和2个LUT 4个slice组成一个CLB altera的最小逻辑单元是LE 一个LE包含1个FF和1个LUT 16个LE组成一个LAB 时钟的使用 时钟分布 1 为时钟信号选用全局时钟缓冲器 BUFG 不选用全局时钟缓冲器的时钟将会引入偏差 2 只用一个时钟沿来寄存数据 使用时钟的两个沿不可靠 因为时钟的某沿或者两个沿会 偏移 如果只使用时钟的一个沿 就会降低时钟边沿偏移的风险 可以使用CLKDLL自动纠正时钟的占空比以达到50 的占空比 否则 强烈建议只使用一个时钟沿 时钟如何上全局时钟网 FPGA器件中有专门的快速时钟走线 叫全局时钟网 上了全局时钟网的时钟可称为全局时钟 在全局网上传输的时钟抖动 jitter 与偏斜 skew 最小 altera器件 1 由FPGA时钟引脚引入的外部时钟 会自动上全局时钟网 2 FPGA内部时钟或者其它时钟 可通过PLL DPLL上全局时钟网 或者通过global原语约束上全局时钟网 3 global原语globalinstance name in out 4 或者通过assignmentseditor中添加全局时钟约束 时钟如何上全局时钟网 XILINX 1 从FPGA时钟引脚引入的时钟 可通过设置上全局时钟网 2 也可以通过BUFG IBUFG BUFGDS DCM上全局时钟 草图 门控时钟 gateclock 在FPGA内部 内部产生的时钟叫门控时钟 在高速数据设计中 门控时钟不能做为DFF FF的时钟输入 因为门控时钟的jitter与skew都比较大 会造成数据误采样 实际应用中 可以把门控时钟做为时钟使能的方式引入DFF FF的使能脚 并采用源时钟做为DFF FF的输入时钟 草图 行波时钟 rippleclock 由一个触发器的输出做为下一个触发器的时钟输入 数字电路课程中学过的异步计数器就是行波时钟的方式 行波时钟的偏斜最大 每经过一级FF 抖动与偏斜越大 实际中最好不采用 信号初始化为考虑代码的可移植性 可维护性 尽量不要使用信号的默认值 或初始值 要用复位来初始化信号 当然 altera的某些器件本身支持上电初始化值 具体可用initial定义 但xilinx不支持 这就是完全OK的代码完全移植到不同芯片时 工作不稳定的原因 驱动能力有些厂家的器件驱动能力有限 过多的负载可能导致逻辑工作不正常 a FPGA虽然提供内部上下拉机制 但电阻值有限 几十欧姆到几千欧姆 采用内部上拉时 引脚驱动能力可能有限 建议使用外部上下拉 b 内部信号的驱动能力 不同厂家各不同 在逻辑设计中 采用冗余方式编写代码 比如altera的一些低端器件可能存在此问题 xilinx不存在此问题 软件综合时 如果超过一定的扇出数 会进行逻辑复制 增加信号的驱动能力 草图 同步复位 异步复位 同步复位 同步复位就是指复位信号只有在时钟上升沿到来时 才能有效 否则 无法完成对系统的复位工作 always posedgeclk beginif rst y 0 elsey d end 同步复位 异步复位 异步复位 指无论时钟沿是否到来 只要复位信号有效 就对系统进行复位 always posedgeclkorposedgerst beginif rst y 0 elsey d end 同步复位优缺点 优 可以使所设计的系统成为100 的同步时序电路 这便大大有利于时序分析 而且综合出来的fmax一般较高 因只有在时钟有效电平到来时才有效 可达到滤除毛刺的目的 缺 复位信号的有效时长必须大于一个或多个时钟周期 才能真正被系统识别并完成复位任务 布局布线时还要考虑诸如 clkskew 组合逻辑路径延时 复位延时等因素 否则更可能出现复位异外 讲述下PLL DCM的同步复位不好之处 一般FPGA器件结构中DFF都只有异步复位端口 所以 如果采用同步复位 综合器会在DFF的复位端口前插入组合逻辑 这样会耗费更多逻辑资源 异步复位优缺点 优 大多FPGA器件中DFF都有异步复位端口 因此采用异步复位可以节省逻辑资源 异步复位信号识别方便 可以很方便使用FPGA的全局复位端口GSR 缺 在复位信号释放 release 的时候容易出现问题 倘若复位释放时恰恰在时钟有效沿附近 就很容易使寄存器输出出现亚稳态 复位信号容易受到毛刺影响 异步复位 同步释放因异步复位容易受毛刺影响 采用 异步复位 同步释放 的方式 可以避免此问题 给出实例 moduleReset Synchronizer outputregrst n inputclk inputasyncrst n regrff1 always posedgeclk negedgeasyncrst n beginif asyncrst n rst n rff1 2 b0 else rst n rff1 rff1 1 b1 end 毛刺 glitch 由于FPGA内部存在线延时 门延时等因素 同时受电压 温度等的影响 信号的高低电平转换需要一定的过渡时间 因此在信号变化的瞬间 组合逻辑的输出会有先后顺序 出现规则不一的脉冲 这种脉冲称 毛刺 毛刺的影响 如果将带有 毛刺 的信号引入触发器的清零端 置位端 可能因 毛刺 导致触发器误跳转 影响整个逻辑的正常工作 如何消除 1 毛刺 电平很窄 当不满足DFF的建议保持时间时 可通过DFF来实现对毛刺的消除 2 计数器采用gray码计数 gray码每次只变化一位 在实际的逻辑中 特别是高速设计中 对于任何组合逻辑产生的控制信号 使能 清零 单脉冲等 建议后面加一级DFF来消除 毛刺 竞争 与 冒险 关于竞争冒险 有多种不同的定义 但大致的理解如下 竞争 由于FPGA内部的各种不同的延时 导致信号到达门输入口的先后时间不同 冒险 由竞争引起门输出错误的瞬间叫冒险 主要表现为门输出有异常的脉冲出现 这种脉冲叫毛刺 静态冒险与动态冒险静态冒险 输入信号变化前后 输出的稳态值是一样的 但在输入信号变化时 输出信号产生毛刺的现象 若输出的稳态值为0 出现了正的尖脉冲毛刺 称为静态0险象 若输出稳态值为1 出现了负的尖脉冲毛刺 则称为静态1冒险 动态冒险 输入信号变化前后 输出的稳态值不同 并在边沿处出现了毛刺的现象 亚稳态 FPGA中的触发器FF 数据信号的过渡都要满足建立与保持时钟 如果在不满足建立与保持时间情况下 对数据进行采样 就会导致采样失误 采样结果意外 这种现象叫亚稳态 经过不同的时钟域的信号 由于时钟频率相位的不同 很容易出现 亚稳态 建立与保持时间 草图 时钟沿到来前 数据必须保持的时间叫建立时间 setuptime 时钟沿过后 数据必须保持的时间叫保持时间 holdtime 跨时钟域信号处理 草图 在越来越复杂的大型FPGA逻辑设计中 时钟不再是单一的时钟 而是有多个时钟并存 多个时钟可能频率不同 初始相位也不同 不同的时钟所驱动的不同逻辑块 可称做时钟域 跨时钟域信号的影响 当一个信号从一个时钟穿越到另一个时钟域是 由于时钟频率 相位的不同 会造成建立保持时间的不足 由此造成采样时 亚稳态 出现 电路不能正常工作 如果处理跨时钟域的信号或数据 1 对于慢时钟到快时钟的跨时钟域的信号 我们可以采用两个或者多个DFF级联的方式来实现单一信号的同步 描述 2 但对于快时钟到慢时钟的信号 由于快时钟产生的信号可能会引起慢时钟的采样失效 造成数据漏掉 因此要把快时钟的信号要扩展 以达到慢时钟的采样周期 实现应用中 有两种方式可实现快时钟到慢时钟信号的过渡 a 扩展快时钟域的信号宽度 满足慢时钟的采样要求 确保采样时钟能正确采样 b 采样结绳法 应用高速设计中 3 对于跨时钟域的大流量数据 可以采用DPRAM asynFIFO来实现有效的时钟隔离及数据通讯 细讲一下 逻辑复制 logicreplicate 考虑到逻辑门的扇出最大能力 在某些时候 需要对逻辑功能块通行复制 以此来提高对后级电路的驱动能力 使电路工作更可靠 草图 在实际应用中 如果有使能到逻辑复制 可以采取两种方式避免逻辑复制部分被优化掉 1 对需要保留逻辑复制的信号或模块 采用HDL约束方式 preserve preserve module 2 关闭replicate逻辑优化选项 逻辑重定时 logicretiming 时序设计中 FF与FF之间的组合逻辑 可能因大小不同 造成FF级联之间的延时分配不同 为使组合逻辑延时平衡 可采用retiming的技术来实现 草图 实现应用中 不用人为的去考虑此项 一般可通过软件设置来要不要retiming技术 xilinx的ISE软件中retiming分前向retiming与后面retiming 模块输入输出寄存复杂的逻辑设计中 常对每个功能模块的输入输出都用FF打一拍 可以防止模块与模块之间的路径成为关键路径 criticalpath 方便优化 在层次打平或者保留时 模块与模块之间的路径就是FF与FF之间路径 接口信号可保留下来 方便调试 FF FF D D Q Q M1 M2 fullcase parallecase1 fullcase 是指编码下的各种可能的条件项 包括default 都有对应的输出 没有任何遗漏项 2 parallecase 是指编码下的各种可能的条件项与输出项是一一对应关系 不存在多个条件项对应一个输出的情况 如果出现此情况 代码很可能会被综合成具有优先级的电路 可通过软件设置使用fullcase parallecase 也可以在HDL语言中加 parallel case fullcase 来约束 状态机 类型 a MooreMachine 状态输出只与当前的状态有关 与输入无关 b MealyMachine 状态输出不仅与当前的状态有关 而且与输入有关 在实际应用中 Mealy状态机用得比较多 一段式状态机 一段式状态机把所有状态跳转 状态输入 状态

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论