2014-12-21 4 views
0

Добрый день, я пытаюсь закодировать в 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 тактов (он будет связан с счетчиком). Спасибо.

+0

Почему у вас есть эта строка 'assign VAL_MAX = val_max;'? почему бы просто не объявить 'output reg [MEM_WIDTH - 1: 0] VAL_MAX;' – Morgan

+0

", что максимум следует заменить вторым самым высоким сохраненным значением". 250 - это максимальное значение, которое вы можете сохранить, но если у вас уже сохранено 250, вы ожидаете, что он сохранит второй самый высокий номер? В какой момент мы аннулируем максимальное значение? – Morgan

+0

Преднамеренно, что вы читаете только, когда не пишете. – Morgan

ответ

0

Чтобы ответить на ваши вопросы:

1) Причина вы, вероятно, не видя второе самое высокое значение в вашей памяти появляются на VAL_MAX, когда максимальный ток перекрывается, потому что вы никогда не измените val_max регистр содержит значение ram[POS_MAX2], т.е. второе наивысшее значение. Однако, поскольку у вас нет упорядоченной структуры данных и вы не сохраняете больше, чем второе самое высокое значение (и не ищите память для второго наивысшего значения), вы не можете надежно продолжать находить следующее самое высокое значение, удален/переопределены. Возможно, вам придется переосмыслить многое из того, как вы это делаете, если вам нужно всегда иметь самое высокое значение в памяти, которое выводится на VAL_MAX.

2) Позиция 0 не записывается в первый раз, когда вы записываете в память; таким образом, вы получаете значение по умолчанию для памяти, то есть 'x. Вот так:

if(POS_POINTER == POS_MAX) 
    POS_MAX <= POS_MAX2; 
else 
    ram[POS_POINTER] <= VAL_SENSOR; 

В строках выше, вы только положить значения в памяти, если текущая позиция не совпадает с позицией текущего высокого значения. В первый раз, когда вы пишете (т. Е. В положение 0), POS_POINTER и POS_MAX находятся на своих начальных значениях 0, что равно. Таким образом, ram[0] никогда не обновляется, поскольку он выполняется только в том случае, если POS_POINTER и POS_MAX не равны (что в данном случае равно). Если вы должны были записать в позицию 0 во второй раз, вы могли бы написать ему, поскольку значение POS_MAX могло измениться. Обратите также внимание на то, что вы иногда обновляете указатель записи POS_POINTER, даже если вы там не записываете, как в приведенном выше примере (даже через ram[0] не было написано, вы все равно будете обновлять POS_PONTER, чтобы быть 1).

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

+0

Итак, моя структура кода неверна, какой может быть ближайший возможный код для выполнения задачи, которую я запланировал? –

+0

@MatheusMra Это большой вопрос, который зависит от ваших временных ограничений и ограничений по площади. Возможные решения довольно разнообразны, но я не уверен, есть ли способ в 1 цикл с минимальной площадью. (Т. Е. Если вы хотите написать запись за один цикл, логика будет довольно большой) – Unn

Смежные вопросы