题解 | 位拆分与运算

位拆分与运算

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

`timescale 1ns/1ns

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

output reg [4:0]out,
output reg validout
);
//*************code***********//
reg [15:0]d_reg;//寄存输入的有效值
always @(posedge clk or negedge rst)begin
if(!rst)begin
    d_reg <= 16'd0;
    out <= 5'd0;
    validout <=0;
end
else begin
    case(sel)
    0:begin
d_reg <= d;
out <= 5'd0;
validout <=0;
    end
    1:begin
d_reg <= d_reg;
out <= d_reg[3:0] + d_reg[7:4];
validout <=1;
end
2:begin
d_reg <= d_reg;
out <= d_reg[3:0] + d_reg[11:8];
validout <=1;
end
3:begin
d_reg <= d_reg;
out <= d_reg[3:0] + d_reg[15:12];
validout <=1;
end
default:begin
    d_reg <= 16'd0;
    out <= 5'd0;
    validout <=0;
end
    endcase
end
end
//*************code***********//
endmodule

一定要注意题目所说: sel = 0:   不输出且只有此时的输入有效 ,因此需要把输入的寄存,故定义一个d_reg;

其次要注意:case(sel)之后要有endcase,就算我们已经sel用了所用情况,为了保持好习惯一定要default!!!!!

全部评论

相关推荐

评论
1
收藏
分享

创作者周榜

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