VHDL中的简单标志[错误10820]

时间:2017-02-24 16:49:47

标签: vhdl fpga intel-fpga

我想用VHDL设计一个IIC嗅探器,我在一个非常基本的方面努力。

为了保持“顺序”,我想在一个实体将要执行的每个部分之后设置一个标志。

现在我想在START条件下设置一个标志(SDL上的SCL = HIGH& RISING_EDGE) 该标志应在STOP条件下复位(SDL上的SCL = HIGH& FALLING_EDGE)以及按下复位按钮时。

我现在遇到的问题是我无法通过START设置标志并通过STOP命令重置。

我该怎样接近这个时期的旗帜?

entity scltest is
port(   scl, sda: in std_logic;
        scled, sdaled, flag: out std_logic
        );
end scltest;

architecture test of scltest is
begin 
scled <= scl;
sdaled <= sda;

process(sda)
begin
if (scl = '1' AND rising_edge(sda)) then
flag <= '1';
else
    if (scl = '1' AND falling_edge(sda)) then
    flag <= '0';
    end if;
end if;
end process;

end test;

此代码不起作用,因为: “错误(10820):scltest.vhd(18)中的网表错误:无法推断寄存器的标志,因为它的行为取决于多个不同时钟的边缘”

我明白为什么它不会起作用,但我想不出一个可以起到同样作用的设计。

提前谢谢。

1 个答案:

答案 0 :(得分:0)

您的基本想法似乎是您希望使用总线时钟完成所有逻辑操作。但是,您的设计不应完全取决于总线时钟 - 尤其是因为I²C非常慢。

您需要一个可以执行其他任务的运行系统(如USB,USART ...)向主机系统(PC,SoC ...)报告I²C总线的状态。

为此,您需要对SCL和SDA进行采样,并使用由系统时钟计时的内核执行上升/下降沿,总线状态等的实际分析。这样,您的所有逻辑都将同步到你的系统时钟。

根据您的开发板,可能存在已经准备好主机端的示例设计,您只需要在正确的位置“插入”模块。一个好的起点IMHO 1 将是Digilent的Spartan板之一,因为主机端代码可以免费获得工具和编程API。

1 我不以任何方式与Digilent有关联。