题解 | #位拆分与运算#
位拆分与运算
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 [4:0]out,
output validout
);
//*************code***********//
reg [15:0] d_reg;
reg [4:0] out_tmp;
reg validout_tmp;
always@(posedge clk or negedge rst) begin
if(!rst) begin //这里是异步复位,如果删去negedge rst,则是同步复位
out_tmp <= 5'b0;
validout_tmp <= 1'b0;
end
else begin
case(sel)
//每一条cese中,如果有多条语句,都要加 begin/end
2'b00: begin out_tmp <= 5'b0; validout_tmp <= 1'b0;end
2'b01: begin out_tmp <= d_reg[3:0] + d_reg[7:4]; validout_tmp <= 1'b1; end
2'b10: begin out_tmp <= d_reg[3:0] + d_reg[11:8]; validout_tmp <= 1'b1; end
2'b11: begin out_tmp <= d_reg[3:0] + d_reg[15:12]; validout_tmp <= 1'b1; end
endcase
end
end
//写成两个always
always@(posedge clk or negedge rst) begin
if(!rst) begin
d_reg <= 5'b0;
end
else if (sel == 2'b0) begin
d_reg <= d;
end
end
assign out = out_tmp;
assign validout = validout_tmp;
//*************code***********//
endmodule
美团公司福利 3567人发布