Signals VHDL,错误消息;有多个驱动程序

Signals VHDL,错误消息;有多个驱动程序,signals,vhdl,lattice-diamond,synplify,Signals,Vhdl,Lattice Diamond,Synplify,我正在创建一个Alu,这是我的代码 library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity alu is port ( entrada: in std_logic_vector(11 downto 0); S: in std_logic_vector(3 downto 0); load : in std_logic; O: out std_logic_v

我正在创建一个Alu,这是我的代码

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity alu is port (
    entrada: in std_logic_vector(11 downto 0);
    S: in std_logic_vector(3 downto 0);
    load : in std_logic;
    O: out std_logic_vector(12 downto 0)
    );
end alu;

architecture arc_alu12 of alu is 
    
    component sumador12bits 
        port (a, b: in std_logic_vector(11 downto 0); c: out std_logic_vector(12 downto 0));
    end component;
    
    signal sa, sb, A, aux: std_logic_vector(11 downto 0):="000000000000";
    signal sr: std_logic_vector(12 downto 0);
    
begin

    guarda_registro: process (load) begin
        if load = '1' then
            A <= entrada;
        end if;
    end process;
    
    sss: sumador12bits port map(sa, sb, sr);
    
    selector: process(S) begin
        
        case S is
            when "0000" =>
                sa <= "0000"&A(7 downto 0);
                sb <= "0000"&entrada(7 downto 0);
            when "0001" => 
                sa <= "0000"&A(7 downto 0);
                aux <= "0000"&entrada(7 downto 0);
                sb<= (not aux)+1;
            when "0010" =>
                sa <= A;
                sb <= "000000000001";
            when "0011" =>
                sa <= A;
                sb <= "111111111111";
            when "0100" =>
                sa <= entrada;
                sb <= "000000000001";
            when "0101" =>
                sa <= entrada;
                sb <= "111111111111";
            when "0110" =>
                sa <= A;
                sb <= entrada;
            when "0111" => 
                sa<=A; 
                sb<= (not entrada)+1; 
            when "1000" =>
                sr <= '0'&(A and entrada);
            when "1001" =>
                sr <= '0'&(A or entrada);
            when "1010" =>
                sr <= '0'&(A xor entrada);
            when "1011" => 
                sr <= '1'&not A;
            when "1100" =>
                sa <= not A;
                sb <= "000000000001";
            when others => sr<= "0000000000000";
        end case;
        
    end process;
    
    O <= sr;

end arc_alu12;
ieee库;
使用ieee.std_logic_1164.all;
使用ieee.std_logic_unsigned.all;
实体alu是端口(
entrada:标准逻辑向量(11到0);
S:标准逻辑向量(3到0);
负载:在标准逻辑中;
输出标准逻辑向量(12到0)
);
末端alu;
alu的架构arc_alu12是
组件12位
端口(a,b:标准逻辑向量内(11向下至0);c:标准逻辑向量外(12向下至0));
端部元件;
信号sa、sb、A、aux:std_逻辑_向量(11向下至0):=“000000000000”;
信号sr:std_逻辑_向量(12向下至0);
开始
guarda_注册表:进程(加载)开始
如果加载='1',则
A.

sa信号“sr”连接到“sumador12bits”的输出端口,您也可以在“选择器”过程中使用该信号进行赋值。这是一个信号的多个驱动

Stackoverflow上的搜索项将是[vhdl]多个驱动程序。你会对你的发现感到惊讶。这里提供一个显示所有驱动程序的示例。进程选择器中有sr的驱动程序,实例化的sumador12位标记为sss,这是您没有提供的源。在VHDL中,解析类型(std_逻辑、std_逻辑向量)具有多个驱动程序是完全合法的。一般来说,在FPGA合成中是不合法的(可以有规则来推断多路复用器,而你没有规则)。在一个进程中发生的每个信号分配都会创建一个驱动程序。分配信号的并发语句可用于复杂的进程。解析类型的网络的值由解析确定。对于FPGA合成,仅允许特定设备的引脚和工具从内部网络推断多路复用器,内部网络只有一个驱动器提供逻辑值,其他驱动器驱动“Z”(高阻抗)。每一次使用都应该看到来自单个进程的信号,这是一个综合需求,而不是VHDL语言本身的一部分。