`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