题解 | #位拆分与运算#
位拆分与运算
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_r
和validout_r
。
Verilog篇题解 文章被收录于专栏
本人对牛客网verilog篇题目一些理解