当我使用to_integer访问常量数组时,Synplify会修剪我的寄存器。 (VHDL)

时间:2013-05-15 20:22:49

标签: vhdl fpga synthesis

    Data_Out_SDa : process (SCl, IntReset) is
        variable IntSDa : std_logic;        -- Internal Sda
        begin  -- process Data_Out_SDa
        if IntReset = '0' then              -- asynchronous reset (active high)
           IntSDa := 'Z';
        elsif SCl'event and SCl = '0' then  -- falling clock edge
              IntSDa := DataBuffer(to_integer(unsigned(AddrReg)));
        end if;
        SDa <= IntSDa;
    end process Data_Out_SDa;

DataBuffer是一个121位常量std_logic_vector。 Sda是一个输出端口

代码合成很好。但是我得到一个警告Pruning Register IntSda,(CL169)和一个警告优化寄存器位IntSda为常数0(Cl190)

由于某种原因,合成工具正在解释IntSda将始终为0.注意IntReset是一个输入。 AddrReg是计数器的输出,它在SC1的上升时钟沿上改变值。计数器合成很好,我在FPGA上进行了测试,并使用逻辑分析仪查看输出。我不知道为什么会发生这种情况。我可以保留一个保留,但我认为这是一个停止间隙测量,并没有替代理解根本原因。

1 个答案:

答案 0 :(得分:1)

你很难以这种方式获得Zs。合成器可能将它们视为'0':)

我建议您在DataBuffer数组中使用1和0,然后在此过程之外驱动SDa,如下所示:

SDa <= '0' when IntSDa = '0' else 'Z';