首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >16位ALU总是导致0。

16位ALU总是导致0。
EN

Stack Overflow用户
提问于 2021-05-13 13:10:12
回答 1查看 91关注 0票数 1
代码语言:javascript
复制
always @* begin
if (SEL == 3'b000)
    ALU_OUT = A + B;
if (SEL == 3'b001)
    ALU_OUT = A - B;
if (SEL == 3'b010)
    ALU_OUT = ~(A & B);
if (SEL == 3'b011);
    ALU_OUT = ~(A | B);
if (SEL == 3'b100)
    ALU_OUT = ~A;
if (SEL == 3'b101)
    ALU_OUT = A >> B;
else 
    ALU_OUT = 0;
end

以上是我的代码,目前为ALU。我必须编写溢出代码,但主要问题是代码中没有任何东西工作。我不知道我必须修复什么,因为计算机没有说有任何错误。但是,我所有的测试都不及格。所有结果均为0。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-13 13:43:13

您的代码有一个逻辑错误。您有5个单独的if语句,外加1个if/else语句。您很可能意味着有一个级联的if/else if/ else语句。为了避免这种类型的错误,最好使用case语句:

代码语言:javascript
复制
always @* begin
    case (SEL)
        3'b000  : ALU_OUT = A + B;
        3'b001  : ALU_OUT = A - B;
        3'b010  : ALU_OUT = ~(A & B);
        3'b011  : ALU_OUT = ~(A | B);
        3'b100  : ALU_OUT = ~A;
        3'b101  : ALU_OUT = A >> B;
        default : ALU_OUT = 0;
    endcase
end

使用case语句时,一旦SEL匹配一个case项,case语句将立即退出。

在您的代码中,每个if都会被评估,最后一个将获胜。例如,如果SEL为0,则执行ALU_OUT = A + B。模拟器还检查其余的if语句。当它到达if (SEL == 3'b101)时,计算结果为false,这意味着执行else语句:ALU_OUT = 0。这就是你得到0的原因。elseSEL的任何值都执行。

我在操场上发布了一个完整的测试平台,演示了case语句的工作原理。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67519817

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档