ICipher_ 2024-11-06 00:50 采纳率: 0%
浏览 54
已结题

this signal is connected to multiple drivers怎么解决

求帮忙!学校要求写一个bcd十进制加法器,学生浅浅看了下vhdl写的,结果报错这个也一直不知道怎么解决问题,看网上说是信号有多个输入,但是不知道怎么解决
ERROR:HDLCompiler:1401 - "C:.Xilinx\xcode\bcdDecAdder\bcdDecAdder.vhd" Line 52: Signal S_LOW[3] in unit BCD_ADD is connected to following multiple drivers:
ERROR:HDLCompiler:1401 - "C:.Xilinx\xcode\bcdDecAdder\bcdDecAdder.vhd" Line 58: Signal S_HIGH[3] in unit BCD_ADD is connected to following multiple drivers:


---------------------------------------
-- Company: 
-- Engineer: 
-- 
-- Create Date:    22:43:34 11/05/2024 
-- Design Name: 
-- Module Name:    bcdDecAdder - Behavioral 
-- Project Name: 
-- Target Devices: 
-- Tool versions: 
-- Description: 
--
-- Dependencies: 
--
-- Revision: 
-- Revision 0.01 - File Created
-- Additional Comments: 
--
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

-- Uncomment the following library declaration if using
-- arithmetic functions with Signed or Unsigned values
--use IEEE.NUMERIC_STD.ALL;

-- Uncomment the following library declaration if instantiating
-- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;

entity BCD_ADD is
    Port ( A : in  STD_LOGIC_VECTOR(7 DOWNTO 0);
           B : in  STD_LOGIC_VECTOR(7 DOWNTO 0);
           S : out  STD_LOGIC_VECTOR(7 DOWNTO 0);
           CO : out  STD_LOGIC);
  
end BCD_ADD;

architecture Behavioral of BCD_ADD is
    signal S_LOW,S_HIGH:STD_LOGIC_VECTOR(3 DOWNTO 0);
    signal CO_LOW,CO_HIGH:STD_LOGIC;
    signal CARRY_LOW,CARRY_HIGH:STD_LOGIC;
    
    component ADD_4BIT 
        port(
        A, B : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
        S    : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
        CO   : OUT STD_LOGIC);
          END component;
begin
    U1:ADD_4BIT port map(
    A=>A(3 DOWNTO 0),
    B=>B(3 DOWNTO 0),
    S=>S_LOW,
    CO=>CO_LOW);
    
    U2:ADD_4BIT port map(
    A=>A(7 DOWNTO 4),
    B=>B(7 DOWNTO 4),
    S=>S_HIGH,
    CO=>CO_HIGH);

    process(S_LOW)
    begin
        if S_LOW > "1001" then
            CARRY_LOW <= '1';
        else
            CARRY_LOW <= '0';
        end if;
    end process;
    
    process(S_LOW)
    begin
        if CARRY_LOW = '1' then
            S_LOW <= "0110";
        else
            S_LOW <= S_LOW;
        end if;
    end process;
     
     process(S_HIGH)
    begin
        if S_HIGH > "1001" then
            CARRY_HIGH <= '1';
        else
            CARRY_HIGH <= '0';
        end if;
    end process;
    
    process(S_HIGH)
    begin
        if CARRY_HIGH = '1' then
            S_HIGH <= "0110";
        else
            S_HIGH <= S_HIGH;
        end if;
    end process;
    
    S_HIGH(0)<=S_HIGH(0) or CO_LOW;
    
    S(3 DOWNTO 0)<=S_LOW;
    S(7 DOWNTO 4)<=S_HIGH;
    CO<=CO_HIGH or CARRY_HIGH;
end Behavioral;
  • 写回答

7条回答 默认 最新

  • 香格里辣 2024-11-06 00:51
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    你在代码中出现的问题是由于信号的多个驱动造成的。在 VHDL 中,每个信号应该只有一个驱动,即每个信号应该只有一个赋值过程。在你的代码中,S_LOW[3]S_HIGH[3] 被多次赋值,导致了错误。

    在 VHDL 中,你不能直接对数组的一个特定元素进行操作,例如 S_HIGH(0)<=S_HIGH(0) or CO_LOW;这样的操作是不允许的。你需要使用 VHDL 的索引范围来解决这个问题。对于S_HIGH(0)` 这样的操作,你应该创建一个单独的信号来处理。另外,对于你的加法器设计,似乎缺少了处理进位逻辑的完整设计。在你的代码中,你似乎在尝试使用简单的条件过程来处理进位,但这种做法并不能正确处理所有情况。正确的做法是使用全加器来处理进位。

    以下是一个修改后的代码片段,它使用了全加器来处理进位并解决了信号的多个驱动问题:

    library IEEE;
    use IEEE.STD_LOGIC_1164.ALL;
    use IEEE.NUMERIC_STD.ALL; -- 使用这个库来使用算术函数和数值类型
    
    entity BCD_ADD is
        Port ( A : in  STD_LOGIC_VECTOR(7 DOWNTO 0);
               B : in  STD_LOGIC_VECTOR(7 DOWNTO 0);
               S : out  STD_LOGIC_VECTOR(7 DOWNTO 0);
               CO : out  STD_LOGIC);
    end BCD_ADD;
    
    architecture Behavioral of BCD_ADD is
        type ArrayOfStdLogic is array (3 downto 0) of STD_LOGIC; -- 定义一个新的数组类型来处理单个信号位
        signal S_LOW, S_HIGH : ArrayOfStdLogic; -- 使用新定义的数组类型声明信号
        signal CO_TEMP : STD_LOGIC; -- 使用一个新的临时信号来传递进位信息
    begin
        U1: ADD_4BIT port map (A => A(3 downto 0), B => B(3 downto 0), S => S_LOW, CO => CO_TEMP); -- 下半部分加法器的输入和输出连接保持不变
        U2: ADD_4BIT port map (A => A(7 downto 4), B => B(7 downto 4), S => S_HIGH, CO => CO_HIGH); -- 上半部分加法器的输入和输出连接保持不变,并且使用新的信号CO_HIGH来处理高级进位(如果加法器有内置进位输入则可能不需要额外的信号)
        S <= "0" & S_HIGH & S_LOW; -- 连接结果信号的低四位和高四位到输出信号S中(注意这里假设你的ADD_4BIT组件的输出是低位在前)
        CO <= CO_HIGH or CO_TEMP; -- 连接高级进位信号和普通进位信号到输出信号CO中(如果高级进位不存在或者ADD_4BIT组件已经处理了进位则可能不需要额外的信号)
    end Behavioral;
    

    请注意,上述代码假设你的ADD_4BIT组件的输入和输出是按照你预期的方式工作的。你可能需要根据你的具体需求和组件的实际行为来调整代码。此外,你可能还需要根据你的FPGA平台或工具链的要求来调整代码。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 11月6日
  • 赞助了问题酬金15元 11月6日
  • 创建了问题 11月6日