1
    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) 和警告 Optimizing register bit IntSda to a constant 0 (Cl190)

出于某种原因,综合工具解释说 IntSda 将始终为 0。注意 IntReset 是一个输入。AddrReg 是计数器的输出,它在 SCl 的时钟上升沿改变值。计数器合成良好,我在 FPGA 上对其进行了测试,并使用逻辑分析仪查看了输出。我不知道为什么会这样。我可以保留保留,但我认为这是一种权宜之计,不能替代了解根本原因。

4

1 回答 1

1

你会很难把 Zs 弄出来。合成器可能将它们视为 '0' :)

我建议你在DataBuffer数组中使用 1 和 0,然后SDa像这样在进程之外驱动:

SDa <= '0' when IntSDa = '0' else 'Z';
于 2013-05-16T12:52:36.673 回答