alexadmin 0 26 марта, 2015 Опубликовано 26 марта, 2015 · Жалоба мне кажется, даже если упростить задачу сделать настоящую двупортовую память, но с одним клоком - все равно не получиться Т.к. 2 процесса/always Вообще-то это стандартный шаблон квартуса. Тут у синтезатора крышу сносит, как я понимаю, на предмет многомерности массива. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 26 марта, 2015 Опубликовано 26 марта, 2015 · Жалоба мне кажется, даже если упростить задачу сделать настоящую двупортовую память, но с одним клоком - все равно не получиться Т.к. 2 процесса/always Не, ну тут можно и в одном always написать. В parallel_case, например... Или двумя if один за другим. Только вопрос, поймет ли синтезатор, что от него хотят. Precision понимает true dual port, а вот synplify - нет (в ISPLever 7.0 был пример, из-за чего его и снесли оттуда уже в 7.2). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ElrondTelvanni 0 26 марта, 2015 Опубликовано 26 марта, 2015 · Жалоба А так ли принципиально делать это всё одним модулем? Двумя всё отлично описывается и синтезируется, как я написал в своём предыдущем сообщении. SM В одном always даже обычная двухпортовая память не синтезируется, я пробовал. Нужны обязательно разные процессы под каждый порт. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 26 марта, 2015 Опубликовано 26 марта, 2015 · Жалоба Спасибо Всем откликнувшимся... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 34 26 марта, 2015 Опубликовано 26 марта, 2015 · Жалоба Приветствую! Ой опоздал :) Synplify нормально понимает tru-dualport во всяком случае для Xilinx. module n_dpram #(parameter WHD = 8, WHA = 8, N = 8 ) ( input clk_a , input [WHA-1:0] addr_a [0:N-1], input [WHD-1:0] din_a [0:N-1], input [ N-1:0] wr_a , output logic [WHD-1:0] dou_a [0:N-1], input clk_b , input [WHA-1:0] addr_b [0:N-1], input [WHD-1:0] din_b [0:N-1], input [ N-1:0] wr_b , output logic [WHD-1:0] dou_b [0:N-1] ); generate genvar ii; for (ii=0; ii<N; ii++) begin logic [WHD-1:0] mem [0:(1<<WHA)-1]; always_ff @(posedge clk_a) begin :port_a if (wr_a[ii]) mem[addr_a[ii]]<=din_b[ii]; dou_a[ii]<=mem[addr_a[ii]]; end always_ff @(posedge clk_b) begin :port_b if (wr_b[ii]) mem[addr_b[ii]]<=din_b[ii]; dou_b[ii]<=mem[addr_b[ii]]; end end endgenerate endmodule Успехов! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 26 марта, 2015 Опубликовано 26 марта, 2015 · Жалоба Приветствую! Ой опоздал :) Synplify нормально понимает tru-dualport во всяком случае для Xilinx. module n_dpram #(parameter WHD = 8, WHA = 8, N = 8 ) ( input clk_a , input [WHA-1:0] addr_a [0:N-1], input [WHD-1:0] din_a [0:N-1], input [ N-1:0] wr_a , output logic [WHD-1:0] dou_a [0:N-1], input clk_b , input [WHA-1:0] addr_b [0:N-1], input [WHD-1:0] din_b [0:N-1], input [ N-1:0] wr_b , output logic [WHD-1:0] dou_b [0:N-1] ); generate genvar ii; for (ii=0; ii<N; ii++) begin logic [WHD-1:0] mem [0:(1<<WHA)-1]; always_ff @(posedge clk_a) begin :port_a if (wr_a[ii]) mem[addr_a[ii]]<=din_b[ii]; dou_a[ii]<=mem[addr_a[ii]]; end always_ff @(posedge clk_b) begin :port_b if (wr_b[ii]) mem[addr_b[ii]]<=din_b[ii]; dou_b[ii]<=mem[addr_b[ii]]; end end endgenerate endmodule Успехов! Rob. спасибо, буду знать... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Jackov 1 26 марта, 2015 Опубликовано 26 марта, 2015 · Жалоба Категорически нельзя в разных always заносить в одну переменную какие либо значения. Именно поэтому нельзя описать dual clock память на HDL. А я вот даже не знаю, можно ли вообще двухклоковую память самому создать. Имеется в виду на логике, на обычных триггерах. Скорее всего там используются специальные двухклоковые триггеры. Я прав? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 26 марта, 2015 Опубликовано 26 марта, 2015 · Жалоба Synplify нормально понимает tru-dualport во всяком случае для Xilinx. У меня с этим кодом те же "can't resolve multiple drivers", как и для любого из вариантов, которые я только пытался придумать, когда в двух always заношу данные в одну и ту же переменную (массив). а precision без вопросов! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 26 марта, 2015 Опубликовано 26 марта, 2015 · Жалоба Скорее всего там используются специальные двухклоковые триггеры. Я прав? у каждого входа - свой клок, не 2 разных одновременно для каждого из 2 входов, потому двухклоковые триггеры наверное не нужны... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 26 марта, 2015 Опубликовано 26 марта, 2015 · Жалоба там используются специальные двухклоковые триггеры. Я прав? Нет. Там, вообще, используются защелки - LATCH - из слабых транзисторов. А из клоков и WE формируется логикой импульс разрешения записи, который прямо на выход подает сильный уровень, который перебрасывает защелку в новое состояние. Построение памяти на триггерах - это голимое расточительство. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Jackov 1 26 марта, 2015 Опубликовано 26 марта, 2015 · Жалоба Нет. Там, вообще, используются защелки - LATCH - из слабых транзисторов. А из клоков и WE формируется логикой импульс разрешения записи, который прямо на выход подает сильный уровень, который перебрасывает защелку в новое состояние.Тогда этот импульс совсем тонкий. Проводил когда-то эксперимент, даже на совсем незначительном расхождении фронтов на клоках всё нормально отрабатывалось. Построение памяти на триггерах - это голимое расточительство.А мне как-то раз пришлось. В первом Сыклоне вся хардовая память кончилась, пришлось слов на 50 16-разрядных делать, но это был обычный регистровый файл. Кстати, ради интересу, пытался создать полноценную двухпортовую память на триггерах. Уже не помню чем кончилось, но помню что почти работало. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 26 марта, 2015 Опубликовано 26 марта, 2015 · Жалоба Тогда этот импульс совсем тонкий. По-разному. Обычно, в пол-клока. Тоньше делать нет смысла. То есть, на входе по шине данных стоит триггер, который защелкивает данное по фронту клока, а затем, управление защелкой, которая открывается, пропуская данное, в момент защелкивания данных триггером, и закрывается, защелкивая данное, через пол-периода клока. Поэтому данное оказывается "как бы защелкнутым" сразу после фронта. А с целью предотвращения конфликта двух усилителей записи (сквозного тока), сигнал разрешения первого сбрасывается сигналом разрешения последующего, если импульсы записи пересеклись по времени на одной линии записи. А мне как-то раз пришлось. Я не про ПЛИС, а про разработку, собственно, самой блочной памяти. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться