VHDL 2008对Generic有了显著的增强,不仅可以在entity中声明generic,还可以在package和function中声明generic。同时,generic支持type。我们看一个典型的案例。
在entity中声明generic
如下VHDL代码实现了一个二选一的MUX,这里将数据类型通过关键字type定义为dt。实例化时,根据需要将数据类型声明为期望的类型。
如下代码将MUX实例化两次,其中的数据类型分别为4bit std_logic和2bit std_logic。由此可以看到这种方式的灵活性。Vivado 2019.1开始支持该语法形式。
在Vivado中,打开Elaborated Design,可以查看相应的Schematic视图,如下图所示。
在package中声明generic
VHDL 2008支持在package中声明generic。从这个角度看,package类似于C++中的template。在使用带generic的package之前,要先对该package实例化。来看一个例子。
使用该package时,要先实例化,如下代码第1行和第2行所示,使用了关键字new。如果需要使用package中声明的数据类型,例如这里的cnt_type,需要明确指出是哪个实例化对象的cnt_type,所以需要添加work.cnt_top_pkg1。另一方面,如果该package只被实例化了一次,那么可以直接使用其内部声明的数据类型,不必添加work.cnt_top_pkg1。
Vivado 2019.1开始支持增强型generic。需要声明文件类型为VHDL 2008。可通过如下方式实现。在project模式下,可直接在Tcl Console中执行命令:
在non-project模式下,可同时对某一个文件或多个文件指定其为VHDL 2008。