我试图更好地理解合成如何适用于没有指定其他条件的过程。
我认为这不是代码的方式,因为我没有考虑其他选项,但我的问题是如何解释这段代码?
process(clock)
begin
if (clock'event and clock ='1') then
if sel0 = '1' then qout <= A - B; end if;
if sel1 = '1' then qout <= qout sra 2; end if;
end if;
end process;
IF语句将被合成为多路复用器。我认为,对于这个例子,两个多路复用器将在一个链中连接在一起,最后一个D寄存器用于注册的out值。我猜测当sel0&#39; 0&#39;时,qout的价值是多少?和sel1&#39; 0&#39;? 当每个多路复用器的选择器为&#39; 0时会发生什么?网络是否保持相同的输出,推断出一个锁存器?
感谢。
答案 0 :(得分:5)
为了展示和了解综合工具如何实现设计,您可以使用Altera Quartus II进行综合,然后使用内置RTL查看器来显示最终设计的高级表示。
使用1位向量来简化结构的代码给出了如下所示的结果。
因此,这显示了每个周期更新的触发器,值为:
qout_sra_2
if sel1 = '1'
a_minus_b
如果sel1 = '0'
和sel0 = '1'
qout
和sel1 = '0'
,则sel0 = '0'
(重新分配相同的值)
因此等同于:
if clock'event and clock ='1' then
if sel1 = '1' then
qout <= qout sra 2;
elsif sel0 = '1' then
qout <= A - B;
else
qout <= qout;
end if;
end if;
其他综合工具可以在不同的方面实现它,例如在触发器上使用时钟使能的Xilinx ISE,从而得到下面的结果。
因此,如果sel0
或sel1
为'1'
,则会显示更新的触发器,其值为:
qout_sra_2
if sel1 = '1'
a_minus_b
if sel1 = '0'
因此等同于:
if clock'event and clock ='1' then
if not ((sel0 = '0') and (sel1 = '0')) then -- (sel0 = '1') or (sel1 = '1')
if sel1 = '1' then
qout <= qout sra 2;
else
qout <= A - B;
end if;
end if;
end if;
答案 1 :(得分:1)
你基本上会得到一个多路复用器和一个寄存器(当然还有处理每个输入计算的逻辑)。不需要锁存器,因为寄存器将启用时钟,因此输入网络可以是纯粹的组合。
也不需要2个多路复用器。由于信号分配在VHDL中的工作方式,以下代码段:
if sel0 = '1' then
qout <= A - B;
end if;
if sel1 = '1' then
qout <= qout sra 2;
end if;
相当于:
if sel1 = '1' then
qout <= qout sra 2;
elsif sel0 = '1' then
qout <= A - B;
end if;
如果两个if
条件都为真,则后一个赋值会覆盖前一个赋值。之后暗示是&#34;否则什么都不做&#34;,即&#34;否则不用时钟启用寄存器&#34;。逻辑可以简化为仅依赖于sel1
的多路复用(如果sel1
是'0'
,则网络的输出可以由sel0
选择,或者不要小心,因为它不会被打入时间。寄存器的时钟使能为sel0 or sel1
。这至少是我的表现。
答案 2 :(得分:0)
如果if
语句都没有执行,则qout
保持其当前值。最初,它将是bit
的类型声明“0”和std_ulogic
的“U”中最左边的元素。合成器可能会抱怨缺少有效的初始化或默认为“0”或“1”。