VHDL:几个';和';逻辑在';如果';失败 IEEE库; 使用IEEE.STD_LOGIC_1164.ALL; 使用IEEE.STD_LOGIC_UNSIGNED.ALL; 使用ieee.std_logic_arith.
VHDL:几个';和';逻辑在';如果';失败VHDL:几个';和';逻辑在';如果';失败 IEEE库; 使用IEEE.STD_LOGIC_1164.ALL; 使用IEEE.STD_LOGIC_UNSIGNED.ALL; 使用ieee.std_logic_arith.,vhdl,Vhdl,VHDL:几个';和';逻辑在';如果';失败 IEEE库; 使用IEEE.STD_LOGIC_1164.ALL; 使用IEEE.STD_LOGIC_UNSIGNED.ALL; 使用ieee.std_logic_arith.all; 实体危险单元为 港口( BranchD:标准逻辑; RsD:标准逻辑向量(4到0); RtD:标准逻辑向量(4到0); RsE:标准逻辑向量(4到0); RtE:标准逻辑向量(4到0); 写入记录:在标准逻辑向量中(4到0); 记忆记
IEEE库;
使用IEEE.STD_LOGIC_1164.ALL;
使用IEEE.STD_LOGIC_UNSIGNED.ALL;
使用ieee.std_logic_arith.all;
实体危险单元为
港口(
BranchD:标准逻辑;
RsD:标准逻辑向量(4到0);
RtD:标准逻辑向量(4到0);
RsE:标准逻辑向量(4到0);
RtE:标准逻辑向量(4到0);
写入记录:在标准逻辑向量中(4到0);
记忆记忆:在标准逻辑中;
RegWriteE:标准逻辑中;
WriteRegM:标准逻辑向量(4到0);
RegWriteM:标准逻辑中;
WriteRegW:标准逻辑向量(4到0);
RegWriteW:标准逻辑中;
StallF:输出标准逻辑;
暂停:输出标准逻辑;
ForwardAD:输出标准逻辑;
FlushE:输出标准逻辑;
ForwardAE:输出标准逻辑向量(1到0);
ForwardBE:out标准逻辑向量(1到0)
);
终端单元;
危险单元的架构是
信号lwstall:std_逻辑:='0';
信号分支安装:标准逻辑:='0';
开始
流程(BranchD、RsD、RtD、RsE、RtE、WriterEdge、MemtorEdge、RegWriteEE、WriteRegM、RegWriteEM、WriteRegW、RegWriteW)
开始
-----------转发:前一个目标与下一个源匹配--------------------
如果(RsE/=“00000”且RsE=WriteRegM和RegWriteM),则
在七个这样的错误中,前四个出现是因为条件(对于if语句)必须计算为布尔值,没有使用返回布尔值的std_逻辑和布尔操作数定义的“和”运算符。最后三个值对布尔操作数求值,并应返回一个std_逻辑(std_ulogic)值,同样没有定义。前四个问题可以通过将RegWriteM
更改为RegWriteM='1'
来解决。其余三个需要if语句(或条件信号分配,在这种情况下,您不应该使用Synopsys软件包(-2008))。小心初始化信号:signal lwstall:std_logic:=“0”;信号分支安装:标准逻辑:='0'代码>。初始值将被您的逻辑合成器忽略,因此您的门将与您的模拟不匹配。您的设计不应依赖于信号的初始化。我还注意到您在此处驾驶lwstall
:lwstall@MatthewTaylor至少有一些FPGA合成器可以正确处理初始信号值,例如Vivado、ISE和Quartus。@MatthewTaylor这就是我通常不喜欢信号初始化的原因。您必须小心初始化哪个信号,因为它们可能被初始化,也可能没有被初始化(取决于信号是否被注册)。很容易迷失方向。这会导致模拟/硬件不匹配。此外,初始化会隐藏未驱动信号的问题。我更喜欢在模拟中看到“U”的传播,这比配置后的初始值更有价值。
Library IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
use ieee.std_logic_arith.all;
ENTITY hazard_unit IS
PORT(
BranchD:in std_logic;
RsD:in std_logic_vector(4 downto 0);
RtD:in std_logic_vector(4 downto 0);
RsE:in std_logic_vector(4 downto 0);
RtE:in std_logic_vector(4 downto 0);
WriteRegE:in std_logic_vector(4 downto 0);
MemtoRegE:in std_logic;
RegWriteE:in std_logic;
WriteRegM:in std_logic_vector(4 downto 0);
RegWriteM:in std_logic;
WriteRegW:in std_logic_vector(4 downto 0);
RegWriteW:in std_logic;
StallF:out std_logic;
StallD:out std_logic;
ForwardAD:out std_logic;
FlushE:out std_logic;
ForwardAE:out std_logic_vector(1 downto 0);
ForwardBE:out std_logic_vector(1 downto 0)
);
END hazard_unit;
ARCHITECTURE behavioral OF hazard_unit IS
signal lwstall:std_logic:='0';
signal branchstall:std_logic:='0';
begin
process(BranchD,RsD,RtD,RsE,RtE,WriteRegE,MemtoRegE,RegWriteE,WriteRegM,RegWriteM,WriteRegW,RegWriteW)
begin
-----------Forwarding: former destination matches next source rs--------------------
if (RsE/="00000" and RsE=WriteRegM and RegWriteM) then
ForwardAE<="10";
elsif ((RsE/="00000") and (RsE=WriteRegW) and RegWriteW) then
ForwardAE<="01";
else
ForwardAE<="00";
end if;
-----------Forwarding: former destination matches next source rt---------------------
if ((RtE/="00000") and (RtE=WriteRegM) and RegWriteM) then
ForwardBE<="10";
elsif ((RtE/="00000") and (RtE=WriteRegW) and RegWriteW) then
ForwardBE<="01";
else
ForwardBE<="00";
end if;
----------LW Stall: lw instrucion's destination register RtE matches source register RsD, RtD---------------------
lwstall<=((RsD=RtE) or (RtD=RtE)) and MemtoRegE;
----------Control hazard: Forwarding when result of ALU in the mem stage
ForwardAD<=(RsD/=0) and (RsD=WriteRegM) and RegWriteM;
----------Control hazard: Stall when result of ALU in the exe stage
branchstall<=(BranchD and RegWriteE and (WriteRegE=RsD or WriteRegE=RtD)) or (BranchD and MemtoRegM and (WriteRegM=RsD or WriteRegM=RtD));
StallF<=lwstall or branchstall;
StallD<=lwstall or branchstall;
FlushE<=lwstall or branchstall;
end process;
end hazard_unit;