题解 | #位拆分与运算#
位拆分与运算
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 [3:0] mid0; reg [3:0] mid1; reg [3:0] mid2; reg [3:0] mid3; reg [4:0] out_reg; assign validout = (sel == 2'b00)?1'b0:1'b1; assign out = out_reg; always @(posedge clk or negedge rst)begin if(!rst)begin mid0 <= 4'b0000; mid1 <= 4'b0000; mid2 <= 4'b0000; mid3 <= 4'b0000; end else begin if(sel == 2'b00)begin mid0 <= d; mid1 <= d>>4; mid2 <= d>>8; mid3 <= d>>12; end else begin mid0 <= mid0; mid1 <= mid1; mid2 <= mid2; mid3 <= mid3; end end end always @(posedge clk or negedge rst)begin if(!rst)begin out_reg <= 5'b00000; end else begin case(sel) 2'b00:begin out_reg <= 5'b00000; end 2'b01:begin out_reg <= mid0 + mid1; end 2'b10:begin out_reg <= mid0 + mid2; end 2'b11:begin out_reg <= mid0 + mid3; end endcase end end //*************code***********// endmodule