VHDL如果条件不能正常工作
我很难确定为什么我的代码不能正常工作。我正在尝试创建一个带有3位操作码的ALUVHDL如果条件不能正常工作,vhdl,Vhdl,我很难确定为什么我的代码不能正常工作。我正在尝试创建一个带有3位操作码的ALU 除了一个条件外,其他条件都不能正常工作;操作代码011(SEQ)。它的定义是如果(a==b)z下面是我对代码的问题: 就个人而言,我觉得在每个周期中,您都应该向结果、cout、和零输出一些内容。当前,您总是输出到零,但您只会有条件地输出到其他两个端口。这可能是在创建闩锁,而这可能不是您想要的。因此,例如,SCO操作也应该将某个内容推送到cout,并且SCO操作应该将某个内容推送到dummy\u result信号 您的
除了一个条件外,其他条件都不能正常工作;操作代码011(SEQ)。它的定义是如果(a==b)z下面是我对代码的问题: 就个人而言,我觉得在每个周期中,您都应该向
结果
、cout
、和零输出一些内容。当前,您总是输出到零
,但您只会有条件地输出到其他两个端口。这可能是在创建闩锁,而这可能不是您想要的。因此,例如,SCO操作也应该将某个内容推送到cout
,并且SCO操作应该将某个内容推送到dummy\u result
信号
您的减法实现无法按预期工作
when "110" => -- SUB
tmp_b <= NOT b;
carry := '1';
for i in 0 to 4 loop
dummy_result(i) <= carry XOR a(i) XOR tmp_b(i);
carry := (a(i) AND tmp_b(i)) OR (tmp_b(i) AND carry) OR (carry AND a(i));
end loop;
cout <= carry;
要回到原始问题,SEQ
,原始代码如下所示:
when op = "011" =>
if a = b then
dummy_result <= "00000";
end if;
当op=“011”=>
如果a=b,则
虚拟结果此处的目的是,除非另有指定,否则虚拟结果旨在保留先前的“结果”值。不幸的是,这个单元被实现为一个组合过程,没有时钟
因此,无法在该单元中可靠地实现存储。
因此,必须在本单元之外实施。
几乎可以肯定,它已经是了;在作为时钟进程实现的寄存器中
因此,将该寄存器的输出作为新的输入端口“prev_result”返回,并使用默认赋值作为伪_result。这将不仅克服到目前为止您发现的特定失败,还将克服“dummy_result”(还有另一个)的所有其他缺失赋值,以同步方式保留“result”的旧值
PROCESS (a, b, op, prev_result)
-- declarations here
BEGIN
-- default assignment
dummy_result <= prev_result;
if ALU_SELECT="11" THEN
if NEG_TSEL='0' THEN -- SEQ
if a = b THEN
dummy_result <="00000";
end if;
...
END PROCESS;
过程(a、b、op、上一个结果)
--这里的声明
开始
--默认分配
dummy_result@sharth,您的功能是正确的。我添加了ALU代码,这可能会回答一些问题。“我被告知不要使用缓冲区”。。。这种情况经常发生,但我要求你们找到一个理性和明智的解释,为什么不。。。另外,当a/=b时,在操作码011中应该发生什么?还要注意:在该分支中测试a=b两次,其中一个测试是多余的。对于a/=b,结果不应更改。从逻辑上讲,除了case语句的“others”之外,这些语句不一样吗?或者硬件使用会有所不同?我的理解是,如果不更改输出,则输出保持不变。这是一种糟糕的风格吗?我应该一直设置输出吗?在不更改实体定义的情况下,如何保存结果/伪结果?这是一种不符合时钟流程的错误样式。是的,“结果不应该改变”,但实现未锁定存储的硬件(锁存器)可能很麻烦,一些合成工具可能无法可靠地实现它。在模拟中,我希望“结果”不会改变,但当a和b的不同位以不同的速度变化时,a=b会发生什么?实体值不能改变(不幸的是)。我将此方法应用于cout和results,消除了闩锁警告。但是,为了保留最后一个值或输出结果没有任何变化,我是否仍然坚持使用锁存器?我只是有点困惑,在不推断无限循环的情况下,如何设置prev_结果。prev_结果必须来自时钟寄存器-您需要从外部将其引入,或者(淘气!ALU应该是组合的)引入时钟信号,以便在内部执行。无论哪种方式,实体都必须改变。如果失败,我会将(others=>'X')分配给prev_结果,这将确保任何使用不正确定义的信号的人都能在模拟中捕捉到它们。如果这是一个家庭作业或项目,我的建议是找一个更好的学校。。。
PROCESS (a, b, op)
VARIABLE carry: STD_LOGIC:='0';
BEGIN
case op is
when "011" => -- SEQ
dummy_result <= "00000";
when "111" => -- SCO
cout <= '1';
when "000" => -- AND
dummy_result <= a AND b;
...
when others =>
dummy_result <= "00000";
cout <= '0';
end case;
end process;
when op = "011" =>
if a = b then
dummy_result <= "00000";
end if;
PROCESS (a, b, op, prev_result)
-- declarations here
BEGIN
-- default assignment
dummy_result <= prev_result;
if ALU_SELECT="11" THEN
if NEG_TSEL='0' THEN -- SEQ
if a = b THEN
dummy_result <="00000";
end if;
...
END PROCESS;