我想使用相同的源代码但略有不同来构建两个 FPGA。
变化是根据库文件中定义的常量来定义的。 某些实例根据此设置启用或禁用。
对于一个构建,我需要这样的东西:
constant CONFIG_EN : std_logic_vector(3 downto 0) := "1001"
另一个版本我需要这个设置:
constant CONFIG_EN : std_logic_vector(3 downto 0) := "1111"
实施它的最佳方法是什么?
我可以在库文件中执行类似以下操作吗?:
-- User-defined before each build
build1 = 0
if(build1) then
constant CONFIG_EN : std_logic_vector(3 downto 0) := "1001"
else
constant CONFIG_EN : std_logic_vector(3 downto 0) := "1111"
如果不是,最好的方法是什么?
在包中定义它。
文件:ConfigPkg_build1.vhd
package ConfigPkg is
constant CONFIG_EN : std_logic_vector(3 downto 0) := "1001" ;
end package ConfigPkg ;
文件:ConfigPkg_build2.vhd
package ConfigPkg is
constant CONFIG_EN : std_logic_vector(3 downto 0) := "1111" ;
end package ConfigPkg ;
然后让您的编译脚本根据您使用的版本决定要编译哪个文件。
或者,您可以在设计上使用通用来指定您正在使用的构建。下面的代码让您了解如何处理这个问题。
entity top is
generic (BUILD: integer) ;
port ( . . . ) ;
end entity top ;
architecture struct of top is
function IfElse (Sel : boolean ; A, B : std_logic_vector) return std_logic_vector is
begin
if Sel then
return A ;
else
return B ;
end if ;
end function IfElse ;
constant CONFIG_EN : std_logic_vector(3 downto 0) := IfElse(BUILD = 1, "1001", "1111") ;
begin
. . .
我可能会使用基于包的方法。通用方法要求您在某处指定通用值 - 可能在工具命令行上。
我还应该注意到,VHDL-2019 支持条件表达式和条件分析(编译)。对于条件表达式,我们将不需要函数 IfElse。请务必告诉您的供应商您希望他们实施 VHDL-2019。从仿真角度来看,Aldec 已经实现了 VHDL-2019 的大部分内容,其他商业供应商似乎落后了。
基于包的方法很好而且清晰。但我要注意模拟的一些问题。如果我使用 ConfigPkg_build1.vhd 打包 ipcore1(例如 Vivado ipcore),使用 ConfigPkg_build2.vhd 打包 ipcore2,那么由于脱离上下文综合,可能不会出现实现问题。但是,如果我在同一个项目中同时使用 ipcore1 和 ipcore2 并尝试模拟它,模拟器会采用哪个同名包?可能最后成功编译了。是否可以让 em 将这些包分开?