Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблема с TRI буферами в EPF10K10QC208-3
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
GW83
Доброго времени суток.

У меня есть проект в Quartus II 8.0 Web Edition, AHDL, EPF10K10QC208-3.

Когда я пытаюсь ко всем используемым 108 выводам подсоединить примитив TRI с управлением своим сигналом oe от регистра для каждого выхода, Quartus пишет, что не может это синтезировать с ошибкой типа:
Error: Node "out[48]~156" of type logic cell has no legal location
Error: Can't find fit
где out - BIDIR port, который привязан к внешним выводам ПЛИС.

Fitter effort установлено в Standard Fit.
В то же время, если использовать один сигнал oe для группы выводов - например, 2 группы по 54 вывода, структура синтезируется.
Никаких присваиваний, кроме присваиваний элемнтов шины out внешним выводам, и других портов, выполнено не было.

Означает ли это сообщение, что такую структуру синтезировать в этой м/c в принципе нельзя?
DmitryR
Посмотрите, register duplication включено? Трассировочных ресурсов для разводки одного OE на все выводы может быть в самом деле недостаточно, однако почему тогда компилятор не дублирует источник автоматически - неясно.
GW83
Цитата(DmitryR @ Jan 11 2010, 18:47) *
Посмотрите, register duplication включено? Трассировочных ресурсов для разводки одного OE на все выводы может быть в самом деле недостаточно, однако почему тогда компилятор не дублирует источник автоматически - неясно.

Когда один сигнал OE на все выводы, то как раз все нормально синтезируется. Проблемы при попытке использовать свой отдельный сигнал OE для каждого вывода.
Register duplication опция почему-то отсутствует в Fitter Settings->More settings для данного проекта.
На странице Physical Synthesis Optimizations вообще все контролы, включая Perform register duplication, неактивны (не действуют и рисуются серым текстом).
DmitryR
Я вас неправильно понял. Судя по этому

Цитата(GW83 @ Jan 11 2010, 12:42) *
В то же время, если использовать один сигнал oe для группы выводов - например, 2 группы по 54 вывода, структура синтезируется.


у этого кристалла один OE на банк. Посмотрите документацию внимательно.
GW83
Цитата(DmitryR @ Jan 12 2010, 11:49) *
у этого кристалла один OE на банк. Посмотрите документацию внимательно.

Извините, а вы бы не могли привести ссылку, где именно это указано. Я читаю документ dsf10k.pdf - FLEX 10K Embedded Programmable Logic Device Family Data Sheet, там на странице 30 есть картинка, где для каждого вывода есть свой регистр для хранения значения OE. При попытке компиляции, независимо от опций fitter-а, ругается всегда сначала на 49-й провод шины. До него 48 выводов с отдельными сигналами OE для каждого синтезируются нормально. Похоже проблема где-то в другом месте.
DmitryR
Я написал, что я так предполагаю. То есть если в проекте оставить 48 выводов с разными OE, он отсинтезируется?
GW83
То есть если в проекте оставить 48 выводов с разными OE, он отсинтезируется?
ДА. Более точно, первые 47 синтезируются (нумерация с 1), последний - подсоединен к PIN_120, а на 48-м, который назначен на PIN_119, происходит первая такая ошибка. Если отключить этот вывод, и попробовать синтезировать, то такое же сообщение (типа Error: Node "out[XX]~156" of type logic cell has no legal location) появляется и на несколько других из оставшихся используемых 108. Если их выборочно отключить, то структура с оставшимися выводами синтезируется.
DmitryR
Думаю, что трассировочных ресурсов не хватает, и тогда с этим ничего не сделать. Попробуйте уменьшить количество сигналов, идущих к IO. Например посмотрите, как формируется логика set/reset для триггеров данных и OE: если каждый триггер еще и свою логику сброса имеет - точно никаких ресурсов не хватит.
sazh
Цитата(GW83 @ Jan 13 2010, 10:29) *
То есть если в проекте оставить 48 выводов с разными OE, он отсинтезируется?


