Vhdl 端口映射一个模块中的两个模块时出现问题

Vhdl 端口映射一个模块中的两个模块时出现问题,vhdl,Vhdl,这是我的16位MIPS的一个控制单元,我试图将alucontrol连接到alu单元操作码,但由于它是一个输出,而alu单元操作码是一个输入,所以我使用了一个信号操作信号,代码没有语法错误,但显示了我在下面提到的警告 我是一个新手,我不知道如何连接我的控制单元,即使我真的连接它。 如果我没有使用funct,A和B,那么它将以相同的逻辑运行,对吗?我在端口图中提到了这些输入和输出,但它显示了错误,因为它们是开放端口。使用“open”并没有解决问题,所以我只是删除了它们,这会影响我的代码吗?警告太多了

这是我的16位MIPS的一个控制单元,我试图将alucontrol连接到alu单元操作码,但由于它是一个输出,而alu单元操作码是一个输入,所以我使用了一个信号操作信号,代码没有语法错误,但显示了我在下面提到的警告

我是一个新手,我不知道如何连接我的控制单元,即使我真的连接它。 如果我没有使用funct,A和B,那么它将以相同的逻辑运行,对吗?我在端口图中提到了这些输入和输出,但它显示了错误,因为它们是开放端口。使用“open”并没有解决问题,所以我只是删除了它们,这会影响我的代码吗?警告太多了。我只是不知道如何解决它们

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity controlunit is 
  Port ( opcode : in  STD_LOGIC_VECTOR (2 downto 0);
         --zero : in  STD_LOGIC;
         w_en : out  STD_LOGIC;
         regdst : out  STD_LOGIC;
         alusrc : out  STD_LOGIC;
         --branch : out  STD_LOGIC;
         memwrite : out  STD_LOGIC;
         memtoreg : out  STD_LOGIC;
         alucontrol : out  STD_LOGIC_VECTOR (1 downto 0);
         pcsrc : out  STD_LOGIC);
end controlunit;

architecture Behavioral of controlunit is

  component maindecoder is
    Port ( opcode : in  STD_LOGIC_VECTOR (2 downto 0);
           w_en : out  STD_LOGIC;
           regdst : out  STD_LOGIC;
           alusrc : out  STD_LOGIC;
           branch : out  STD_LOGIC;
           memwrite : out  STD_LOGIC;
           memtoreg : out  STD_LOGIC
           --aluop : out  STD_LOGIC_VECTOR (1 downto 0)
         );
  end component;

  component alu is
    Port ( --clk: in STD_LOGIC;
           --A : in  STD_LOGIC_VECTOR (15 downto 0);
           --B : in  STD_LOGIC_VECTOR (15 downto 0);
           --funct: in STD_LOGIC;
           op: in STD_LOGIC_VECTOR (1 downto 0);
           zero  : out std_logic;
           Result : out  STD_LOGIC_VECTOR (15 downto 0));    
  end component;

  --signal alusig: STD_LOGIC_VECTOR (1 downto 0);
  signal opsignal: STD_LOGIC_VECTOR (1 downto 0);
  signal branch: STD_LOGIC;
  signal zero: STD_logic;

begin

  -- instantiate maindecoder
  decoder: maindecoder port map (opcode => opcode, w_en => w_en,
           regdst => regdst, alusrc => alusrc, branch => branch, memwrite => memwrite, memtoreg => memtoreg);

  aluunit: alu port map (op => opsignal, zero => zero);

  alucontrol <= opsignal;

  pcsrc <= branch and zero;

end Behavioral;


