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