m0use 0 6 октября, 2010 Опубликовано 6 октября, 2010 · Жалоба Время, конечно, позднее. Может, я дурак... но вот друзья, скажите мне. Почему результаты синтеза разные? 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. Вопрос, похоже, фундаментальный :). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
masics 0 6 октября, 2010 Опубликовано 6 октября, 2010 · Жалоба Время, конечно, позднее. Может, я дурак... но вот друзья, скажите мне. Почему результаты синтеза разные? 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-х включительно, а не то, что написано у Вас. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tAmega 0 6 октября, 2010 Опубликовано 6 октября, 2010 · Жалоба Результаты разные, потому что в цикле 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 ]; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 6 октября, 2010 Опубликовано 6 октября, 2010 · Жалоба P.S. Вопрос, похоже, фундаментальный :). помимо прочего разрядность reg_k случайно не 2 бита? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Koluchiy 0 6 октября, 2010 Опубликовано 6 октября, 2010 · Жалоба А если 2 бита - синтезатор разве не выдаст ошибку, что цикл бесконечный? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 8 6 октября, 2010 Опубликовано 6 октября, 2010 · Жалоба А если 2 бита - синтезатор разве не выдаст ошибку, что цикл бесконечный? Да врядли он однобитовый. Регистр сдвига все умеют делать. Двумерный массив наверняка. reg [width-1:0] rg [pipeline-1:0]; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 6 октября, 2010 Опубликовано 6 октября, 2010 · Жалоба 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
m0use 0 6 октября, 2010 Опубликовано 6 октября, 2010 · Жалоба Да, в том, что написал - точно ошибка. Я просто оба варианта пробовал: fifo_1[ reg_k ] <= fifo_1[ reg_k - 1 ]; и fifo_1[ reg_k+1 ] <= fifo_1[ reg_k ]; А в результате выложил что-то среднее между ними :). Спасибо большое за помощь. Важно, что я понял из ваших слов, что всё должно работать. Наверно, где-то ошибся. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 7 октября, 2010 Опубликовано 7 октября, 2010 · Жалоба Вопрос. Где проходит та грань, когда нужно применять generate for, а когда можно обойтись одним for? Не могу осознать точное правило. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CaPpuCcino 0 7 октября, 2010 Опубликовано 7 октября, 2010 · Жалоба Где проходит та грань, когда нужно применять generate for, а когда можно обойтись одним for? generate for множит _инстансы_ (объекты), процедурный цикл for - пробег по(манипуляция) данным. естественно, что грань между данными и объектами бывает очень тонкая. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 8 7 октября, 2010 Опубликовано 7 октября, 2010 · Жалоба Вопрос. Где проходит та грань, когда нужно применять generate for, а когда можно обойтись одним for? Не могу осознать точное правило. А можно вообще без for. На одномерном массиве с нужным шагом. (Это когда за описанием железо видите). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 7 октября, 2010 Опубликовано 7 октября, 2010 · Жалоба А можно вообще без for. На одномерном массиве с нужным шагом. (Это когда за описанием железо видите). В приведенном выше моем же коде вижу массив из 5 х 8 триггеров. Могу описать и с помощью generate, и каждый триггер в отдельности, однако обошелся "обычным" for. Как? и Почему? Вот скажем - что нужно добавить к моему коду, чтобы for уже не "прокатывал"? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tAmega 0 7 октября, 2010 Опубликовано 7 октября, 2010 · Жалоба Может все дело в том, что generate это struсtural описание, а for это behavioral описание. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 8 7 октября, 2010 Опубликовано 7 октября, 2010 · Жалоба Вот скажем - что нужно добавить к моему коду, чтобы 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 И на память ложится. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 7 октября, 2010 Опубликовано 7 октября, 2010 · Жалоба И на память ложится. потому, что коэффициент 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". У вас используется конкатенация битов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться