目录

代码

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

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