题解 | #位拆分与运算#
位拆分与运算
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]datain;
always@(posedge clk or negedge rst)
if(!rst)
datain <= 16'd0;
else if(sel == 2'd0)
datain <= d;
always@(*)
if(!rst)
out = 5'b0;
else case(sel)
2'd0:
out = 5'b0;
2'd1:
out = datain[3:0] + datain[7:4];
2'd2:
out = datain[3:0] + datain[11:8];
3'd3:
out = datain[3:0] + datain[15:12];
default:
out = 5'b0;
endcase
always@(*)
if(!rst)
validout = 0 ;
else if(sel == 2'b0)
validout = 0 ;
else
validout = 1 ;
//*************code***********//
endmodule
这个题有两个关键地方。
1, sel == 2‘d0 的时候,输入才有效。所以在sel ==2’d0 的时候才锁存输入。
2,从波形上面来看,这里应该用组合逻辑来实现。不应该用时序逻辑。
#如何看待2023届秋招##你的秋招进展怎么样了##硬件人如何看待稚晖君从华为离职#