VHDL过程未按预期合成

时间:2015-11-02 13:16:29

标签: vhdl vivado

我有一些看似简单的VHDL代码,这让我发疯。我有一个外部逻辑位连接到一个名为' inint'的信号。然后在一个看起来如下的过程中使用该信号:

process(inint)
  begin
    if rising_edge(inint) then
      extint <= '1';
    end if;

    if falling_edge(inint) then
      extint <= '0';
    end if;

  end process;

当我合成tis代码时,只有代码的下半部分合成而不是上部。我在这里缺少什么?

我猜这是非常基本的东西,但不能指责它。任何帮助将不胜感激。

此致

SHAILESH

1 个答案:

答案 0 :(得分:0)

正确的方法是使用双倍数据速率寄存器。否则,您无法合成以时钟速率切换的逻辑。您需要的Xilinx原语称为ODDR,并在您的设备的Select IO Resources用户指南中进行了说明(here是Artix-7的原型,请参见第127页)。

它可以被实例化以执行您尝试执行的操作:

ODDR_INST1 : ODDR
generic map (
    DDR_CLK_EDGE => "SAME_EDGE",
    INIT         => '0',
    SRTYPE       => "SYNC"
) 
port map (
    Q  => extint,
    C  => inint,
    CE => '1',
    D1 => '1',
    D2 => '0',
    R  => '0',
    S  => '0'
);

作为一个补充说明试图暗示双倍数据速率输出(这是你的代码所做的)不是一个好主意。它可能不受支持,但作为一般规则,如果你需要专用硬件(你这样做),你应该直接实例化它,因为它很难保证工具会推断出来(尽管它们比以前更加确定) )。