题解 | #多功能数据处理器#

多功能数据处理器

https://www.nowcoder.com/practice/e009ab1a7a4c46fb9042c09c77ee27b8

`timescale 1ns/1ns
module data_select(
    input clk,
    input rst_n,
    input signed[7:0]a,//已经定义了有符号数,直接加减也没问题
    input signed[7:0]b,
    input [1:0]select,
    output reg signed [8:0]c
);
    //基础只是补充-----计算机的底层存储都是反码,还有有符号反码不够高位补1,无符号补0
   //正数:原码=补码=反码
    //负数:负数反码等于原码除符号位外,所有位取反;负数补码等于反码加一
    //举例;6-12=-6,先都将6和12算为二进制,然后分别取其补码,变成两个补码相加,最后得到的结果变为原码
    //对于+*都是一样的 无符号*(+)无符号=无符号;有符号*(+)有符号=有符号
    //如果表达式中有一个数是无符号数,所有的操作数都会被强制转换成无符号数
    //此题特别注意是有符号数,通过补码的形式表示负数,为1的话是负数,声明的时候全都要加signed
    //select为0,输出a,select为1,输出b;select为2,输出a+b,select为3,输出a-b
   //有符号数+有符号数=有符号数;无符号数+无符号数=无符号数;如果表达式中有一个为无符号数,
    //则所有操作结果都会变成无符号数
    //举例:有符号A +无符号B时,会将补码表示的有符号A当成无符号数A1,,再计算A1+B,这样得到的结果就是错的了
    //解决①,涉及到有符号数的运算和有符号相关的输入,输出中间变量均定义成signed的有符号数,这样全部遵循有符号运算规则
    //解决方案②用位拼接符补齐符号位
    
    //答案1:自己做,不严谨版本,但对于本题输入类型直接定义为有符号数可以直接相加减
    /*
    always@(posedge clk or negedge rst_n)begin
        if(~rst_n)begin
            c<=9'b0;
        end
        else begin
            case(select)
                2'b00:begin
                    c<=a;
                end
                2'b01:begin
                    c<=b;
                end
                2'b10:begin
                    c<=a+b;
                end
                2'b11:begin
                    c<=a-b;
                end
                default:begin
                    c<=9'b0;
                end
            endcase
        end
    end      */
    //答案二:有符号位的话,直接是补码的形式进行计算,正数不变,负数取其最高位做拼接运算,因为负数的话
    //高位补1,正数位数不够高位补0,最终的结果底层都是按照反码的形式来进行存储的。
    always@(posedge clk or negedge rst_n)begin
        if(~rst_n)begin
            c<=9'b0;
        end
        else begin
            case(select)
                0:begin
                    c<={a[7],a};
                end
                1:begin
                    c<={b[7],b};
                end
                2:begin
                    c<={a[7],a}+{b[7],b};
                end
                3:begin
                    c<={a[7],a}-{b[7],b};
                end
            endcase
        end
    end
    
                
                
    
endmodule
全部评论

相关推荐

04-29 18:07
常州大学 Java
寂静羽翼:兄弟我已经亲身经历了,双非没实习很多大厂还是会给笔试的,可是有的公司笔试做的好也不给面一直卡着,ssob基本看我没实习都拒绝我了,但是每天投满偶尔也能有一两场初创公司的面试,但是薪资基本在五六千
点赞 评论 收藏
分享
叶扰云倾:进度更新,现在阿里云面完3面了,感觉3面答得还行,基本都答上了,自己熟悉的地方也说的比较细致,但感觉面试官有点心不在焉不知道是不是不想要我了,求阿里收留,我直接秒到岗当阿里孝子,学校那边的房子都退租了,下学期都不回学校,全职猛猛实习半年。这种条件还不诱人吗难道 然后现在约到了字节的一面和淘天的复活赛,外加猿辅导。华为笔试完没动静。 美团那边之前投了个base广州的,把我流程卡麻了,应该是不怎么招人,我直接简历挂了,现在进了一个正常的后端流程,还在筛选,不知道还有没有hc。
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务