我被告知使用'when'语句来制作多路复用器但不使用'if'语句,因为它会导致时序错误...... 我不明白这个...... 那么'if'和'when'之间有什么区别?他们在硬件中映射到同一个东西吗?
答案 0 :(得分:3)
好的,我们先讨论一下if和when语句之间的区别:
而且你知道多路复用器是一个不需要进程块的组件,因为它的行为不会随着输入的变化而改变,因此它将是外部进程,所以你必须使用when语句来编写它,因为它是并发语句..如果你用if语句写它,可能会发生计时错误。此外,所有参考文献和Xilinx帮助(如果您使用的是Xilinx)都在使用when语句写入多路复用器块而不是语句
参考:Digital Design Priciples & Practices, John F. Wakerly, 3rd Edition
答案 1 :(得分:2)
见这些:
when
。
if
。
基本上,if
是顺序的,when
是并发的。它们不会在硬件中映射到同一个东西...... This page在底部描述了合成if
语句所需的一些特殊注意事项。
答案 2 :(得分:1)
两种编码风格都完全有效。
让我们回顾一些元素。从HDL开始,合成分两个主要步骤完成:
这两个步骤清楚地将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合成器将推断出什么。
相反,行为综合允许您(部分地)忘记合成器将推断的内容。但这是另一个故事。