код verilog, чтобы найти единственное максимальное значение для ввода, имеющего 1000 значений выборки

я хочу найти одно максимальное значение для входного сигнала, который имеет 1000 десятичных значений, которые считываются из памяти один раз после каждого положительного края clk. Я сделал следующий грубый код для нахождения максимального значения, но он не дал мне правильное максимальное значение / число, пожалуйста, помогите мне, чтобы я мог найти одно максимальное значение из этих 1000 значений входного сигнала.. заранее спасибо

module(input clk, input [15:0]din, output [15:0]dout);
reg [15:0] max=0;

always @ (Posedge clk)
if(din>max)
max<=din;
else
max<=0;

assign dout=max;
endmodule

person MR.simple    schedule 25.05.2016    source источник
comment
Вы можете использовать счетчик для подсчета 1000 образцов. В настоящее время учет 1000 последних входных значений не предусмотрен. Кроме того, вам нужно хранить эти 1000 образцов (память). Каждый раз, когда ввод изменяется (некоторый комбинационный блок), сравнивайте текущий ввод с каждым из этих 1000 образцов.   -  person sharvil111    schedule 25.05.2016
comment
В качестве примечания используйте неблокирующие назначения (<=) в последовательных блоках. Кроме того, ключевое слово posedge должно быть написано строчными буквами.   -  person sharvil111    schedule 25.05.2016
comment
Sharvil111, спасибо за ваш ответ.   -  person MR.simple    schedule 25.05.2016


Ответы (2)


Предположение 1:

Если ваша операция чтения памяти с оценкой 1000 выходит за рамки вашего модуля поиска максимального значения, тогда нет необходимости отслеживать, сколько значений считывается.

module find_max (input         clk, 
                 input  [15:0] din, 
                 output [15:0] dout
               );

reg [15:0] max=0;

always @ (posedge clk)
begin
  if(din > max)
    max <= din;
  else
    max <= max;
end

assign dout = max;

endmodule

Ваше максимальное значение отражается в выводе после следующего цикла подачи в модуль find_max.

Предположение 2:

Если ваш модуль outof find_max не заботится об общем количестве прочитанных оценок, тогда нам просто требуется один счетчик, который отслеживает количество циклов или полученных оценок.

module find_max (input         clk, 
                 input  [15:0] din, 
                 output [15:0] dout
               );

reg [15:0] max=0;
reg [ 9:0] cnt=0;

always @ (posedge clk)
begin
  cnt <= cnt + 1'b1;
  if(din > max)
    max <= din;
  else
    max <= max;
end

assign dout = (cnt == 10'd1000) ? max : 16'd0;

endmodule

Нам не нужно хранить значение 1000 выборок, потому что нам нужно найти только максимальное значение.

person Prakash Darji    schedule 25.05.2016
comment
Пракаш Дарджи.. спасибо за ваше время.. я попробовал ваш код для моего сигнала din, но не показывает 0.. это не максимальное значение.. я прилагаю код своего тестового стенда, пожалуйста, посмотрите на него.. - person MR.simple; 25.05.2016
comment
загрузить свой мем файл - person Prakash Darji; 25.05.2016
comment
Сначала попробуйте прочитать данные из файла. Увидите, что вы не извлекаете данные из файла должным образом, сначала проверьте его, а затем посмотрите. - person Prakash Darji; 25.05.2016
comment
Вы также не создали часы. сделать правильный tb, а затем увидеть результат. - person Prakash Darji; 25.05.2016
comment
@PrakashDarji. reg [15:0] max=0; это действительно? Я не встречал двойных назначений для reg (max также назначается внутри блока always). Можете дать мне ссылку, чтобы прочитать это? - person Sourabh; 27.05.2016

Вам не нужно присваивать значение max, когда din‹=max, как в операторе else.

module(input clk, input [15:0]din, output reg [15:0]dout); always @ (posedge clk) if(din>max) max<=din; endmodule

person Sourabh    schedule 27.05.2016
comment
пожалуйста, загрузите аппаратную схему вашего кода и моего и сравните, что она делает? - person Prakash Darji; 27.05.2016