Process 信号未激活过程?

Process 信号未激活过程?,process,signals,vhdl,fpga,timing,Process,Signals,Vhdl,Fpga,Timing,所以,我似乎有一个问题,关于标志信号得到断言。所以基本上我是在两个fpga之间实现i2c接口。我的主机将发送超过50个字节。在我的从端,我想将进入数组的字节存储起来。所以我检查整个字节何时被读取并可用,然后将其放入数组中。现在的问题是,在我填满整个数组之后,我想要断言一个应该激活进程的信号。我的问题是,当信号被断言并且进程被激活时,我永远卡在空闲循环中,这让我感到困惑,因为我假设当我进入进程并检查标志信号断言条件时,它被认为是高的。那么,问题是我的信号没有激活进程,还是我的问题是在我检查标志断言

所以,我似乎有一个问题,关于标志信号得到断言。所以基本上我是在两个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 =>...
信号i:整数范围0到49:=0;
类型字段_数组是标准_逻辑_向量(7到0)的数组(0到49);
开始
过程(时钟、rst)
开始
如果(rst='1'),则

i您的作业有一个边界检查失败,
i
我的输出
--根据需要分配输出
我的输出
--分配输出
终例;
结束过程;

显示了一个示例。

您的作业上有一个边界检查失败,
i
我的输出
--根据需要分配输出
我的输出
--分配输出
终例;
结束过程;

显示了一个示例。

感谢您的更正。是的,它似乎在模拟上运行良好,但当我在fpga上运行它时,它似乎只停留在空闲状态(使用led检查状态)。如果我错了,请纠正我,但当断言标志(0->1)时,进程应激活,并且当我检查(标志='1')条件是否应为真时,对吗?正确。在进一步研究之后,我可能还会修改您的状态控制器进程;使其同步,并消除
下一个\u状态
信号当我尝试模拟时,GHDL在该行上出现边界检查错误it@gsm道歉。我错了。您的作业将出现边界检查失败。感谢@gsm提供的修改建议和帮助。由于某种原因,当我使用我第一次发布的组合过程时,它现在可以工作了。奇怪。总之,您提到的同步过程非常有效,谢谢您,但我之所以没有首先开始使用同步,是因为在我的send data案例中,我计划断言一些输出,我希望在相同的时钟周期中,一旦遇到该案例,就立即断言这些输出,另一方面,如果我去同步,我相信我将断言的输出将在一个时钟周期后改变。谢谢你的更正。是的,它似乎在模拟上运行良好,但当我在fpga上运行它时,它似乎只停留在空闲状态(使用led检查状态)。如果我错了,请纠正我,但当断言标志(0->1)时,进程应激活,并且当我检查(标志='1')条件是否应为真时,对吗?正确。在进一步研究之后,我可能还会修改您的状态控制器进程;使其同步,并消除
下一个\u状态
信号当我尝试模拟时,GHDL在该行上出现边界检查错误it@gsm道歉。我错了。您的作业将出现边界检查失败。感谢@gsm提供的修改建议和帮助。由于某种原因,当我使用我第一次发布的组合过程时,它现在可以工作了。奇怪。总之,您提到的同步过程非常有效,谢谢您,但我之所以没有首先开始使用同步,是因为在我的send data案例中,我计划断言一些输出,我希望在相同的时钟周期中,一旦遇到该案例,就立即断言这些输出,另一方面,如果我要进行同步,我相信我将断言的输出将在一个时钟周期后改变。从您的代码片段中不清楚下一个状态是如何变化的(当您的标志改变时设置)应该更改您的
状态
信号以触发状态机的下一个状态。从您的代码片段中不清楚
下一个状态
(在标记更改时设置)应该如何更改您的
状态
信号以触发状态机的下一个状态。
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;
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;