我正在尝试实现LUT和切片的一些非常具体的行为,用VHDL编写,用于使用XST工具合成的Xilinx Virtex 5 FPGA。我不知道是否可以通过使用推断的工具来实现我的行为,那么我该如何明确指出这种情况呢?
我说的是在Virtex5上使用6输入LUT,其中有4个在CLB中。
我想明确说明: - 输入到一个CLB切片中的4个LUT中的每一个 - 路由4次XORCY中的“S”输出 - 指定'第一个'MUXCY(C0)的INPUT - “第4个”MUXCY(Cn)的路由输出 - 能够按特定顺序指定CLB的每个LUT的输入,因为它们显然是级联的。
理想情况下,我喜欢用VHDL实例化一个带有所有输入和输出的'CLB',并能够映射这些......
我对文档进行了大量研究,但没有发现任何真正的
答案 0 :(得分:7)
Saar建议您使用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
我的旧网站www.fpgacpu.org上有关于数据路径的RPM的更多信息。例如,高性能FPGA设计的艺术:http://www.fpgacpu.org/log/aug02.html#art
快乐的黑客攻击!
答案 1 :(得分:2)
您可以使用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约束指南以获取更多详细信息。
有关示例VHDL,请参阅comp.arch.fpga上的这篇文章:http://newsgroups.derkeiler.com/Archive/Comp/comp.arch.fpga/2008-05/msg00560.html