题解 | #位拆分与运算#

位拆分与运算

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

目录

代码

题目比较简单,直接上代码:

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

    output [4:0]out,
    output validout
);
//*************code***********//
    reg [3:0] d0, d1, d2, d3;
    reg [4:0] out_r;
    reg validout_r;
    
    always @(posedge clk or negedge rst) begin
        if (~rst) begin
            out_r      <= 5'b0;
            validout_r <= 1'b0;
        end
        else
            case (sel)
                2'b00: begin
                    {d3, d2, d1, d0} <= d;
                    out_r      <= 5'b0;
                    validout_r <= 1'b0;
                end
                2'b01: begin
                    out_r      <= d0 + d1;
                    validout_r <= 1'b1;
                end
                2'b10: begin
                    out_r      <= d0 + d2;
                    validout_r <= 1'b1;
                end
                2'b11: begin
                    out_r      <= d0 + d3;
                    validout_r <= 1'b1;
                end
                default: begin
                    out_r      <= 5'b0;
                    validout_r <= 1'b0; 
                end
            endcase
    end
    
    assign out      = out_r;
    assign validout = validout_r;
//*************code***********//
endmodule

简析

题目要求sel为0时输入才有效,所以需要使用寄存器把wire型的输入数据d暂存起来,然后在进行运算。另外,过程块不能对wire型变量进行赋值,所以需要又定义了out_rvalidout_r

Verilog篇题解 文章被收录于专栏

本人对牛客网verilog篇题目一些理解

全部评论

相关推荐

10-29 19:45
吉林大学 Java
从零开始数:自我评价没有必要写,但是看起来你应该是学了csdiy的一些课程,可以在专业技能里面写上自己比较熟悉操作系统和计网,但如果你是找Java的话,把第一个项目换了吧,现在看起来有点四不像。 无论是黑马点评或者说做个轮子项目,刷题和八股也搞起来吧,而且也没必要等到寒假,最近就可以开始找,找到就偷偷实习呗,别被逮到就行了。
点赞 评论 收藏
分享
评论
3
1
分享

创作者周榜

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