Перейти к содержанию
    

Время, конечно, позднее. Может, я дурак... но вот друзья, скажите мне. Почему результаты синтеза разные?

 

fifo_1[ 1 ] <= fifo_1[ 0 ];
fifo_1[ 2 ] <= fifo_1[ 1 ];
fifo_1[ 3 ] <= fifo_1[ 2 ];
fifo_1[ 4 ] <= fifo_1[ 3 ];

 

и

 

for( reg_k = 0; reg_k < 4; reg_k = reg_k + 1 )
    fifo_1[ reg_k ] <= fifo_1[ reg_k - 1];

 

В первом случае то, что и хочется - регистр сдвига. А во втором - ерунда. Что ли reg_k меняется каждый такт, а не создаётся 4 копии того, что внутри for?

 

P.S. Вопрос, похоже, фундаментальный :).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Время, конечно, позднее. Может, я дурак... но вот друзья, скажите мне. Почему результаты синтеза разные?

 

fifo_1[ 1 ] <= fifo_1[ 0 ];
fifo_1[ 2 ] <= fifo_1[ 1 ];
fifo_1[ 3 ] <= fifo_1[ 2 ];
fifo_1[ 4 ] <= fifo_1[ 3 ];

 

и

 

for( reg_k = 0; reg_k < 4; reg_k = reg_k + 1 )
    fifo_1[ reg_k ] <= fifo_1[ reg_k - 1];

 

В первом случае то, что и хочется - регистр сдвига. А во втором - ерунда. Что ли reg_k меняется каждый такт, а не создаётся 4 копии того, что внутри for?

 

P.S. Вопрос, похоже, фундаментальный :).

 

Потому, что написано неправильно - индекс reg_k должен меняться от 1 до 4-х включительно, а не то, что написано у Вас.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Результаты разные, потому что в цикле for индекс меняется от 0 до 3, поэтому синтезируется f[0]<=f[-1]; f[1]<=f[0] и так далее.

Вот так скорее всего сработает

for( reg_k = 0; reg_k < 4; reg_k = reg_k + 1 )
    fifo_1[ reg_k+1 ] <= fifo_1[ reg_k ];

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

P.S. Вопрос, похоже, фундаментальный :).

помимо прочего разрядность reg_k случайно не 2 бита?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А если 2 бита - синтезатор разве не выдаст ошибку, что цикл бесконечный?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А если 2 бита - синтезатор разве не выдаст ошибку, что цикл бесконечный?

 

Да врядли он однобитовый. Регистр сдвига все умеют делать.

Двумерный массив наверняка.

reg [width-1:0] rg [pipeline-1:0];

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

module  TestFor(input wire clk, input wire [7:0] din, output logic [7:0] dout);
  bit[7:0] ff[0:4];

  always_ff @(posedge clk)  begin
  ff[0] <= din;
  for (byte k = 0; k < 4; k++)
    ff[k+1] <= ff[k];
  dout <= ff[4];
  end
endmodule

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, в том, что написал - точно ошибка. Я просто оба варианта пробовал:

 

fifo_1[ reg_k ] <= fifo_1[ reg_k - 1 ];

 

и

 

fifo_1[ reg_k+1 ] <= fifo_1[ reg_k ];

 

А в результате выложил что-то среднее между ними :).

 

Спасибо большое за помощь. Важно, что я понял из ваших слов, что всё должно работать. Наверно, где-то ошибся.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вопрос. Где проходит та грань, когда нужно применять generate for, а когда можно обойтись одним for? Не могу осознать точное правило.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Где проходит та грань, когда нужно применять generate for, а когда можно обойтись одним for?

generate for множит _инстансы_ (объекты), процедурный цикл for - пробег по(манипуляция) данным. естественно, что грань между данными и объектами бывает очень тонкая.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вопрос. Где проходит та грань, когда нужно применять generate for, а когда можно обойтись одним for? Не могу осознать точное правило.

 

А можно вообще без for. На одномерном массиве с нужным шагом. (Это когда за описанием железо видите).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А можно вообще без for. На одномерном массиве с нужным шагом. (Это когда за описанием железо видите).

В приведенном выше моем же коде вижу массив из 5 х 8 триггеров. Могу описать и с помощью generate, и каждый триггер в отдельности, однако обошелся "обычным" for. Как? и Почему?

Вот скажем - что нужно добавить к моему коду, чтобы for уже не "прокатывал"?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот скажем - что нужно добавить к моему коду, чтобы for уже не "прокатывал"?

 

`timescale 1 ns / 1 ps
module shift_mn
#(
parameter n = 4,
          m = 8
)
(
input           clk,
input  [n-1:0] in_data_right, in_data_left,
output [n-1:0] out_data_right, out_data_left
);

reg [m*n-1:0] shift_right = {m*n{1'b0}};
reg [m*n-1:0] shift_left = {m*n{1'b0}};

always @(posedge clk)
begin
shift_left <= {shift_left[(m-1)*n-1:0], in_data_left};
shift_right <= {in_data_right, shift_right[m*n-1:n]};
end

assign out_data_right = shift_right[0 +:n],
        out_data_left = shift_left[(m*n-1) -:n];

endmodule

 

И на память ложится.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И на память ложится.

потому, что коэффициент m >= 8. При меньшем будут триггеры. По крайней мере, для EP3C5F256C8. Видимо, это граница. Вот код попроще. Тоже ложится в память.

module  TestFor
#(parameter L = 8)
(input wire clk, input wire [7:0] din, output logic [7:0] dout);
  bit[7:0]  ff[0:L-1];

  always_ff @(posedge clk)  begin
  ff[0] <= din;
  for (int k=0; k<(L-1); k++)
    ff[k+1] <= ff[k];
  end
  assign  dout = ff[L-1];
endmodule

Правда, это никак не проясняет "чудо for". У вас используется конкатенация битов.

 

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...