unit filter(4) 中的 VHDL Signal Output[3] 连接到以下多个驱动程序:

VHDL Signal Output[3] in unit filter(4) is connected to following multiple drivers:

我有一个并发循环,它有两个错误。这是文件中唯一的代码: 我收到以下错误。我将不胜感激你的帮助。我该如何解决这个问题?

单元过滤器(4) 中的信号输出1 连接到以下多个驱动程序:

unit filter(4) 中的信号标志连接到以下多个驱动程序:


根据 OP EDAPlayground link

创建的最小完整且可验证的示例
library ieee;
use ieee.std_logic_1164.all;
-- use IEEE.STD_LOGIC_ARITH.ALL;
-- use IEEE.std_logic_unsigned.ALL ;

entity ex_case is
    port ( output: out std_ulogic_vector(3 downto 0) );
end entity ex_case;
    -- signal flag1: boolean := '0'; -- this declaration does not belong here
architecture a1 of ex_case is
    signal flag1: std_ulogic := '0';  -- was erroneously type boolean
begin

loop1: 
    for j in 0 to 3 generate -- for loop outputting data
        flag1 <= '0';        -- reset the flag, same as output_ready
loop2: 
        for i in 0 to 3 generate 
            output(j) <= '1' when  i >= j and flag1 = '0' else 
                         '0' when flag1 = '0';
            flag1 <=     '1' when  i >= j and flag1 = '0'; -- output when valid data is available
        end generate loop2;
    end generate loop1;   
end architecture a1;

注意:flag1 和输出的类型都更改为未解析的类型,以允许显示两个算法错误。


这是错误信息:

输出上存在推断锁存器问题。这是由 并发信号分配中存在的条件,并在综合中报告。我们想避免闩锁。

因此,通过一个最小的、完整的和可验证的示例,我们可以修改该示例,为嵌套的 for generate 语句(14.5.5 其他并发)生成的所有进程中的所有 flag1 驱动程序提供组合或语句所有并发信号赋值语句和并发断言语句的详细说明包括等效过程语句的构造,然后是等效过程语句的详细说明。)。

我们还想提供一个选择器来指定指定的 output(j) 生成循环语句的外部和内部哪个有助于 output:

library ieee;
use ieee.std_logic_1164.all;

entity ex_case is
    port ( output: out std_ulogic_vector(3 downto 0) );
end entity ex_case;
architecture foo of ex_case is
    signal flag1: std_ulogic := '0';
    constant n: natural := 4;
    function reduce_or (input: std_logic_vector) return std_logic is
        variable retval: std_logic;
    begin  -- MAY BE replace by "or" -2008, or by different reduction function
        retval := '0';
        for i in input'range loop
            retval := retval or input(i);
        end loop;
        return retval;
    end function;
    function firstflag (iflag: std_logic_vector) return integer is
    begin
        for i in iflag'range loop
            if To_bit(iflag(i)) = '1' then
                return i;
            end if;
        end loop;
        return iflag'LEFT; -- This will park on iflag' when no flag is set
    end function;
    signal iflag: std_logic_vector(0 to n - 1);
    subtype iflag_subtype is std_logic_vector(iflag'range);
begin

loop1: 
    for j in 0 to n - 1 generate 
        type output_array is array (0 to n - 1) of std_logic;
        signal ioutput: output_array;
        signal jselect: natural range 0 to n - 1;
    begin
        -- flag1 <= '0'; -- REMOVED  -- reset the flag, same as output_ready
loop2: 
        for i in 0 to n - 1 generate 
            signal iflag: std_logic_vector (0 to n - 1);
        begin
            ioutput(j) <= '1' when  i >= j and iflag(j) = '0' else 
                          '0';
            iflag(i) <=  '1' when  i >= j else 
                         '0'; -- output when valid data is available
            iflag(j) <= reduce_or(iflag);
        end generate loop2;
        output(j) <= ioutput(firstflag(iflag)); -- A Multiplexer
    end generate loop1;  

    flag1 <= '1' when iflag /= iflag_subtype'(others => '0') else
             '0'; 
end architecture foo;

这分析、阐述和模拟(虽然没有做任何令人印象深刻的事情,但证明任何特定输出只有一个来源)。

请注意,您可以将输出切换回 std_logic_vector 类型,同时添加您的 n x n 交换机输出端口的地址作为分配标志和输出为“1”的条件。

您可能会想象,根据您可用的包或您的工具链支持的 VHDL 标准的修订版,有可能消除函数 reduce_or,而不是使用预先存在的函数或一元函数 "or" 运算符 (-2008).

如果不将输出端口的地址也作为条件,则无法彻底测试此示例。