首页 VHDL数字电路设计指导请

VHDL数字电路设计指导请

举报
开通vip

VHDL数字电路设计指导请 目 录 375.4高效利用CLB或IOB资源 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355.3桶形移位器 Barrel Shifter 的两种实现方式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335.2.4三种编码方式的VHDL实例 . . . . . . . . . . . ....

VHDL数字电路设计指导请
目 录 375.4高效利用CLB或IOB资源 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355.3桶形移位器 Barrel Shifter 的两种实现方式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335.2.4三种编码方式的VHDL实例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325.2.3状态机的容错性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315.2.2 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 技巧 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315.2.1状态机编码 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315.2状态机编码及设计技巧 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305.1Xilinx器件结构特点 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305与 工艺 钢结构制作工艺流程车尿素生产工艺流程自动玻璃钢生产工艺2工艺纪律检查制度q345焊接工艺规程 结构相关的设计技巧 以Xilinx为例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284.8复制电路 减少扇出 fanout 提高设计速度 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284.7利用电路的等价性 巧妙地 分配 延时 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264.6组合逻辑和时序逻辑分离 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254.5流水线 Pipelining . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244.4.4综合工具与资源共享 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244.4.3子 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 达式共享 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234.4.2loop语句 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224.4.1if语句 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224.4资源共享 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214.3减少关键路径的逻辑级数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184.2IF语句和Case语句 速度与面积的关系 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184.1.3改变操作数的位宽 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174.1.2使用圆括号处理多个加法器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164.1.1串行进位与超前进位 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164.1合理选择加法电路 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164设计技巧 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143.10时钟电路设计 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133.9异步复位电路设计 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123.8三态电路设计 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123.7合理使用内部RAM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93.6错误地使用变量或信号 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93.5同一个信号在两个或两个以上的process中赋值 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83.4产生不必要的Latch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73.3错误使用inout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73.2采用std_logic以外的信号类型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73.1.2采用时间相关语句 仿真语句 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73.1.1信号或变量赋初值 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73.1不可综合的代码 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73常见问题 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62.2代码模块划分 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52.1代码编写风格 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52VHDL代码风格 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51前言 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 秘密 请输入文档编号VHDL数字电路设计指导 2001-09-15 版权所有 侵权必究 第3页 共50页 505.4.9元件的引用 CoreGen/LogiBLOX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 495.4.8实现边界扫描 JTAG 1149.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 495.4.7专用I/O译码器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 485.4.6存储器的实现 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 475.4.5用三态Buffer实现多路选择器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465.4.4专用全局Set/Reset资源 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 445.4.3全局时钟Buffer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 405.4.2充分利用IOB资源 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375.4.1组合逻辑合理划分 四输入特点 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 秘密 请输入文档编号VHDL数字电路设计指导 2001-09-15 版权所有 侵权必究 第4页 共50页 VHDL数字电路设计指导 关键词 VHDL 设计重用 摘要 缩略语清单 VHDL Very High speed IC Hardware Description Language FSM Finite Status Machine DFT Design For Test 中研基础部周志坚等同步电路设计 方法 快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载 及规则 硬件开发园地 中 研基础部 苏文彪 喻志清 周志坚 VHDL代码书写规 范 查阅地点或渠道发布日期编号作者名称 参考资料清单 1 前言 目前 关于VHDL语言方面的书籍多如牛毛 但这些书籍绝大对数是为了讲语言而讲语言 缺 乏针对性 尤其缺乏如何正确使用VHDL语言或VHDL使用注意事项等有关设计技巧方面的文章 本文就是出于这个目的而作 因此 我们要求读者再看这篇文章之前 必须有一定VHDL语言 基础 2 VHDL代码风格 一个好的设计 不仅仅能够实现所需要的所有功能 还应当具有设计可重用 可移植 可维 护等特点 便于设计经验技术的交流与积累 形成 货架 加快设计进度 2.1 代码编写风格 编写代码时 应当尽量考虑可重用因素 1. 代码信号 变量等的命名通俗易懂 便于交流和维护 这要求我们的代码尽可能规范 尽 可能多加注释 2. 尽量采用package和generic 方便代码修改和移植 3. 项目组内设计风格一致 减少不必要的误会 4. 在同等和可能的条件下 尽量采用与工艺无关的代码 只要不影响大局 必要时可以牺牲 一定的面积 但是 若对芯片的面积要求比较苛刻 则应当尽量采用厂家提供的各种基本单元 5. 原则上 一个process处理一个信号 思路清晰 便于理解 有利于今后设计更改与查错 秘密 请输入文档编号VHDL数字电路设计指导 2001-09-15 版权所有 侵权必究 第5页 共50页 6. 按照 VHDL代码书写规范 进行编码 2.2 代码模块划分 模块设计的好坏直接影响着系统的设计好坏 模块设计的不好 会给后面的设计流程带来许 多麻烦 模块设计的基本原则是 1. 模块划分有利于模块的可重用性 模块设计得好 可节省大量的重复工作 并且为以后的设计带来方便 2. 在组合电路设计中应当没有层次 一方面可提高代码的可读性 另一方面方便综合 时序较易满足 3. 每个模块输出尽量采用寄存器输出形式 设 计划 项目进度计划表范例计划下载计划下载计划下载课程教学计划下载 分 Design Partition 必须以寄存器为边界 划分设计的层次使得每个模块的输入和输 出都是寄存器信号 这样有利于时序设计 加约束 时序容易满足 4. 模块的按功能进行划分 划分要合理 5. 异步逻辑与同步逻辑除了必要的衔接部分 尽量不要在同一个模块中 6. 尽量区分面积敏感和速度敏感电路部分 并放在不同的模块中 7. 模块间不要有glue 关系 如下 A B C A B C BAD GOOD 图1 glue关系 8. 模块大小应适中 不能太大 也不能太小 一般为2000门左右 具体情况 应当依据综合 工具的性能而定 9. 模块的层次应当至少有三级 可将一个设计划分为三个层次 TOP MID 功能CORE ŸTOP 包括实例化的MID和输入输出定义 如果用综合工具插入管脚则可不要此层次 ŸMID 由两部分组成 1 时钟产生电路 如分频电路和倍频电路 2 功能CORE的实例化 Ÿ功能CORE 秘密 请输入文档编号VHDL数字电路设计指导 2001-09-15 版权所有 侵权必究 第6页 共6页 包括各种功能电路的设计 一个复杂的功能可以分成多个子功能来实现 即再划分子层 3 常见问题 3.1 不可综合的代码 3.1.1信号或变量赋初值 对大多数综合工具而言 信号或变量所赋的初值在综合时会被忽略掉 可能造成设计错误 请不要使用类似如下案例的语句 variable SUM:interger = 0 3.1.2采用时间相关语句 仿真语句 对综合工具而言 所有带延时的语句在综合时均报错 因为从功能上讲 只存在正常的与或 非等逻辑 不存在 延时逻辑 在ASIC设计中 可以采用厂家提供的专门延时模块 Delay Buffer 来实现特定延时 而FPGA设计中则无类似的Delay Buffer 在FPGA设计时 实现特定延时非常麻烦 且很容易受每次的布局布线结果所干扰 建议采用 其它方法避免采用延时电路 如采用高频时钟处理方法等 时间相关语句主要目的是用来编写测试代码 仿真验证电路功能是否正确 可以认为是仿真 语句 常见的仿真语句有 wait for 10 ns Data_in <= 55 after MCLK_PERIOD 其中 MCLK_PERIOD是定义的时间常数 3.2 采用std_logic以外的信号类型 采用VHDL进行设计时 我们建议信号 变量 端口尽量使用STD_LOGIC或其派生类型 这 样做的目的是为了统一信号格式 信号连接方便 不容易出错误 尤其是模块与模块之间连接时 port map 因为一旦采用其它类型 例如BIT 则与此相连接的所有线都得定义成BIT 人为增 加麻烦 Synopsys公司也建议在使用VHDL编写代码时 尽量只采用STD_LOGIC类型 3.3 错误使用inout D A_s A 内部电路 模块1 内部电路 模块2 图2 内部反馈电路 秘密 请输入文档编号VHDL数字电路设计指导 2001-09-15 版权所有 侵权必究 第7页 共7页 如上图所示电路 对模块1而言 信号A既是输出 又是 输入 内部反馈 因此在 entity定义里面 想当然地采用了inout类型 ...... A : inout STD_LOGIC ; ...... 然而 inout一般是用来表示双向口电路 如下图所示 A 图3 双向口 为了避免异意 我们建议采用另起一个信号A_s来处理 s 表示 same 方法如下 1. 在architecture中定义信号A_s signal A_s : std_logic ; 2. 在本entity内 采用A_s信号处理一切逻辑 包括A_s信号的产生 3. 对A信号赋值 如下 A <= A_s 3.4 产生不必要的Latch 在处理组合逻辑电路时 初学者经常犯如下错误 process A B C Cntr begin if Cntr = '1' then A <= '1' B <= '1' else C <= '1' end if; end process ; 结果 A B C都成为了LATCH 为了避免产生LATCH 正确处理方法是 process A B C Cntr begin if Cntr = '1' then A <= '1' B <= '1' 秘密 请输入文档编号VHDL数字电路设计指导 2001-09-15 版权所有 侵权必究 第8页 共8页 C <= '0' -- 缺省处理 else A <= '0' -- 缺省处理 B <= '0' -- 缺省处理 C <= '1' end if; end process ; 同样 在使用case语句时 每种情况下所有的信号都必须处理到 或者 在case语句之前 对 所有的信号赋一个初值 例如 process A B C D S begin A <= '0' ; B <= '0' ; C <= '0' ; D <= '0' ; case S is when "00" => A <= '1' ; when "01" => B <= '1' ; when "10" => C <= '1' ; when "11" => D <= '1' ; when others => null ; end case ; end process ; 3.5 同一个信号在两个或两个以上的process中赋值 除了三态输出信号 其它信号是不允许在不同的process中分别赋值 3.6 错误地使用变量或信号 变量只能在进程语句 函数语句和子程序结构中使用 它是一个局部量 变量的赋值是立即 生效的 信号是电路内部硬件连接的抽象 信号的赋值在进程结束后才进行 信号的赋值与顺序 无关 变量赋值与顺序有关 下面的VHDL实例显示了一个设计分别使用信号和变量的综合结果 请仔细比较异同 秘密 请输入文档编号VHDL数字电路设计指导 2001-09-15 版权所有 侵权必究 第9页 共9页 注意 如果在一个进程中对信号赋多次值 只有最后的值有效 变量的赋值立即生效 变量 在赋新值前保持原来的值 例1 组合逻辑中使用信号 -- XOR_SIG.VHD -- May 1997 Library IEEE; use IEEE.std_logic_1164.all; entity xor_sig is port (A, B, C: in STD_LOGIC; X, Y: out STD_LOGIC); end xor_sig; architecture SIG_ARCH of xor_sig is signal D: STD_LOGIC; begin SIG:process (A,B,C) begin D <= A; -- ignored !! X <= C xor D; D <= B; -- overrides !! Y <= C xor D; end process; end SIG_ARCH; 图4 组合逻辑中使用信号 例2 组合逻辑中使用变量 -- XOR_VAR.VHD -- May 1997 Library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; entity xor_var is port (A, B, C: in STD_LOGIC; X, Y: out STD_LOGIC); end xor_var; architecture VAR_ARCH of xor_var is begin VAR:process (A,B,C) variable D: STD_LOGIC; begin D := A; X <= C xor D; D := B; Y <= C xor D; end process; end VAR_ARCH; 秘密 请输入文档编号VHDL数字电路设计指导 2001-09-15 版权所有 侵权必究 第10页 共10页 图5 组合逻辑中使用变量 例3 触发器中使用信号 P1:process CLK) begin if (CLK = ‘1’ and CLK ‘event ) then X <= A and B; Y <= X; Z <= Y; end if; end process; P2:process CLK) begin if (CLK = ‘1’ and CLK ‘event ) then Z <= Y; Y <= X; X <= A and B; end if; end process; p1, p2 综合的结果是一样的 A B CLK Z 图6 触发器中使用信号 例4 触发器中使用变量 P1:process (CLK) variable X , Y : std_logic; begin if (CLK ‘event and CLK = ‘1’) then X := A and B; Y := X; Z <= Y; end if; end process; P2:process (CLK) 秘密 请输入文档编号VHDL数字电路设计指导 2001-09-15 版权所有 侵权必究 第11页 共11页 variable X , Y : std_logic; begin if (CLK ‘event and CLK = ‘1’) then Z <= Y; Y := X; X := A and B; end if; end process; 则综合结果为 P1: A B CLK Z P2: A B CLK Z 图7 触发器中使用变量 合理使用变量 可方便地实现较为复杂的逻辑电路 如并行CRC电路 所谓并行是指一次处理 多个bit 但变量使用很容易出错 且有时不方便交流 理解和查错 建议 在对变量不是很把握的情况下 尽量少使用变量 若无必要 则不使用变量 3.7 合理使用内部RAM 当内部RAM大到一定程度时 例如64X16的同步RAM 此时每个地址线驱动的基本单元都比 较多 电路扇出很大 我们建议 1 地址线直接来自专门地址寄存器 2 RAM的输出直接接寄存器 这样 保证地址线的扇出较小 且按照流水线设计 可获得较高频率 因此 我们要求设计者在设计之前 必须了解所采用的RAM最快速率是多少 以决定是否加 和如何加寄存器 3.8 三态电路设计 三态电路一般用于 1 双向口 2 多路数据竞争总线或者多路选择电路 注意 在ASIC设计里 除了芯片的双向口或输出口可用三态外 芯片内部其它部分不允许出现三态 这是因 为ASIC设计里 考虑到DFT Design For Test 等因素 一般ASIC厂家在芯片内部不提供三态电路 因此 在 ASIC设计中 三态电路一般用组合逻辑替代 双向口的处理比较简单 我们主要考虑第 2 种情况 考虑一根总线问题 如下例所示 A B竞争总线T Tri_p1: process (Sel_a,A) 秘密 请输入文档编号VHDL数字电路设计指导 2001-09-15 版权所有 侵权必究 第12页 共12页 begin if (Sel_a = ‘1’) then T <= A; else T <= ‘Z’; end if; end process; Tri_p2: process (Sel_b,B) begin if (Sel_b = ‘1’) then T <= B; else T <= ‘Z’; end if; end process; 为什么不能在一个process中进行处理呢 如下所示 Error : process (Sel_a,A,Sel_b,B) begin if (Sel_a = ‘1’) then T <= A; else T <= ‘Z’; end if; if (Sel_b = ‘1’) then T <= B; else T <= ‘Z’; end if; end process; 这是因为 上述两个if语句彼此没有优先级 又由于是对同一个信号 信号T 进行处理 则 后一个处理会覆盖前一个处理 正确的做法是将这两个if 语句放在两个process中进行 3.9 异步复位电路设计 异步复位信号的产生原则上应当遵守 1 异步复位信号无毛刺 秘密 请输入文档编号VHDL数字电路设计指导 2001-09-15 版权所有 侵权必究 第13页 共13页 2 一个信号不能既作为异步复位信号 又作为内部电路控制信号 有关设计原理分析 可参见 同步电路设计技术及规则 当设计中存在两个或两个以上的异步复位信号时 例如软复位 一般由CPU下达 和硬复位 则在写代码时 经常会采用如下形式 process Mclk CPU_reset Hard_reset begin if ( CPU_reset = '1' or Hard_reset = '1') then D <= '0' ; elsif Mclk = '1' and Mclk'event then ...... end if; end process ; 上述形式在多个entity的多个process中出现 将导致以下几个问题 1 每个触发器都带一个 或 门复位电路 浪费资源 2 有些综合工具会出错 正确地写法是 Rst <= CPU_reset = '1' or Hard_reset = '1' ; process Mclk CPU_reset Hard_reset begin if ( Rst ='1' ) then D <= '0' ; elsif Mclk = '1' and Mclk'event then ...... end if; end process ; 其中所有类似的触发器都共用一个Rst 在FPGA设计里 可将Rst接在专用复位器件startup上 详情参见 5.4.4专用全局Set/Reset资 源 3.10时钟电路设计 许多人在设计电路时 经常采用 分频信号 作为时钟控制某一部分电路 在实际电路中 这种做法大多数是不可取的 这是因为 许多分频时钟不是全局时钟 也未经过时钟buffer进行驱 动 导致该分频时钟到各个触发器clk端的延时不一致 从而给许多触发器的建立时间或保持时间 带来恶劣影响 原理参见 同步电路设计技术及规则 第2章 时序分析基础 使设计不容易 实现 因此 在同步电路设计里 一个原则是 凡是分频信号 均不作为时钟 而是作为控制信 号 例如 秘密 请输入文档编号VHDL数字电路设计指导 2001-09-15 版权所有 侵权必究 第14页 共14页 process Mclk Reset begin if Reset = '1' then Mclk_d2 <= '0' ; elsif Mclk = '1' and Mclk'event then Mclk_d2 <= not Mclk_d2 ; end if; end process ; process Mclk_d2 Reset begin if Reset = '1' then D_out <= '0' ; elsif Mclk_d2 = '1' and Mclk_d2'event then D_out <= D_in ; end if; end process ; 上述电路可改为 process Mclk Reset begin if Reset = '1' then D_out <= '0' ; elsif Mclk = '1' and Mclk'event then if Mclk_d2 = '0' then D_out <= D_in ; end if ; end if; end process ; 但是 对于如下电路 我们可以采用分频时钟 请注意 图中两个模块是无任何联系的 秘密 请输入文档编号VHDL数字电路设计指导 2001-09-15 版权所有 侵权必究 第15页 共15页 两模块之间 彼此独立 模块0 模块1 图8 分频时钟在独立模块中的应用 关于时钟电路的设计 我们总结如下 对可编程器件而言 1 芯片外部时钟输入信号尽量从时钟管脚 PAD内带全局时钟驱动buffer 引入 由于时 钟管脚资源有限 这就要求我们在做设计时 应当了解某一器件最多能带多少个时钟 依次规范整 个单板的设计 时钟考虑 2 一般而言 尽量少采用分频时钟 以减少时钟个数 简化设计 若要采用分频时钟 则 尽量接在片内时钟buffer上 而后再去驱动各触发器 3 若是时钟太多 时钟buffer资源不够 则应当对未经时钟buffer驱动的时钟加严格的约 束 例如对xilinx器件而言 加MAXDELAY和MAXSKEW 4 设计技巧 在设计过程中 经常遇到速度或面积问题 在功能基本正确之后 设计要么速度不满足要 求 要么面积太大 或者两者都不满足设计要求 经常在速度和面积上花费大量的时间 本章着重从速度和面积角度出发 考虑如何编写代码或设计电路 以获得最佳的效果 但 是 有些方法是以牺牲面积来换取速度 而有些方法是以牺牲速度来换取面积 也有些方法可同时 获得速度和面积的好处 具体如何操作 应当依据实际情况而定 速度和面积的处理 实际是对电路结构的处理 即如何获得最优的电路结构 可以在高抽象 层次对电路的结构进行科学构造 如算法的优化 这样可以提升电路综合后的性能 综合工具并不 总能导出电路的详细结构 如果设计者能提供附加的结构信息 能帮助综合工具生成更高效的电路 在处理速度与面积问题的一个原则是 向关键路径 部分 要时间 向非关键路径 部分 要面积 为了获得更高的速度 应当尽量减少关键路径上的逻辑级数 为了获得更小的面积 应当 尽量共享已有的逻辑电路 4.1 合理选择加法电路 4.1.1串行进位与超前进位 秘密 请输入文档编号VHDL数字电路设计指导 2001-09-15 版权所有 侵权必究 第16页 共16页 改变赋值语句的顺序和使用信号或变量可以控制设计的结构 每一个VHDL信号赋值 进程 或元件的引用对应着特定的逻辑 每个信号代表一条信号线 使用这些结构 能将不同的实体连接 起来 实现不同的结构 下面的VHDL实例为加法器的进位链电路的两种可能的描述 例 串行进位链 -- A is the addend -- B is the augend -- C is the carry -- Cin is the carry in C0 <= (A0 and B0) or ((A0 or B0) and Cin); C1 <= (A1 and B1) or ((A1 or B1) and C0); 图9 串行进位 例 超前进位链 并行结构 -- Ps are propagate -- Gs are generate p0 <= a0 or b0; g0 <= a0 and b0; p1 <= a1 or b1; g1 <= a1 and b1; c0 <= g0 or (p0 and cin); c1 <= g1 or (p1 and g0) or (p1 and p0 and cin); 图10 超前进位 显然 第二种方法速度快 但面积大 第一种方法速度慢 但面积小 4.1.2使用圆括号处理多个加法器 控制设计结构的另一种方法是使用圆括号来定义逻辑分组 下面的例子描述了一个4输入的加 法器分组及其实现结果 例 Z <= A + B + C + D; 秘密 请输入文档编号VHDL数字电路设计指导 2001-09-15 版权所有 侵权必究 第17页 共17页 图11 串行加法电路 用圆括号重新构造的加法器分组如下所示 例 Z <= (A + B) + (C + D); 图12 并行加法电路 上述两种方法的在速度和面积上的区别是 第一种方法 不带括号 面积小 但整体速度慢 但是 如果信号D是关键路径 其它信号 是非关键路径 或者 设计中关键路径与A B C D无关 则应当采用这种方法 第二种方法 带括号 面积大 但整体速度快 如果对A B C D的时序要求都比较苛 刻 应当采用这种方法 4.1.3改变操作数的位宽 下面的例子 加法器求A和TEMP的和 A和TEMP都是8位宽 TEMP的值为B 当B<16时 或C C为4位宽 因此 TEMP的高4位总是0 但是综合器并不能利用此点 因为TEMP为 BYTE类型 修改TEMP为NIBBLE类型 如第2个例子所示 这样 原来要用8个全加器完成的加法 运算 现在低4位运算用4个全加器 高4位运算用4个半加器实现 大大节省了电路所占面积 例1 原设计 function ADD_IT_16 (A, B: BYTE; C: NIBBLE) return BYTE is variable TEMP: BYTE; begin if B < 16 then TEMP := B; else TEMP := C; end if; return A + TEMP; end; 例2 修改操作数位宽 function ADD_IT_16 (A, B: BYTE; C: NIBBLE) return BYTE is 秘密 请输入文档编号VHDL数字电路设计指导 2001-09-15 版权所有 侵权必究 第18页 共18页 variable TEMP: NIBBLE; -- Now only 4 bits begin if B < 16 then TEMP := NIBBLE(B); -- Cast BYTE to NIBBLE else TEMP := C; end if; return A + TEMP; -- Single adder end; 其中 BYTE是指8bits宽数据类型 BIBBLE是指4bits宽数据类型 4.2 IF语句和Case语句 速度与面积的关系 IF语句指定了一个优先级编码逻辑 而Case语句生成的逻辑是并行的 不具有优先级 IF语 句可以包含一套不同的表达式 而Case语句比较的是一个公共的控制表达式 通常 Case结构速度 较快 但占用面积较大 所以用Case语句实现对速度要求较高的编解码电路 IF-Else结构速度较 慢 但占用的面积小 如果对速度没有特殊要求 而对面积有较高要求 则可用IF-Else语句完成编 解码 不正确的使用嵌套的IF语句会导致设计需要更大的延时 为了避免较大的路径延时 不要使 用特别长的嵌套IF结构 用IF语句实现对延时要求苛刻的路径 speed-critical paths 时 应将最高 优先级给最迟到达的关键信号 Critical Signal 有时 为了兼顾面积和速度 可以将IF和Case语 句合用 例 七级嵌套IF结构 例 采用IF-Case的嵌套IF结构 秘密 请输入文档编号VHDL数字电路设计指导 2001-09-15 版权所有 侵权必究 第19页 共19页 由上面两个例子可以看出 采用IF-Case结构比嵌套IF结构更有效 减少了大约3ns的延时 使 用XC4005E-2 IF-Then-Else适于完成优先级编码 此时应将最高优先级给关键信号 Critical Signal 在下 面的例中关键信号为in[0] 例 用IF-Then-Else完成8选1多路选择器 MUX6to1:process(sel,in) begin if(sel= "000") then out <= in(0); elseif(sel = "001") then out <= in(1); elseif(sel = "010") then out <= in(2); elseif(sel = "011") then out <= in(3); elseif(sel = "100") then out <= in(4); else out <= in(5); end if; end process; 秘密 请输入文档编号VHDL数字电路设计指导 2001-09-15 版权所有 侵权必究 第20页 共20页 图13 if-else完成多路选择 下面的例子是用Case语句完成8选1多路选择器的VHDL实例 在大多数FPGA结构中能够在单 个CLB中完成一个4选1的多路选择器 Virtex可以在单个CLB中完成一个8选1的多路选择器 而用 IF-Else语句需要多个CLB才能完成相同功能 因此 Case语句生成的设计速度更快延时更小 例 用Case实现8选1多路选择器 MUX8to1 process( C, D, E, F, G, H, I, J, S ) begin case S is when “000” => Z <= C; when “001” => Z <= D; when “010” => Z <= E; when “011” => Z <= F; when “100” => Z <= G; when “101” => Z <= H; when “110” => Z <= I; when others => Z <= J; end case; end process; 图14 case语句完成电路选择 4.3 减少关键路径的逻辑级数 在FPGA中 关键路径 critical path 上的每一级逻辑都会增加延时 为了保证能满足定时约 束 就必须在对设计的行为进行描述时考虑逻辑的级数 减少关键路径延时的常用方法是给最迟到 达的信号最高的优先级 这样能减少关键路径的逻辑级数 下面的实例描述了如何减少关键路径上 的逻辑级数 例 此例中critical信号经过了2级逻辑 if (clk'event and clk ='1') then if (non_critical='1' and critical='1') then out1 <= in1; else out1 <= in2; end if; 秘密 请输入文档编号VHDL数字电路设计指导 2001-09-15 版权所有 侵权必究 第21页 共21页 end if; 图15 critical信号经过2级逻辑 为了减少critical路径的逻辑级数 将电路修改如下 critical信号只经过了一级逻辑 signal out_temp : std_logic; process (non_critical, in1, in2) if (non_critical='1') then out_temp <= in1; else out_temp <= in2; end if; end process; process(clk) if (clk'event and clk ='1') then if (critical='1') then out1 <= out_temp; else out1 <= in2; end if; end if; end process; 图16 critical信号只经过一级逻辑 4.4 资源共享 4.4.1 if语句 资源共享能够减少HDL设计所用逻辑模块的数量 否则 每个HDL描述都要建立一套独立的 电路 下面的VHDL实例说明如何使用资源共享来减少逻辑模块的数量 例 没有资源共享时用了4个加法器完成 if (...(siz = "0001")...) then count <= count + "0001"; else if (...((siz = "0010")...) then count <= count + "0010"; else if (...(siz = "0011")...) then count <= count + "0011"; else if (...(siz == "0000")...)then 秘密 请输入文档编号VHDL数字电路设计指导 2001-09-15 版权所有 侵权必究 第22页 共22页 count <= count + "0100"; end if; 利用资源共享 采用下面的代码 可以节省2个加法器 if (...(siz = "0000")...) then count <= count + "0100"; else if (...) then count <= count + siz; end if; 例 没有利用资源共享时用了2个加法器实现 if (select = '1') then sum<=A +B; else sum<=C +D; end if; 图17 资源共享前 2个加法器 加法器要占用宝贵的资源 利用资源共享 修改代码如下 只用2个选择器和1个加法器实 现 减少了资源占用 if (sel ='1') then temp1 <=A; temp2 <=B; else temp1 <=C; temp2 <=D; end if; sum <= temp1 + temp2; 图18 资源共享后 1个加法器 4.4.2 loop语句 与选择器相比 运算符占用更多的资源 如果在循环语句中有一个运算符 综合工具必须对 所有的条件求值 下面的VHDL实例 综合工具用4个加法器和一个选择器实现 只有当 req 信 号为关键信号时 才建议采用这种方法 for i in 0 to 3 loop if (req(i)='1') then 秘密 请输入文档编号VHDL数字电路设计指导 2001-09-15 版权所有 侵权必究 第23页 共23页 sum <= vsum + offset(i); end if; end loop; 图19 资源共享前4个加法器 如果 req 信号不是关键信号 运算符应当移到循环语句的外部 这样在执行加法运算前 综合工具可以对数据信号进行选择 修改代码如下 用一个多路选择器和一个加法器即可实
本文档为【VHDL数字电路设计指导请】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_924948
暂无简介~
格式:pdf
大小:1MB
软件:PDF阅读器
页数:48
分类:互联网
上传时间:2011-03-20
浏览量:16