本网站提供多种可用的VHDL组件。现代FPGA综合软件支持混合语言设计,因此所有这些组件既可用于VHDL设计,也可用于Verilog设计。
在Verilog模块中实例化VHDL组件非常简单,其语法与实例化Verilog模块本身完全一致:
<vhdl_component_name> # ( <generic_values_list> )
<instance_name> ( <port_map_list> );
以下是一个在顶层Verilog模块中实例化VHDL组件的设计示例。该设计通过两次实例化这个消抖VHDL组件,对两个按钮进行消抖处理。此处展示了VHDL组件的实体代码:
ENTITY debounce IS
GENERIC(
clk_freq : INTEGER := 50_000_000; --system clock frequency in Hz
stable_time : INTEGER := 10); --time button must remain stable in ms
PORT(
clk : IN STD_LOGIC; --input clock
reset_n : IN STD_LOGIC; --asynchronous active low reset
button : IN STD_LOGIC; --input signal to be debounced
result : OUT STD_LOGIC); --debounced signal
END debounce;
要在Verilog中实例化该VHDL组件,只需声明组件并使用标准Verilog语法,将通用参数和端口映射到Verilog模块中对应的参数和端口。下面的Verilog示例代码根据参数和端口的列出顺序推断映射关系。50_000_000被映射到 clk_freq 通用参数,10被映射到 stable_time 通用参数,列出的Verilog端口按VHDL组件实体中声明的顺序映射到VHDL端口。
module verilog_debounce(
input clk, //system clock
input reset_n, //asynchronous active low reset
input [1:0] button, //two input signals to be debounced
output [1:0] result //two debounced signals
);
debounce #(50_000_000,10) //VHDL component name and generic parameter mapping
debounce_0(clk,reset_n,button[0],result[0]); //instance name and port mapping for first signal
debounce #(50_000_000,10) //VHDL component name and generic parameter mapping
debounce_1(clk,reset_n,button[1],result[1]); //instance name and port mapping for second signal
endmodule
所有其他Verilog语法和功能同样适用。因此,也可以采用显式映射方式(同时列出Verilog和VHDL端口)。生成语句可以创建同一组件的多个实例,等等。
混合语言设计是数字设计师的重要利器。它显著增加了可用IP核库的规模。
代码下载
verilog_debounce.v (1.7 KB)
debounce.vhd (3.1 KB)