`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//
/借鉴榜一大佬的说辞!!!!!
题中看到对于sel的不同情况,有几种不同的输出,首先考虑到用case语句。
要注意的是,仅当sel为0时,输入信号有效,因此需要一个寄存器data_temp,在sel为0时对输入信号进行锁存。
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的运算。/
//本题最关键的一点是为0的时候,不输出,且只有此时的输入有效,所以需要把为0的时候输入寄存下来。寄存到寄存器中
//之后的d不管他,只看sel=0时候的
reg[4:0] r_out;//输出
reg r_validout;//输出
reg[15:0] r_temp;//寄存器锁存,将输入信号锁存
always@(posedge clk or negedge rst)begin
if(~rst)begin
r_validout<=1'b0;
r_out<=5'b0;
r_temp<=16'b0;
end
else begin
case(sel)
2'b00:begin
r_temp<=d;//为0的时候将输入信号进行锁存
r_out<=5'b0;
r_validout<=1'b0;
end
2'b01:begin
r_temp<=r_temp;//
r_out<=r_temp[3:0]+r_temp[7:4];
r_validout<=1'b1;
end
2'b10:begin
r_out<=r_temp[3:0]+r_temp[11:8];
r_validout<=1'b1;
end
2'b11:begin
r_temp<=r_temp;
r_out<=r_temp[3:0]+r_temp[15:12];
r_validout<=1'b1;
end
default:begin
r_out<=5'b0;
r_validout<=1'b0;
end
endcase
end
end
assign out=r_out;
assign validout=r_validout;
//**code// endmodule