当前位置: 主页 > 硬件 >

Verilog和VHDL混合仿真

时间:2019-05-07  作者:haden   点击:
【摘要】 由于在FPGA开发过程中,多人合作时可能遇到有人使用verilog hdl,有人遇到VHDL的情况,这就涉及到了verilog hdl与VHDL的相互调用。
 由于在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)来调用,先元件化,再例化。




顶一下
(1)
100%
踩一下
(0)
0%
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
验证码: 点击我更换图片