我有两个使用信号在它们之间进行同步的过程,使用的信号是以下方式:
type state_machine_1 is
(st1_state_idle, st1_state_1, st1_state_2, st1_state_3,
st1_state_4,st1_state_5,st1_state_6);
type state_machine_2 is
(st2_state_idle, st2_state_1, st2_state_2);
--...
signal st1 : state_machine_1;
signal st2 : state_machine_2;
signal sync_sig : std_logic;
--...
st1_proc: process (CLK, RESET)
begin
if (RESET = '1') then
st1 <= st1_state_idle;
sync_sig <= '0';
elsif rising_edge(CLK) then
case st1 is
when st1_state_idle =>
--...
sync_data_is_ready_for_cau <= '0';
if (START = '1') then
st1 <= st_state_1;
else
st1 <= st1_state_idle;
end if;
----------------
when st_state_1 =>
--...
st1 <= st_state_2;
----------------
when st_state_2 =>
--...
st1 <= st_state_3;
----------------
when st_state_3 =>
--...
if (sync_sig = '0') then
st1 <= st_state_5;
else
st1 <= st_state_4;
end if;
----------------
when 4 =>
if (sync_sig = '0') then
st1 <= st_state_5;
else
st1 <= st_state_4;
end if;
----------------
when st_state_5 =>
--...
sync_sig <= '1';
st1 <= st_state_1;
end case;
end if;
end process;
st2_proc: process (CLK, RESET, reset_for_st2)
begin
if (RESET = '1' or reset_for_st2 = '1') then
st2 <= st2_state_idle;
elsif (rising_edge(CLK)) then
case st2 is
when st2_state_idle =>
if (sync_sig = '1') then
st2 <= st2_state_1;
else
st2 <= st2_state_idle;
end if;
----------------
when st2_state_1 =>
--...
st2 <= st2_state_2;
----------------
when st_state_2 =>
--...
st2 <= st2_state_3;
----------------
when st2_state_3 =>
--...
sync_sig <= '0';
st2 <= st2_state_idle;
----------------
end case;
end if;
end process;
所有--...
都是不接触同步信号的逻辑,而不是状态信号(在某些情况下,如果有等待某个信号来推进状态)。因此,放入同步信号的值之间不会发生任何冲突,但模拟(Altera Model-Sim)会给信号一个U
值。如何使用信号在进程之间进行同步?
答案 0 :(得分:0)
&#39; U&#39; (未初始化)只有在模拟开始时没有reset
处于活动状态时才会出现。你应该真正得到&#39; X&#39;当两个FSM冲突时,sync_sig
上有多个驱动程序。当您在已解析类型上有多个驱动程序时,这是正常和预期的行为。
看起来您希望每个FSM在{1}之间切换sync_sig
的状态。和&#39; 0&#39;。这可以通过在单独的过程中描述JK触发器来实现,其中每个FSM自己驱动设置和清除信号。这样做将消除多个驱动程序并允许FSM进行互操作。
为了避免将来摆脱此问题,请考虑使用未解析的std_ulogic
和std_ulogic_vector
。如果您错误地描述了多个驱动程序,则会出现编译器错误。已解决的类型实际上非常适合行为模拟和管理双向IO。他们应该从未成为&#34;默认&#34;对于整个设计的信号。