你好我有这个简单的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架构中无法完成?或者,我是否应该描述过程,否则会产生我的预期行为?
答案 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波形如下图所示: