所以我似乎遇到了关于标志信号被断言的问题。所以基本上我正在实现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 =>...
答案 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。