2012-01-09 116 views
3

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

the source question

+0

许多感谢您的帮助!总结一下:我刚刚在代码段中添加了--pragma/synthesis translate_off和 - synthesis/pragma translate_on,这些onlu应该在模拟器中使用。 http://code.google.com/p/pakorobiol/source/browse/trunk/c25Board.vhd – nulleight 2012-01-09 22:03:39

回答

3

你们是不是要推断你的代码ROM的?如果你正在使用LPM功能,那么一切都应该“正常工作”。

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

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

供参考,在这里是有点我的代码在ModelSim的正确模拟直接实例ROM宏功能(注意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 
); 

如果你真的需要做一些不同的模拟VS时。综合,有几种方法可以去做。对于简单的事情,你可以使用类似下面的指令:

--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

你应该能够找到很多通过互联网搜索这些指令的真实世界的例子,我已经包括下面一个例子(上电复位在实际硬件上运行时,模拟与时越短):

-- 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)。只要做一些适合你的工作流程和团队动态/文化的东西。

4

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

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

这个常数会'1'只有当你合成这种使用Altera的Quartus。

更多关于各种VHDL metacomment编译的位置:http://www.sigasi.com/content/list-known-vhdl-metacomment-pragmas

+0

谢谢,这正是我需要的! – nulleight 2012-01-09 21:45:51

+0

@nulleight你好。如果这能解决你的问题,那么如果你能“接受”答案,那将是非常好的。 – Philippe 2012-01-10 08:52:26