题解 | #位拆分与运算#
位拆分与运算
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

