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