信号没有激活过程?

时间:2017-02-23 00:44:53

标签: process signals vhdl fpga timing

所以我似乎遇到了关于标志信号被断言的问题。所以基本上我正在实现2个fpga之间的i2c接口。我的主人将发送超过50个字节。在我的奴隶方面,我想将进入的字节存储到一个数组中。所以我检查读取整个字节的时间,并将其放入数组中。现在的问题是,在我填满整个数组后,我想断言一个应该激活进程的信号。我的问题是,当信号被断言并且过程被激活时,我永远陷入空闲循环,这让我感到困惑,因为我假设当我进入过程并检查标志信号断言条件时它是假设很高。问题是我的信号没有激活过程,或者我的问题是,当我检查标志断言时条件是标志已经回到0? 我附上了一些代码:

  signal i : integer range 0 to 49 := 0;

  type field_array is array(0 to 49) of std_logic_vector(7 downto 0);
begin
process(clk,rst) 
begin

if( rst = '1') then

    i <= 0;

elsif (rising_edge(clk)) then

    if(data_available = '1') then

        array_of_data(i) <= Master_Data;

        i <= i + 1;

    end if;

    if(i = 49) then

        i <= 0; -- reset index back to zero

    end if;

end if;

end process;

flag <= '1' when i = 49 else '0'; 

process(state,flag)
begin

next_state   <= state;

case (state) is 

    when idle =>

        if(flag = '1') then

            next_state <= Send_data;

        end if;

     when Send_data =>...

1 个答案:

答案 0 :(得分:0)

您的作业i <= i+1;上的边界检查失败。它试图在稍后执行的检查(if i=49...)之前对其进行评估。

将代码的同步部分更改为:

elsif rising_edge(clk) then
    if data_available = '1' then
        array_of_data(i) <= Master_Data;
        if i = 49 then
            i <= 0;
        else
            i <= i + 1;
        end if;
    end if;
end if;

编辑:

您可以看到该标志正在被置位且状态发生变化here

进一步编辑:

考虑使状态机同步并删除next_state信号。例如

type state_t is (idle_s, send_s, others_s);
signal state : state_t := idle_s;
...
process(clk,rst)
begin
    if rst = '1' then
        -- rst
    elsif rising_edge(clk) then
        case (state) is
            when idle_s =>
                if flag = '1' then
                    state <= send_s;
                else
                    state <= idle_s;
                end if;
            when send_s =>
            -- Do stuff
            when others =>
            -- stuff
        end case;
    end if;
end process;

如果要在状态发生变化时立即分配输出,可以使用双进程状态机。其中一个进程(同步)用于控制状态转换,另一个用于控制输出(组合)。你实际上会有另一个类似于第一个的过程:

process(state)
begin
    case state is
        when idle_s =>
            my_output <= '0';
        when send_s =>
            -- Assign output as necessary
            my_output <= '1';
        when others =>
        --assign output
    end case;
end process;

显示了一个示例here