VHDL 中自定义库的 if-else 条件

问题描述 投票:0回答:2

我想使用相同的源代码但略有不同来构建两个 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"

如果不是,最好的方法是什么?

vhdl fpga hdl vivado
2个回答
3
投票

在包中定义它。

文件: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 的大部分内容,其他商业供应商似乎落后了。


0
投票

基于包的方法很好而且清晰。但我要注意模拟的一些问题。如果我使用 ConfigPkg_build1.vhd 打包 ipcore1(例如 Vivado ipcore),使用 ConfigPkg_build2.vhd 打包 ipcore2,那么由于脱离上下文综合,可能不会出现实现问题。但是,如果我在同一个项目中同时使用 ipcore1 和 ipcore2 并尝试模拟它,模拟器会采用哪个同名包?可能最后成功编译了。是否可以让 em 将这些包分开?

© www.soinside.com 2019 - 2024. All rights reserved.