如何使此VHDL代码可合成?

如何使此VHDL代码可合成?,vhdl,Vhdl,我有一段VHDL代码,它大量使用了fallowing语法: signal_1 <= (others => '0') when cau_state = st_idle else signal_2 - signal_3 when cau_state = st_cycle_1 else signal_4 when cau_state = st_cycle

我有一段VHDL代码,它大量使用了fallowing语法:

     signal_1   <= (others => '0')     when cau_state = st_idle       else
                  signal_2 - signal_3  when cau_state = st_cycle_1    else
                  signal_4             when cau_state = st_cycle_2    else
                  signal_5             when cau_state = st_cycle_3    else
                  signal_6             when cau_state = st_cycle_4    else
                  signal_1;
对于许多信号,我都会收到这些消息,但对于使用此语法的所有信号,不是。对于得到这个消息的信号,我得到它的所有比特:
cross\u3\usig[0][31]
cross\u3\usig[0][0]
。信号
交叉信号(0)
的语法为:

constant WIDTH          : integer := 32;
...
subtype scalar          is std_logic_vector((WIDTH-1) downto 0);                                  
type    vector_nd       is array (natural range <>) of scalar;
subtype vector_3d       is vector_nd(2 downto 0);
...
signal cross_3_sig          : vector_3d;
...
cross_3_sig(0)      <= sum_mults_out_sig              when cau_state = st_cycle_2  else              
                       mult1_out_sig - mult2_out_sig  when cau_state = st_cycle_9  else                          
                       cross_3_sig(0); 

问题是什么?我如何解决它?

问题是,这种形式的表达式创建了一个锁存器(对其控制信号的故障非常敏感),而且它是一个具有多个控制信号的锁存器,在实际硬件中没有直接的等效物

 signal_1   <= (others => '0')     when cau_state = st_idle       else
              ...
              signal_6             when cau_state = st_cycle_4    else
              signal_1;
当cau状态=st\U空闲时,
signal\u 1'0')
...
当cau状态=st循环4时发出信号
信号_1;
任何时候你看到(在一个时钟进程之外)像

signal_1   <= ... else signal_1;

signal\u 1我所做的是在所有
when
语句中添加
和上升沿(CLK)
,这样当cau\u state=st\u idle和上升沿(CLK)else signal\u 1时它看起来像:
signal\u 1'0')
这与将其放入流程和案例中相同吗?如果它可以工作并且sim和synth都支持它,是的,我相信是这样。此外,如果您的工具支持VHDL-2008,我还欠“sharth”一个道歉——您现在可以在流程中使用条件赋值样式了!可以说我是恐龙,但我(像很多工具一样)仍然不知道VHDL-2008的全部内容。致“sharth”:如果你取消删除你的答案,我将投票表决。。。
 signal_1   <= (others => '0')     when cau_state = st_idle       else
              ...
              signal_6             when cau_state = st_cycle_4    else
              signal_1;
signal_1   <= ... else signal_1;
output_1 <= input_1 when ... else
            input_2 when ... else
            input_n;
process (clk)
begin
    if rising_edge(clk) then
        if    cau_state = st_idle    then signal_1   <= (others => '0') 
        ...
        elsif cau_state = st_cycle_4 then signal_1  <= signal_6;
        end if;
    end if;
end process;
process (clk)
begin
    if rising_edge(clk) then
        case cau_state is
           when st_idle    => signal_1   <= (others => '0') 
           ...
           when st_cycle_4 => signal_1  <= signal_6;
           -- when others => some default action
        end case;
    end if;
end process;