找到一个序列里面的最大值和次大值,并寄存器输出。假定序列是串行输入的8bit数据din,输入有数据有效信号 din_valid,序列第一个数据使能 first data valid,序列最后一个有效数据使能last data valid。 补充:当序列出现多次(大于等于2次)最大值,那么次大值等于最大值。
假设序列是由8-bit的数据组成,输入是串行的,并且有数据有效信号(din_valid
)。序列的第一个数据有效信号是first data valid
,最后一个有效数据的信号是last data valid
。同时,如果最大值在序列中出现多次(大于等于2次),那么次大值将等于最大值。
为了实现这个功能,可以采用以下算法:
-
初始化两个寄存器,分别存储最大值和次大值。将它们的初始值设置为0,可以命名为
max_value_reg
和second_max_value_reg
。 -
当接收到有效数据时,首先检查
din_valid
信号是否为高电平。如果是,使用以下算法更新寄存器的值:- 如果
din
的值大于等于max_value_reg
,则将second_max_value_reg
的值更新为max_value_reg
,max_value_reg
的值更新为din
。 - 如果
din
的值小于max_value_reg
且大于等于second_max_value_reg
,则将second_max_value_reg
的值更新为din
。
- 如果
-
当最后一个有效数据(
last data valid
)到达时,最大值和次大值将保存在max_value_reg
和second_max_value_reg
中。您可以从这两个寄存器中读取最大值和次大值。
module FindMaxAndSecondMax (
input wire clk,
input wire rst,
input wire [7:0] din,
input wire din_valid,
input wire first_data_valid,
input wire last_data_valid,
output reg [7:0] max_value,
output reg [7:0] second_max_value
);
reg [7:0] curr_max_value;
reg [7:0] curr_second_max_value;
reg [7:0] temp_max_value;
reg [7:0] temp_second_max_value;
always @(posedge clk or posedge rst) begin
if (rst) begin
curr_max_value <= 8'h00;
curr_second_max_value <= 8'h00;
end else begin
// 在有效数据到达的时候更新最大值和次大值
if (din_valid) begin
if (din >= curr_max_value) begin
temp_max_value <= din;
temp_second_max_value <= curr_max_value;
end else if (din > curr_second_max_value) begin
temp_max_value <= curr_max_value;
temp_second_max_value <= din;
end else begin
temp_max_value <= curr_max_value;
temp_second_max_value <= curr_second_max_value;
end
end
// 在序列最后一个有效数据到达的时候将结果保存在输出寄存器中
if (last_data_valid) begin
max_value <= temp_max_value;
second_max_value <= temp_second_max_value;
end
end
end
endmodule