`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,从波形上面来看,这里应该用组合逻辑来实现。不应该用时序逻辑。