由于在FPGA开发过程中,多人合作时可能遇到有人使用verilog hdl,有人遇到VHDL的情况,这就涉及到了verilog hdl与VHDL的相互调用。 1. VHDL调用Verilog VHDL调用verilog hdl相对比较麻烦,需要先将verilog的模块(module)做成VHDL的元件(component),再进行调用。例如下面的例子:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use work.dt16_pkg.all;
entity clk_alm is
port (
reset : in std_logic;
fck32m : in std_logic; --来自背板的32M帧头
clk32m : in std_logic; --来自背板的32M时钟
refclk2m : in std_logic; --2M参考时钟
clklos : out std_logic --时钟告警输出
);
end clk_alm;
architecture arch_clk_alm of clk_alm is
component clk_dog --clk_dog模块元件化
port(
reset : in std_logic;
clock : in std_logic;
refclk : in std_logic;
alm : out std_logic
);
end component;
component ALM --ALM模块元件化
port( XMCLK : in std_logic;
RST : in std_logic;
M_CLK : in std_logic;
LOST_ALM : out std_logic
);
end component;
-- 定义信号
signal alm_clk: std_logic;
signal alm_fck: std_logic;
signal refclk2m_div: std_logic;
signal count: std_logic_vector(2 downto 0);
signal delay_los: std_logic;
begin
clk_dog0: clk_dog -- clk_dog元件例化
port map (
reset => reset,
clock => clk32m,
refclk => refclk2m,
alm => alm_clk
);
fck_dog0: ALM -- ALM元件例化
port map(
XMCLK => fck32m,
RST => reset,
M_CLK => refclk2m_div,
LOST_ALM => alm_fck
);
-- 流程逻辑
process(reset,refclk2m)
begin
if reset='1' then
count<=(others=>'0');
elsif refclk2m'event and refclk2m='1' then
count<=count+1;
end if;
end process;
refclk2m_div<=count(2);
clklos<=not(alm_clk and alm_fck);
end arch_clk_alm;
2. Verilog调用VHDL Verilog hdl调用VHDL很简单,只需要把VHDL的实体(entity)当成一个verilog模块(module)即可按verilog的格式调用。例程如下:
module t_sim(
);
reg clk;
reg en;
wire [16:0]length;
initial
begin
clk = 1;
en = 0;
end
initial #10 en = 1;
t_model t( //仿真t_model模块,直接调用即可
.clk(clk),
.en(en),
.length(length),
);
endmodule
3. 总结 总的来说,verilog与VHDL的混用也就是相互调用的方式,就是将对方当成自己的模块,然后按自己本身的语法来调用即可。即: Verilog调用VHDL是将VHDL的实体(entity)当成verilog中的模块(module)来调用; VHDL调用verilog是将verilog的模块(module)当成VHDL中的实体(entity)来调用,先元件化,再例化。 |