gpt4 book ai didi

vhdl - 我怎样才能使这个 VHDL 代码可综合?

转载 作者:行者123 更新时间:2023-12-04 05:06:22 25 4
gpt4 key购买 nike

我有 VHDL 代码,它使用了随意的语法:

     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;

哪里 cau_state是保持当前状态的信号。这种语法在 Model-Sim 上的模拟中有效,一切正常。但是当我想将代码刻录到 FPGA 时,代码没有在 Altera Quartus II 32 位版本上合成。 12.1 我收到了以下错误消息:
Warning (13012): Latch CAU:uut|cross_3_sig[0][31] has unsafe behavior
Warning (13013): Ports D and ENA on the latch are fed by the same signal CAU:uut|cau_state.st_cycle_2
Warning (13012): Latch CAU:uut|cross_3_sig[0][30] has unsafe behavior
Warning (13013): Ports D and ENA on the latch are fed by the same signal CAU:uut|cau_state.st_cycle_2

我收到许多信号的这些消息,但是 不是 对于所有使用此语法的信号。对于收到这条消息的信号,我得到了它的所有位: cross_3_sig[0][31]cross_3_sig[0][0] .信号的语法 cross_3_sig(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);

还有一些地方我分配了 cross_3_sig(0)进入其他信号,即:
numer_sig           <= C_ZERO - cross_3_sig(0) & (16 downto 0 => '0'); 
mult1_in2_sig <= (others => '0') when cau_state = st_idle else
...
cross_3_sig(0) when cau_state = st_cycle_11 else
...

有什么问题,我该如何解决?

最佳答案

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

 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;

记住信号 1 旧值的正确方法是计时过程,例如
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;

如果没有赋值,signal_1 将保持其当前值。

或者更好的选择:在过程中使用 case 语句:
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;

这确实改变了时钟设计的语义,但至少可以说,非时钟设计在 FPGA 中很麻烦!

关于vhdl - 我怎样才能使这个 VHDL 代码可综合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15500510/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com