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上进行了测试,并使用逻辑分析仪查看输出。我不知道为什么会发生这种情况。我可以保留一个保留,但我认为这是一个停止间隙测量,并没有替代理解根本原因。
答案 0 :(得分:1)
你很难以这种方式获得Zs。合成器可能将它们视为'0':)
我建议您在DataBuffer
数组中使用1和0,然后在此过程之外驱动SDa
,如下所示:
SDa <= '0' when IntSDa = '0' else 'Z';