题解 | #位拆分与运算#

位拆分与运算

https://www.nowcoder.com/practice/1649582a755a4fabb9763d07e62a9752

`timescale 1ns/1ns

module data_cal(
input clk,
input rst,
input [15:0]d,
input [1:0]sel,

output reg [4:0]out,
output reg validout
);
//*************code***********//

reg [15:0]  d_valid;
always@(posedge clk or negedge rst)begin
    if(!rst)begin
        d_valid<=16'd0;
    end
    else if(sel==2'b0)begin
        d_valid<=d;
    end
    else begin
        d_valid<=d_valid;
    end
end

always@(sel)begin
    case(sel)
        2'b0:begin
            out<=5'd0;
            validout<=1'b0;
        end
        2'b01:begin
            out<=d_valid[3:0]+d_valid[7:4];
            validout<=1'b1;
        end
        2'b10:begin
            out<=d_valid[3:0]+d_valid[11:8];
            validout<=1'b1;
        end
        2'b11:begin
            out<=d_valid[3:0]+d_valid[15:12];
            validout<=1'b1;
        end
        default:begin
            out<=5'd0;
            validout<=1'b0;
        end

    endcase

end



//*************code***********//
endmodule

这题是时序逻辑电路和组合逻辑电路相结合的一个题目,感觉还是比较简单的,至少原理上没啥。就考到了数据的拆分。从题目给出的仿真波形来看out 和 validout有效信号与sel是同时发生变化的可以知道这三个信号应该是一种组合逻辑电路的关系。此外文中给出当sel为零的时候输入的数据才是有效的数据,因此我们需要一个额外的寄存器去存储有效数据,也就是上述代码中的d_valid数据。然后计算部分根据sel控制信号,利用case语句对其运算。这里想到了casex和casez的用法。Verilog HDL针对电路的特性提供了case语句的其它两种形式用来处理case语句比较过程中的不必考虑的情况( don't care condition )。其中casez语句用来处理不考虑高阻值z的比较过程,casex语句则将高阻值z和不定值都视为不必关心的情况。所谓不必关心的情况,即在表达式进行比较时,不将该位的状态考虑在内。

————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/Reborn_Lee/article/details/82390445

全部评论

相关推荐

Hello_WordN:咱就是说,除了生命其他都是小事,希望面试官平安,希望各位平时也多注意安全
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务