获取数据流最大值
已知一段数据流 data_in 输入,在 datain_en 为高时有效时,请将这段数据流的最大次大值选出,在一段 datain_en结束之后给出相应的结果max,submax 和结果使能dataout_en。
分析:在输入数据data_in至少为两个时,dataout_en才能拉高,用一个计数器来计数。对于max和submax的计算有以下三种情况:
- ①输入数据大于max:将data_in赋值给max,将max赋值给submax;
- ②输入数据大于submax,但不大于max:将data_in赋值给submax,而max值保持不变;
- ③输入数据不大于submax:max和submax值均保持不变。
- verilog代码
module StreamMax(
input clk,
input rst_n,
input[3:0] data_in,
input datain_en,
output reg [3:0] max,
output reg [3:0] sub_max,
output reg dataout_en
);
always@(posedge clk, negedge rst_n)begin
if(!rst_n)begin
max <= 4'd0;
sub_max <= 4'd0;
end
else if(datain_en)begin
if(data_in>max)begin
max <= data_in;
sub_max <= max;
end
else if(data_in>sub_max)begin
max <= max;
sub_max <= data_in;
end
else begin
max <= max;
sub_max <= sub_max;
end
end
end
reg[1:0] cnt;
always@(posedge clk, negedge rst_n)begin
if(!rst_n)begin
cnt <= 2'd0;
end
else if(datain_en)begin
cnt <= cnt==2'd1? cnt:cnt+1'b1;
end
end
always@(posedge clk, negedge rst_n)begin
if(!rst_n)begin
dataout_en <= 1'b0;
end
else if(cnt==1'b1)begin
dataout_en <= 1'b1;
end
end
endmodule
- 仿真结果