我的项目是用便携式VHDL(主要用GHDL开发)编写的,但我想利用供应商特定的原语(例如乘法器)。
E.g。在C / C ++中,您可以使用#ifdef有条件地选择不同的代码片段,具体取决于CPU架构或编译器供应商等。
您是否可以在VHDL中使用任何类似的内容,例如区分Xilinx或Altera / Intel目标?
答案 0 :(得分:2)
您可以使用generate
语句和供应商特定实体+架构。 PoC-Library大量使用此技术来创建vendor independent IP cores。
例如,看一下PoC的片上存储器(ocram)抽象层:PoC.mem.ocram.tdp
gAltera: if not SIMULATION and (VENDOR = VENDOR_ALTERA) generate
component ocram_tdp_altera
generic (
A_BITS : positive;
D_BITS : positive;
FILENAME : string := ""
);
port (
clk1 : in std_logic;
clk2 : in std_logic;
ce1 : in std_logic;
ce2 : in std_logic;
we1 : in std_logic;
we2 : in std_logic;
a1 : in unsigned(A_BITS-1 downto 0);
a2 : in unsigned(A_BITS-1 downto 0);
d1 : in std_logic_vector(D_BITS-1 downto 0);
d2 : in std_logic_vector(D_BITS-1 downto 0);
q1 : out std_logic_vector(D_BITS-1 downto 0);
q2 : out std_logic_vector(D_BITS-1 downto 0)
);
end component;
begin
-- Direct instantiation of altsyncram (including component
-- declaration above) is not sufficient for ModelSim.
-- That requires also usage of altera_mf library.
ram_altera: ocram_tdp_altera
generic map (
A_BITS => A_BITS,
D_BITS => D_BITS,
FILENAME => FILENAME
)
port map (
clk1 => clk1,
clk2 => clk2,
ce1 => ce1,
ce2 => ce2,
we1 => we1,
we2 => we2,
a1 => a1,
a2 => a2,
d1 => d1,
d2 => d2,
q1 => q1,
q2 => q2
);
end generate gAltera;
这里,它实例化Altera器件的特殊实体。对于其他器件(Xilinx,Lattice),使用通用VHDL实现。此外,还使用特殊模型进行仿真,因为供应商原语并未模拟FPGA器件文档中记录的实际行为(例如,在存储器指南中)。