题解 | #位拆分与运算#
位拆分与运算
http://www.nowcoder.com/practice/1649582a755a4fabb9763d07e62a9752
刚开始没看见在sel==0 的时候,输入是有效的,所以这是时候需要缓存一下。题干描述不清楚 `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// parameter IDLE = 0; parameter add1 = 1; parameter add2 = 2; parameter add3 = 3; reg [4:0] out; reg validout; reg [15:0] data_lock;
//输入是时序逻辑
always@(posedge clk or negedge rst) begin
if (!rst) begin
data_lock <= 0;
out <= 5'b0;
validout <= 1'b0;
end
else if(!sel)
data_lock <= d;
end
// 输出是组合逻辑
always @(*) begin
case (sel)
IDLE : begin
out <= 5'b0;
validout <= 1'b0;
end
add1 : begin
out <= {1'b0,data_lock[3:0]}+{1'b0,data_lock[7:4]};
validout <= 1'b1;
end
add2 : begin
out <= {1'b0,data_lock[3:0]}+{1'b0,data_lock[11:8]};
validout <= 1'b1;
end
add3 : begin
out <= {1'b0,data_lock[3:0]}+{1'b0,data_lock[15:12]};
validout <= 1'b1;
end
default : begin
out <=5'bx;
validout <= 1'bx;
end
endcase
end
//**code// endmodule