'if'vs'when'用于制作多路复用器

时间:2010-03-09 21:59:33

标签: hardware vhdl

我被告知使用'when'语句来制作多路复用器但不使用'if'语句,因为它会导致时序错误...... 我不明白这个...... 那么'if'和'when'之间有什么区别?他们在硬件中映射到同一个东西吗?

3 个答案:

答案 0 :(得分:3)

好的,我们先讨论一下if和when语句之间的区别:

  • 两者都称为数据流设计元素。

何时陈述

  • 并发陈述
  • 未在流程中使用,仅在架构中使用,因为流程是顺序执行

if statement

  • 顺序陈述
  • 在流程中使用,因为它是顺序语句,而不是在流程外使用

而且你知道多路复用器是一个不需要进程块的组件,因为它的行为不会随着输入的变化而改变,因此它将是外部进程,所以你必须使用when语句来编写它,因为它是并发语句..如果你用if语句写它,可能会发生计时错误。此外,所有参考文献和Xilinx帮助(如果您使用的是Xilinx)都在使用when语句写入多路复用器块而不是语句

参考:Digital Design Priciples & Practices, John F. Wakerly, 3rd Edition

答案 1 :(得分:2)

见这些:

基本上,if是顺序的,when是并发的。它们不会在硬件中映射到同一个东西...... This page在底部描述了合成if语句所需的一些特殊注意事项。

答案 2 :(得分:1)

两种编码风格都完全有效。

让我们回顾一些元素。从HDL开始,合成分两个主要步骤完成:

  1. 首先,分析VHDL以检测 RTL模板(包括RTL元素:触发器,算术表达式,多路复用器,控制逻辑)。我们说这些元素是“不可信的”(即你必须使用正确的模板进行编码以获得你最初想要的东西。你必须想象在编码之前这些元素是如何连接的)。
  2. 第二步是真正的逻辑综合,它考虑了特定的目标技术参数(可用的门类型,时序,面积,功率)。
  3. 这两个步骤清楚地将RTL功能需求(转向逻辑,计算)与技术突发事件(时间等)分开。

    让我们回到第一步(RTL):

    关于多路复用器,可以使用多种编码方式:

    • 使用并发分配:

      y< = a1当cond1时其他a2当cond2 else cond3;

    • 在流程中使用if语句:

      处理(A1,A2,A3,COND1,COND2) 开始     if(cond1)然后       Y'LT; = A1;     elsif(cond2)然后       Y'LT = A2;     其他       Y'LT; = A3;     万一; 端;

    • 使用其他并发作业 形式,适合通用 description:如果sel是整数 和muxin一系列信号,然后:

      muxout< = muxin(sel); - 将推断出多路复用器

    请注意,3种编码样式始终有效。还要注意它们比简单多路复用器“多一点”,因为编码风格强制存在优先级编码(如果elsif,则为else),这不是简单的基于方程的多路复用器的情况,实际上是对称的。

    • 使用案例陈述

      处理(A1,A2,A3,COND1,COND2)     变量cond:std_logic(1 downto 0);     开始       cond:= cond2& COND1;       案件cond是            当“01”=> y< = a1;            当“10”=> y< = a2;            当其他人=> Y'LT; = A3;       结束案例;     端;

    • 使用select语句(在我们的 例如,两个并发的分配 需要):

      sel< = cond2& COND1; 用sel SELECT     y< = a1 WHEN“01”,          a2当“10”时,          a3其他人;

    最后一点是关于抽象的兴起,即使对于RTL设计:合成器现在已经非常成熟。例如,看看LEON2开源处理器的Jiri Gaisler编码样式,以及他的编码样式(see here)。他从经典书籍中采用了一种非常不同的方法,但却非常有效。

    您应该始终了解RTL合成器将推断出什么。

    相反,行为综合允许您(部分地)忘记合成器将推断的内容。但这是另一个故事。