WARNING:Xst:753 - "E:/Xilinx Projects/controlunit/controlunit.vhd" line 46: Unconnected output port 'aluop' of component 'maindecoder'.
WARNING:Xst:753 - "E:/Xilinx Projects/controlunit/controlunit.vhd" line 49: Unconnected output port 'Result' of component 'alu'.
WARNING:Xst:752 - "E:/Xilinx Projects/controlunit/controlunit.vhd" line 49: Unconnected input port 'clk' of component 'alu' is tied to default value.
WARNING:Xst:752 - "E:/Xilinx Projects/controlunit/controlunit.vhd" line 49: Unconnected input port 'A' of component 'alu' is tied to default value.
WARNING:Xst:752 - "E:/Xilinx Projects/controlunit/controlunit.vhd" line 49: Unconnected input port 'B' of component 'alu' is tied to default value. 
WARNING:Xst:752 - "E:/Xilinx Projects/controlunit/controlunit.vhd" line 49: Unconnected input port 'funct' of component 'alu' is tied to default value.
WARNING:Xst:653 - Signal <opsignal> is used but never assigned. This sourceless signal will be automatically connected to value 00.
WARNING:Xst:1290 - Hierarchical block <aluunit> is unconnected in block <controlunit>. It will be removed from the design.
IEEE库;
使用IEEE.STD_LOGIC_1164.ALL;
使用IEEE.NUMERIC_STD.ALL;
实体控制单元为
端口(操作码:标准逻辑向量(2到0);
--零:在标准逻辑中;
w_en:输出标准逻辑;
regdst:输出标准逻辑;
alusrc:输出标准逻辑;
--分支:输出标准逻辑;
memwrite:输出标准逻辑;
memtoreg:输出标准逻辑;
alucontrol:输出标准逻辑向量(1到0);
pcsrc:输出标准逻辑);
终端控制单元;
控制单元的体系结构是
组件主解码器是
端口(操作码:标准逻辑向量(2到0);
w_en:输出标准逻辑;
regdst:输出标准逻辑;
alusrc:输出标准逻辑;
分支:输出标准逻辑;
memwrite:输出标准逻辑;
memtoreg:输出标准逻辑
--ALOUP:out标准逻辑向量(1到0)
);
端部元件;
组件alu为
端口(--clk:标准逻辑中;
--A:标准逻辑向量(15到0);
--B:标准逻辑向量(15到0);
--功能:在标准逻辑中;
op:标准逻辑向量(1到0);
零:输出标准逻辑;
结果:输出标准逻辑向量(15到0);
端部元件;
--信号alusig:STD_逻辑_向量(1到0);
信号opsignal:STD_逻辑_向量(1到0);
信号支路:标准逻辑;
信号零:标准逻辑;
开始
--实例化主解码器
解码器:主解码器端口映射(操作码=>操作码,w_-en=>w_-en,
regdst=>regdst,alusrc=>alusrc,branch=>branch,memwrite=>memwrite,memtoreg=>memtoreg);
aluunit:alu端口映射(op=>opsignal,zero=>zero);
alucontrol
警告:Xst:753-“E:/Xilinx Projects/controlunit/controlunit.vhd”第46行:组件“maindecoder”的未连接输出端口“aluop”

这里的问题正是它所说的(您未连接输出,这不是错误),但它与更严重的错误有关:

警告:Xst:653-已使用信号,但从未分配。该无源信号将自动连接到值00

您可能想将
opsignal
映射到
maindecoder
上的
aluop
输出

警告:Xst:753-“E:/Xilinx Projects/controlunit/controlunit.vhd”第49行:组件“alu”的未连接输出端口“Result”

再说一次,完全是它说的。是否确实不想连接
结果

其余的错误表明您还有其他一些相当严重的问题,即,您留下了一堆未连接的输入—您在
alu
的组件声明中注释掉了一堆端口,但没有映射它们。为什么?请注意,这些端口对于
alu
的操作非常关键-如果没有至少一些端口,它实际上不会做任何事情

(编辑)

回复:您的评论“我使用了信号,因为我无法将输出映射到输入。”:


op
alu
的一个输入,因为
alu
以某种方式“读取”它
alu
不会生成该值或驱动该端口-它必须来自其他地方,可能在您发布的代码之外。因此,试图从
alu
中获取其值是毫无意义的。您需要确定该控件的源是什么。如果它是
maindecoder
,那么您可以从该组件的输出合成它,但我不确定这是否是您所需要的。

这些消息中的大多数都会告诉您,端口未连接。您可能还需要确保实体
maindecorder
alu
的端口列表与此处的组件声明一致。是的,我故意留下它们,因为我不需要它们。当我包含它们时,我得到了一个错误,比如端口A需要一个默认值之类的。所以我把它拿走了。你知道如何解决这个问题吗?我应该发布alu和解码器的代码吗?至少发布实体定义。其中一个警告已经从您在这里发布的内容中清晰可见,尽管-
Result
alu
上的一个端口,但您没有映射它(这可能是您想要的,但这就是您得到警告的原因)。好的,我将发布整个内容。@fru1tbat,你去吧,伙计!我只想解释一下我在这里要做什么,我的控制端口的最后两位决定了我需要执行哪个alu函数,这些位应该映射到我的alu的操作码。基本上,我正在设计一个控制单元,alucontrol是这个控制单元的输出,它需要与我的控制端口的最后两位进行映射。我使用了一个信号,因为我无法将输出映射到输入。我确实需要这个alu的全部功能,如果我只是映射op,我的代码会不工作吗?
alu
代码显示
zero
a
B
的函数<代码>结果也取决于
clk
和(部分)
funct
。当您在
controlunit
内部实例化
alu
时,您需要提供
alu
所需的输入作为
controlunit   library IEEE;
   use IEEE.STD_LOGIC_1164.ALL;
   use IEEE.std_logic_unsigned.all;
   use ieee.std_logic_arith.all;

  entity alu is 
  Port ( clk: in STD_LOGIC;
          A : in  STD_LOGIC_VECTOR (15 downto 0);
       B : in  STD_LOGIC_VECTOR (15 downto 0);
          funct: in STD_LOGIC;
          op: in STD_LOGIC_VECTOR (1 downto 0);
          zero  : out std_logic;
       Result : out  STD_LOGIC_VECTOR (15 downto 0));

  end alu;

  architecture Behavioral of alu is
begin
 process (clk, op, funct, A, B)
 begin
  if (clk'event and clk = '1') then
    case op is
        when "00" => Result <= A+B;
        when "01" => Result <= A-B;
        when "10" => case funct is 
                        when '0' => Result <= A+B;
                        when '1' => Result <= A-B;
                        when others => null;
                        end case;
        when others => null;
    end case;
    end if;
end process;
    process (A,B) begin
        if (A = B) then
        zero <= '1';
        else zero <= '0';
        end if;
    end process;
   end;
   ibrary IEEE;
   use IEEE.STD_LOGIC_1164.ALL;
   use IEEE.NUMERIC_STD.ALL;

   entity maindecoder is
   Port ( opcode : in  STD_LOGIC_VECTOR (2 downto 0);
       w_en : out  STD_LOGIC;
       regdst : out  STD_LOGIC;
       alusrc : out  STD_LOGIC;
       branch : out  STD_LOGIC;
       memwrite : out  STD_LOGIC;
       memtoreg : out  STD_LOGIC;
       aluop : out  STD_LOGIC_VECTOR (1 downto 0));
  end maindecoder;

  architecture Behavioral of maindecoder is
  signal control: std_logic_vector (7 downto 0);
  begin
    process (opcode)
begin
    case opcode is
        when "000" => control <= "11000010"; -- R-type
        when "001" => control <= "10100100"; --lw
        when "010" => control <= "00101000"; --sw
        when "011" => control <= "00010001";--beq
        when others => control<= "--------";        --illegal opcode
    end case;
end process;

w_en    <= control(7);
regdst  <= control(6);
alusrc  <= control(5);
branch  <= control(4);
memwrite <= control(3);
memtoreg <= control(2);
aluop       <= control(1 downto 0);

   end Behavioral;