如何使此VHDL代码可合成?
我有一段VHDL代码,它大量使用了fallowing语法:如何使此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
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;