我试图更好地理解合成如何在没有指定其他条件的情况下工作。
我认为这不是编码的方法,因为我没有考虑其他选择,但是我的问题是如何解释此代码?
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;
Run Code Online (Sandbox Code Playgroud)
IF语句将被合成为多路复用器。我认为在这个示例中,两个多路复用器都将以链的形式连接在一起,最后一个D寄存器用于out的注册值。我想当sel0'0'和sel1'0'时qout的值是什么?每个多路复用器的选择器为0时会发生什么?网络是否保持相同的输出并推断出闩锁?
谢谢。
为了显示和学习综合工具如何实现设计,您可以例如与Altera Quartus II进行综合,然后使用内置的RTL查看器来显示最终设计的高级表示。
使用1位向量简化结构的代码给出了如下所示的结果。
因此,这显示了一个触发器,该触发器在每个周期更新,其值如下:
qout_sra_2
如果 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;
Run Code Online (Sandbox Code Playgroud)
其他综合工具可能会以不同的方式实现它,例如Xilinx ISE在触发器上使用时钟使能,因此得出以下结果。
因此,这显示一个触发器,如果sel0
or或sel1
is '1'
,则使用值更新:
qout_sra_2
如果 sel1 = '1'
a_minus_b
如果 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;
Run Code Online (Sandbox Code Playgroud)