А Вы сбросьте ограничения на пины I/O и посмотрите. У Вас всего 134 I/O.
Проект покажите. Он же примитивный. Чего гадать.
GW83
Цитата(sazh @ Jan 13 2010, 11:19) *
А Вы сбросьте ограничения на пины I/O и посмотрите. У Вас всего 134 I/O.
Проект покажите. Он же примитивный. Чего гадать.

При удалении assignments пинов появляются те же ошибки, но для других выводов.
Часть проекта в AHDL, где назначаются выходы:

CODE

INCLUDE "lpm_decode.inc";

SUBDESIGN ssi
(
out[108..01] :BIDIR;
D[7..0] :BIDIR;
A[7..0] :INPUT;
nRD :INPUT;
nWR :INPUT;
nCS :INPUT;
-- ALE :INPUT;
)

Variable
decmem0 : lpm_decode WITH (LPM_WIDTH=4, LPM_DECODES=14,LPM_PIPELINE=0);
reg_out[13..00][07..00] : DFFE; -- addresses 0..13
reg_oute[13..00][07..00] : DFFE; -- addresses 16..39
dtri[07..00] : TRI;
outtri[13..00][07..00] : TRI;
BEGIN
decmem0.data[] = a[3..0];
decmem0.enable = !nCS;

reg_out[][].prn = vcc;
reg_out[][].clrn = vcc;
reg_out[][].d = D[];
reg_out[][].clk = nWR;

reg_oute[][].prn = vcc;
reg_oute[][].clrn = vcc;
reg_oute[][].d = D[];
reg_oute[][].clk = nWR;

-- generation of input structure
for i in 0 to 13 generate
reg_out[i][].ena = decmem0.eq[i] & !nCS & !a[4];
reg_oute[i][].ena = decmem0.eq[i] & !nCS & a[4];
end generate;
-- generation of output structure
for i in 0 to 12 generate
outtri[i][].oe = reg_oute[i][].q;
outtri[i][].in = VCC; --reg_out[i][].q;
out[i*8+8..i*8+1] = outtri[i][].out;
end generate;
outtri[13][3..0].in = reg_out[13][3..0].q;
out[108..105] = outtri[13][3..0].out;
END;
sazh
Цитата(GW83 @ Jan 13 2010, 16:56) *
При удалении assignments пинов появляются те же ошибки, но для других выводов.
Часть проекта в AHDL, где назначаются выходы:


А зачем в этом куске двунаправленные входы выходы. Если что не получается, оформите как модуль с входами и выходами по третьему состоянию.
а на верхнем уровне уже bidir
Во всяком случае 8 квартус кушает 112 управляемы выходов по третьему состоянию на 10к10_208 (в максе работать это не будет)
CODE

module tri_oe
(
input clk,
input [7:0] data,
input ena,
input [3:0] sel,
output [111:0] out
);


reg [7:0] rg_dffe [13:0];

wire [111:0] rg;

integer i;
always @(posedge clk)
begin
for (i=0; i<=13 ; i=i+1)
if ((sel == i) && ena) rg_dffe[i] <= data;
end

genvar j;
generate for(j=0; j<=13; j=j+1)
begin:block
assign rg[j*8+7:j*8] = rg_dffe[j];
end
endgenerate

genvar l;
generate for(l=0; l<=111; l=l+1)
begin:tri_oe
assign out[l] = rg[l] ? 1'b0 : 1'bz;
end
endgenerate

endmodule
GW83
sazh
У меня это не скомпилировалось.
А зачем в этом куске двунаправленные входы выходы. Если что не получается, оформите как модуль с входами и выходами по третьему состоянию.
а на верхнем уровне уже bidir

А это и есть верхний уровень. (ssi design entity). Двунаправленные выводы нужны, так как нужно и устанавливать значения на них, и считывать, что реально там снаружи есть после установки.
sazh
Цитата(GW83 @ Jan 15 2010, 10:21) *
sazh
У меня это не скомпилировалось.


Странно. верилог 2001 в 8 квартусе. (В 9 эту серию убрали)
В любом случае на строку ""Когда я пытаюсь ко всем используемым 108 выводам подсоединить примитив TRI с управлением своим сигналом oe от регистра для каждого выхода"" можно сказать, что примитив TRI и на 112 выводах управляется в этом кристалле.
Что касается двунаправленных входов выходов, то если их тоже 112. может и не получится.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.