Ясно определите, как LUT и срезы используются в инструменте Xilinx XST? - PullRequest
5 голосов
/ 02 марта 2011

Я пытаюсь реализовать очень специфическое поведение LUT и срезов, написанных на VHDL для FPGA Xilinx Virtex 5, синтезированных с использованием инструмента (ов) XST. Я не знаю, смогу ли я достичь своего поведения, имея в виду инструменты , вывод , что я имею в виду, так как я могу явно указать, чтобы это произошло?

Я говорю об использовании LUT с 6 входами на Virtex5, из которых 4 в CLB.

Я хочу прямо заявить: - Входы в каждую из 4 LUT в одном срезе CLB - Направьте выходы 'S' из 4 XORCY - Укажите ВХОД «первого» MUXCY (C0) - Маршрут ВЫХОДА "4-го" MUXCY (Cn) - Уметь указывать входы каждой LUT CLB в определенном порядке, поскольку они, очевидно, каскадные.

В идеале я хотел бы просто создать экземпляр 'CLB' в VHDL со всеми входами и выходами и иметь возможность отобразить их ..

Я довольно много изучил документацию и ничего не нашел на самом деле

Ответы [ 2 ]

7 голосов
/ 08 мая 2011

Саар предлагает вам использовать LUT6 для явного создания LUT. Я предпочитаю управлять технологическим сопоставлением с ограничением LUT_MAP. Это требует меньшего количества обслуживания, и ваш код HDL остается независимым от устройства и дружественным к симулятору.

Вот пример.

(* LUT_MAP="yes" *)
module mux4(sel, a, b, c, d, o);
input [1:0] sel;
input       a;
input       b;
input       c;
input       d;
output reg  o;

always @* begin
    case(sel)
    2'b00: o <= a;
    2'b01: o <= b;
    2'b10: o <= c;
    2'b11: o <= d;
    endcase
end
endmodule

Это позволяет вам написать произвольную комбинационную логику и сказать синтезу (XST), что этот (до 6 входов, один выход) модуль должен быть реализован в одной LUT. Если вы комбинируете это с ограничениями KEEP_HIERARCHY и RLOC, вы можете создавать RPM (реляционные макросы).

(* KEEP_HIERARCHY="true" *)
module mux4x4p4(sel, a, b, c, d, o);
input  [1:0] sel;
input  [3:0] a;
input  [3:0] b;
input  [3:0] c;
input  [3:0] d;
output [3:0] o;

(* RLOC="X0Y0" *)
mux4 m0(sel, a[0], b[0], c[0], d[0], o[0]);
(* RLOC="X0Y0" *)
mux4 m1(sel, a[1], b[1], c[1], d[1], o[1]);
(* RLOC="X0Y0" *)
mux4 m2(sel, a[2], b[2], c[2], d[2], o[2]);
(* RLOC="X0Y0" *)
mux4 m3(sel, a[3], b[3], c[3], d[3], o[3]);
endmodule

Более подробную информацию о RPM для каналов данных можно найти на моем старом веб-сайте www.fpgacpu.org. Например, Art of High Performance FPGA Design: http://www.fpgacpu.org/log/aug02.html#art

Счастливого взлома!

2 голосов
/ 02 марта 2011

Вы можете достичь желаемого поведения, используя ограничения RLOC и BEL. Вы можете встроить ограничения в VHDL:

VHDL Syntax

Declare the VHDL constraint as follows:
attribute bel : string;

Specify the VHDL constraint as follows:
attribute bel of {component_name| label_name}: {component|label} is {F|G|FFA|FFB|FFC|FFD|FFX|FFY|XORF|XORG|A6LUT|B6LUT|C6LUT|D6LUT|A5LUT|B5LUT|C5LUT|D5LUT}";

Более подробную информацию смотрите в Руководстве по ограничениям Xilinx.

См. Также этот пост на comp.arch.fpga для примера VHDL: http://newsgroups.derkeiler.com/Archive/Comp/comp.arch.fpga/2008-05/msg00560.html

...