题解 | #位拆分与运算#

位拆分与运算

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

/*针对输出的类型判断需不需要中间变量,本题中两个输出都是wire类型,需要在使用always块中对输出使用
reg类型,故而需要两个中间变量;此外,观察out的波形,当sel=3(1)时,计算结结果不是根据当前时刻采样的d,
而是根据最初时刻采样的d(sel=0时刻对应的d),所以需要对d进行寄存;因此必要的还有一个寄存器*/
`timescale 1ns/1ns

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

output [4:0]out,
output validout
);
//*************code***********//
    reg [4:0] out_reg;
    reg validout_reg;
    reg [15:0] d_reg;

    always@(posedge clk&nbs***bsp;negedge rst)begin
        if(!rst)begin
            out_reg<=5'b0;
            validout_reg<=1'b0;
        end
        else begin
            case(sel)  
                2'b00:begin
                   validout_reg<=1'b0;
                   out_reg<=5'b0;
                   d_reg<=d;
                end
                 2'b01:begin
                   validout_reg<=1'b1;   
                     out_reg<=d_reg[3:0]+d_reg[7:4];
                end
                2'b10:begin
                   validout_reg<=1'b1;   
                    out_reg<=d_reg[3:0]+d_reg[11:8];
                end   
                2'b11:begin
                   validout_reg<=1'b1;   
                    out_reg<=d_reg[3:0]+d_reg[15:12];
                end  
            endcase
        end
    end
    assign out=out_reg;
    assign validout=validout_reg;
        
//*************code***********//
endmodule

全部评论
缺少default
点赞 回复 分享
发布于 2022-07-19 11:01

相关推荐

评论
1
收藏
分享

创作者周榜

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