Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VHDL如果条件不能正常工作_Vhdl - Fatal编程技术网

VHDL如果条件不能正常工作

VHDL如果条件不能正常工作,vhdl,Vhdl,我很难确定为什么我的代码不能正常工作。我正在尝试创建一个带有3位操作码的ALU 除了一个条件外,其他条件都不能正常工作;操作代码011(SEQ)。它的定义是如果(a==b)z下面是我对代码的问题: 就个人而言,我觉得在每个周期中,您都应该向结果、cout、和零输出一些内容。当前,您总是输出到零,但您只会有条件地输出到其他两个端口。这可能是在创建闩锁,而这可能不是您想要的。因此,例如,SCO操作也应该将某个内容推送到cout,并且SCO操作应该将某个内容推送到dummy\u result信号 您的

我很难确定为什么我的代码不能正常工作。我正在尝试创建一个带有3位操作码的ALU


除了一个条件外,其他条件都不能正常工作;操作代码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;