如何检测编译器

时间:2012-01-09 00:05:39

标签: vhdl

我必须从文件中加载ROM。 Quartus可以直接使用.mif文件,也可以使用textio编写的模拟器(一个快速且脏的).mif文件解析器。有没有办法检测合成器工具(在我的情况下是Quartus)并且只有在合成器工具没有编译时才生成textio文件加载器进程?

the source question

2 个答案:

答案 0 :(得分:4)

您可以使用仅由特定综合工具接受的编译指示来检测综合工具。例如,您可以写:

constant isQuartus : std_logic := '1'
-- altera translate_off
and '0'
-- altera translate_on
;

只有使用Altera的Quartus合成时,此常量才为'1'

有关各种VHDL metacomment编译指示的更多信息,请访问:http://www.sigasi.com/content/list-known-vhdl-metacomment-pragmas

答案 1 :(得分:3)

您是否尝试从代码中推断出ROM?如果您正在使用LPM功能,那么一切都应该“正常工作”。

我在Quartus和ModelSim中使用ROM没有问题。只需使用MegaWizard插件为您的ROM创建一个自定义VHDL文件,并将其指向相应的初始化文件,或直接实例化altsyncram组件并包含init_file泛型。

然后正常编译或模拟。使用带有初始化ROM的ModelSim(Altera版本或独立版本)运行模拟没有问题,并且不必编写任何初始化代码来读取* .mif或* .hex文件。

作为参考,这里是一个直接实例化的ROM宏功能,来自我的一些代码,可以在ModelSim中正确模拟(注意init_file泛型):

-- Sine lookup table
sine_lut : altsyncram
generic map (
    clock_enable_input_a    => "BYPASS",
    clock_enable_output_a   => "BYPASS",
    init_file               => "./video/sine_rom-512x8.mif",
    intended_device_family  => "Arria GX ",
    lpm_hint                => "ENABLE_RUNTIME_MOD=NO",
    lpm_type                => "altsyncram",
    numwords_a              => 512,
    operation_mode          => "ROM",
    outdata_aclr_a          => "NONE",
    outdata_reg_a           => "UNREGISTERED",
    widthad_a               => 9,
    width_a                 => 8,
    width_byteena_a         => 1
)
port map (
    -- Read port
    clock0      => clk,
    address_a   => sine_addr,
    q_a         => sine_do
);

如果你真的需要在模拟和合成时做一些不同的事情,有几种方法可以解决它。对于简单的事情,您可以使用类似以下指令的内容:

--synthesis translate-off
<code for simulation only>
--synthesis translate-on

http://quartushelp.altera.com/11.1/master.htm#mergedProjects/hdl/vhdl/vhdl_file_dir_translate.htm?GSA_pos=5&WT.oss_r=1&WT.oss=--%20synthesis%20translate_off

你应该能够通过互联网搜索找到很多这些指令的实际例子,我在下面列举了一个例子(模拟时的开机复位时间与在真实硬件中运行时相比更短): / p>

-- Async. Power-on Reset, with de-assertion delay
process (clk)
begin
    if rising_edge (clk) then
        -- Create a delay at power-up
        if rst_PowerOn='1' then
            rst_pora    <= '1';
            rst_por_cnt <= (others=>'0');
        -- synthesis translate_off
        elsif rst_por_cnt(5)='1' then  -- 256 nS in simulation
            rst_pora    <= '0';
        -- synthesis translate_on
        elsif rst_por_cnt(19)='1' then -- 4ms in real hardware
            rst_pora    <= '0';
        else
            rst_por_cnt <= rst_por_cnt + 1;
        end if;
    end if;
end process;

对于更复杂的情况,请运用你的想象力。有些人在合成/模拟之前使用C预处理器,M4宏语言或类似的初步构建步骤。我有makefile和脚本将FileName.sim.vhdl(用于模拟)转换为FileName.vhdl(用于综合),使用一些文本实用程序处理它,根据我制定的规则评论/取消注释各种代码块,以便我可以维护两个版本都在一个文件中(想想像增强的C预处理器调整用于VHDL)。只需做一些适合您的工作流程和团队动态/文化的事情。