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