Добрый день, я пытаюсь закодировать в Verilog структуру, чем может хранить до 64 различных 8-битных номеров (64X8), что позволяет хранить номера больше 125 и ниже или 250. Когда он записывает (или нет), он может отображать максимальное текущее сохраненное значение (VAL_MAX), а также его позицию (POS_MAX). Когда вы не пишете (EN_WR == 0), я просто помещаю в POS_RD позицию, которую я хочу, чтобы увидеть, какой номер там хранится, и когда память заполнена (NR_ST = 64), она заменяет самые старые сохраненные номера новым один, один за другим. В настоящее время у меня есть код, но есть некоторые проблемы:Verilog Код для определенного типа счетчика (проблемы)
1-й - Когда память заполнена и, например. У меня 250 во 2-й позиции, выход будет VAL_MAX = 250; POS_MAX = 1. Когда приходит пучок новых чисел, этот максимум должен быть заменен вторым самым высоким сохраненным значением и должен показывать его позицию, но в памяти не отображается новое максимальное значение.
2nd - Когда я хочу видеть номер, сохраненный в 1-й позиции (POS_RD = 0), выход VAL_RD (используемый для чтения сохраненных номеров) является «X», а не сохраненным номером, я не знаю, это экономит или нет.
Код:
module Bloco(VAL_SENSOR, EN_WR, POS_RD, NR_ST, VAL_MAX, POS_MAX, VAL_RD, segundo, clk);
parameter MEM_SIZE = 64;
parameter MEM_WIDTH = 8;
parameter ADDR_SIZE = 5;
input[MEM_WIDTH - 1:0] VAL_SENSOR;
input[5:0] POS_RD;
input EN_WR,segundo,clk;
output[6:0] NR_ST;
output[MEM_WIDTH - 1:0] VAL_MAX;
output[ADDR_SIZE :0]POS_MAX;
output[MEM_WIDTH - 1:0]VAL_RD;
reg[MEM_WIDTH - 1:0] ram[MEM_SIZE - 1:0]; // C , L
reg[MEM_WIDTH - 1:0] VAL_RD;
reg[MEM_WIDTH - 1:0] val_max = 0; //necessita de variavel so por causa do valor inicial
reg[ADDR_SIZE :0] POS_MAX = 0;
reg[ADDR_SIZE :0] POS_MAX2 = 0;
reg[ADDR_SIZE + 1:0] NR_ST_COUNTER = 0; //addr_size + 1 because it needs to count from zero to the number of values
reg[ADDR_SIZE :0] POS_POINTER = 0;
assign VAL_MAX = val_max;
assign NR_ST = NR_ST_COUNTER;
always @ (posedge clk)
begin
if(EN_WR) //Caso esteja habilitado o sistema de armazenamento
begin
if(segundo)
begin
if(VAL_SENSOR > 125 && VAL_SENSOR <= 250) //Se for um numero abaixo de 250 unid. luminosas e acima de 125
begin //Escrita
if(POS_POINTER == POS_MAX)
POS_MAX <= POS_MAX2;
else
ram[POS_POINTER] <= VAL_SENSOR;
if(NR_ST_COUNTER < 64) //atualizar Contador de Valores guardados
NR_ST_COUNTER = NR_ST_COUNTER + 1;
if(VAL_SENSOR > val_max) //atualizar MAX
begin
POS_MAX <= POS_POINTER;
val_max <= VAL_SENSOR;
end
else //ver se encaixa no segundo maior POS_MAX2
begin
if(VAL_SENSOR > ram[POS_MAX2]) //nao precisa guardar o valor
POS_MAX2 <= POS_POINTER;
end
POS_POINTER <= POS_POINTER + 1;
end
end
end
else
VAL_RD <= ram[POS_RD];
end
endmodule
.
ПРИМЕЧАНИЕ = Вход «segundo» похож на EN_WR, но он используется только после 10 тактов (он будет связан с счетчиком). Спасибо.
Почему у вас есть эта строка 'assign VAL_MAX = val_max;'? почему бы просто не объявить 'output reg [MEM_WIDTH - 1: 0] VAL_MAX;' – Morgan
", что максимум следует заменить вторым самым высоким сохраненным значением". 250 - это максимальное значение, которое вы можете сохранить, но если у вас уже сохранено 250, вы ожидаете, что он сохранит второй самый высокий номер? В какой момент мы аннулируем максимальное значение? – Morgan
Преднамеренно, что вы читаете только, когда не пишете. – Morgan