题解 | #位拆分与运算#
题中看到对于sel的不同情况,有几种不同的输出,首先考虑到用case语句。
要注意的是,仅当sel为0时,输入信号有效,因此需要一个寄存器data_temp,在sel为0时对输入信号进行锁存。
下一步编写代码:
复位时,三个信号受到影响,即data_temp清零、validout清零、输出out清零;
sel为0时,将输入的值锁存到data_temp中,同时validout拉低,输出out为0;
sel为1时,validout拉高,同时将锁存后的data_temp按位进行输出out的运算;
sel为2时,validout拉高,同时将锁存后的data_temp按位进行输出out的运算;
sel为3时,validout拉高,同时将锁存后的data_temp按位进行输出out的运算。
整个代码如下:
``` js`timescale 1ns/1ns
`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
);
reg [15:0]data_temp;
always@(posedge clk or negedge rst)
if(!rst)begin
out<=5'd0;
validout<=1'b0;
data_temp<=16'd0;
end
else case(sel)
0:
begin
data_temp<=d;
out[4:0]<=5'd0;
validout<=1'b0;
end
1:
begin
validout<=1'b1;
out[4:0]<=data_temp[3:0]+data_temp[7:4];
end
2:
begin
validout<=1'b1;
out[4:0]<=data_temp[3:0]+data_temp[11:8];
end
3:
begin
validout<=1'b1;
out[4:0]<=data_temp[3:0]+data_temp[15:12];
end
default:
begin
validout<=1'b0;
out[4:0]<=5'd0;
end
endcase
endmodule