HDL综合抱怨敏感性列表中缺少信号

时间:2013-04-04 13:05:08

标签: vhdl fpga hdl synthesis myhdl

你好我有这个简单的VHDL过程(从MyHDL代码生成):

DIGIPOT_CONTROLLER_CONNECTCLOCK: process (delayedClock) is
begin
    if to_boolean(clkEn) then
        if to_boolean(delayedClock) then
            scl_d <= '0';
        else
            scl_d <= 'Z';
        end if;
    else
        if to_boolean(sclIdleValue) then
            scl_d <= 'Z';
        else
            scl_d <= '0';
        end if;
    end if;
end process DIGIPOT_CONTROLLER_CONNECTCLOCK;

原始MyHDL代码:

@always(delayedClock)
def connectClock():
    if(clkEn):
        if(delayedClock):
            scl_d.next = False
        else:
            scl_d.next = None
    else:
        if(sclIdleValue):
            scl_d.next = None
        else:
            scl_d.next = False

在模拟中它完美地运行(ISIM和MyHDL模拟器),但是当我尝试将它合成到Spartan 6时,它会给出以下警告: clken应该在过程的敏感性列表中 sclidlevalue应该在流程的敏感性列表中

我理解它以某种方式推断这个过程应该对clkEn和sclIdleValue信号敏感。但当然这不是我的意图。 我希望它仅在delayedClock更改状态时更改输出,而不是在clkEn或sclIdleValue更改其各自状态时更改输出。

是否在Spartan 6架构中无法完成?或者,我是否应该描述过程,否则会产生我的预期行为?

1 个答案:

答案 0 :(得分:2)

我终于弄明白这是导致MyHDL代码:

@always(delayedClock.posedge, reset.posedge)
def connectClock():
    if(reset == 1):
        delayedClock_int.next = True
    else:
        delayedClock_int.next = not delayedClock_int
        if(clkEn):
            if(delayedClock_int):
                scl_d.next = False
            else:
                scl_d.next = None
        else:
            if(sclIdleValue):
                scl_d.next = None
            else:
                scl_d.next = False

和(生成)VHDL:

DIGIPOT_CONTROLLER_CONNECTCLOCK: process (delayedClock, reset) is
begin
    if (reset = '1') then
        delayedClock_int <= '1';
    elsif rising_edge(delayedClock) then
        delayedClock_int <= to_std_logic((not to_boolean(delayedClock_int)));
        if to_boolean(clkEn) then
            if to_boolean(delayedClock_int) then
                scl_d <= '0';
            else
                scl_d <= 'Z';
            end if;
        else
            if to_boolean(sclIdleValue) then
                scl_d <= 'Z';
            else
                scl_d <= '0';
            end if;
        end if;
    end if;
end process DIGIPOT_CONTROLLER_CONNECTCLOCK;

我不得不将延迟时钟设置为频率的两倍(然后在我的connectClock进程中将其除以2),这样它产生与原始进程相同的结果,并且可以在没有警告的情况下进行合成。逐步淘汰时钟的原因是SCL的I2C波形如下图所示: enter image description here