题解 | #位拆分与运算#

位拆分与运算

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

全部评论

相关推荐

01-23 14:54
同济大学 Java
热爱敲代码的程序媛:给你提几点【专业技能】这个模块里面可优化的地方:1.【具备JVM调优经验】可以去b站上搜一下JVM调优的视频,估计一两个小时凭你的学习能力就能掌握JVM调优的实践方面的技能。2.【MySql优化】MySql这一栏,你去b站或者找个博客看看MySql优化,学一下,如果你本身比较熟悉MySql语句的话,那基本半天时间凭你的学习能力MySql语句优化方面的技能你也能掌握个差不多。以上1,2两点主要是因为我看你专业技能大部分都说的是偏理论,没有写应用。再就是最后,你结合你的项目,想一想你的项目中哪些sql语句是可以用MySql优化的,到时候你面试的时候也好结合着说一下。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务