Vhdl 明确定义如何在Xilinx XST工具中使用LUT和切片?

Vhdl 明确定义如何在Xilinx XST工具中使用LUT和切片?,vhdl,fpga,xilinx,Vhdl,Fpga,Xilinx,我正在尝试实现LUT和片的一些非常特定的行为,这些行为是用VHDL编写的,用于使用XST工具合成的Xilinx Virtex 5 FPGA。我不知道我是否可以通过工具推断出我的意思来实现我的行为,那么我如何明确地指导这一点呢 我说的是在Virtex5上使用6输入LUT,其中有4个在CLB中 我想明确指出: -一个CLB片内4个LUT中每个LUT的输入 -从4个XORCY路由“S”输出 -指定“第一个”MUXCY(C0)的输入 -“第四个”MUXCY的路由输出(Cn) -能够以特定顺序指定CLB的

我正在尝试实现LUT和片的一些非常特定的行为,这些行为是用VHDL编写的,用于使用XST工具合成的Xilinx Virtex 5 FPGA。我不知道我是否可以通过工具推断出我的意思来实现我的行为,那么我如何明确地指导这一点呢

我说的是在Virtex5上使用6输入LUT,其中有4个在CLB中

我想明确指出: -一个CLB片内4个LUT中每个LUT的输入 -从4个XORCY路由“S”输出 -指定“第一个”MUXCY(C0)的输入 -“第四个”MUXCY的路由输出(Cn) -能够以特定顺序指定CLB的每个LUT的输入,因为它们显然是级联的

理想情况下,我希望用VHDL实例化一个包含所有输入和输出的“CLB”,并能够映射这些


我对文档进行了大量的研究,但没有发现任何真正的

使用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示例:

Saar建议您使用LUT6显式实例化LUT。我更喜欢使用LUT_映射约束控制技术映射。它需要较少的维护,并且您的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
在我的旧网站www.fpgacpu.org上有关于数据路径RPM的更多信息。例如,高性能FPGA设计的艺术:


快乐的黑客

不是一个完整的答案,只是一个提示:是的,我认为这是可能的,我认为它被称为“宏”。它们在Xilinx文档中的某个地方被描述过(我知道,它很大,而且排列得不太清楚)。有一节描述了所有RTL组件以及推断它们的不同方法。使用Xilinx库和那些宏,您应该能够做到这一点。查找LUT5/6。LUT6描述和实例化模块(Verilog/VHDL)在第158页。我带着它,今晚开始合成,它工作得很好。使用LUT6和D和2实例化,我认为完全可以确保在CLB中得到想要的结果。我刚刚使用了LUT6_2和MUXCY,得到了我想要的。这可能有效,但我犹豫是否尝试。我的理由是,我以前尝试过使用属性来获取要使用的DSP资源,但发现它非常不可预测。在某些情况下,它会起作用,但在其他情况下,它似乎被完全忽视。我的同事们也遇到了完全相同的问题。特别是当设计变得很大时,许多属性设置似乎不可靠。你的回答可能是正确的,但只是分享我的经验。谢谢你
(* 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