Скользящее окно в Verilog при выполнении свертки - PullRequest
0 голосов
/ 29 апреля 2018

Я работаю над своим проектом CNN в Verilog, но у меня есть некоторые проблемы с реализацией процедуры свертки изображения с фильтром 3x3. Я написал код для сверточного модуля, но теперь, когда дело доходит до свертки, я должен читать значения из памяти, которая содержит пиксели изображения. Дело в том, что я должен прочитать эти значения в определенном порядке, так как свертка берет точечное произведение 2 матриц и затем перемещает его на 1 вправо. Итак, скажем, если изображение имеет матрицу 5x5, которая хранится в массиве памяти

[a1 a2 a3 a4 a5

a6 a7 a8 a9 a10

a11 a12 a13 a14 a15] - Ram памяти

как я могу прочитать значения памяти в следующем порядке: a1, затем a2, затем a3, затем a6, затем a7, затем a8, и последний ряд a11, a12 a13, а затем шагните и начните сначала, начиная с a2, a3 и т. д., пока я не достигну конца моего массива. Пожалуйста, предложите любое решение, как мне следует обращаться к памяти в этой ситуации, фрагмент кода будет высоко оценен. Спасибо.

p.s. мой массив памяти будет содержать много данных, примерно будет матрица [400x300], где фильтр [3x3].

1 Ответ

0 голосов
/ 29 апреля 2018

Выглядит как простой случай вложенных циклов for. Эта прогулка по 16-элементной памяти, как вы хотели:

for (start=0; start<3; start=start+1)
   for(i=1; i<16; i=i+5)
      for (j=0; j<3; j=j+1)
         data = mem[start+i+j]; // C: printf("%d\n",start+i+j);

Обратите внимание, что код совместим с C и Verilog, поэтому вы можете проверить свою последовательность в C-компиляторе, если хотите (я сделал).

Если вам не нравятся циклы for, вы можете превратить их в счетчики. В HDL вы всегда меняете порядок и начинаете с внутреннего цикла:

if (j<3)
   j <= j + 1;
else
begin
   j <=0; 
   if (i<16) // should be 15 if you start from 0 
      i <= i + 5;
   else
   begin
      i <= 1; // You sure it should not be zero?
      if (start<3)
         start <= start + 1;
      else
      begin
         start <= 0;
         all_done <= 1'b1
      end // nd of start
   end // end of j
end // end of i 

В другой части дизайна теперь вы можете использовать start + i + j в качестве адреса.
Последнее: я бы начал с индексов 0,1,2, так как ваша картинка, скорее всего, будет начинаться с адреса памяти 0. Для этого вам нужно изменить цикл 'i'.

(код HDL не компилируется и не тестируется)

...