我必须从文件中加载ROM。 Quartus可以直接使用.mif
文件,也可以使用textio编写的模拟器(一个快速且脏的).mif
文件解析器。有没有办法检测合成器工具(在我的情况下是Quartus)并且只有在合成器工具没有编译时才生成textio文件加载器进程?
答案 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
你应该能够通过互联网搜索找到很多这些指令的实际例子,我在下面列举了一个例子(模拟时的开机复位时间与在真实硬件中运行时相比更短): / 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)。只需做一些适合您的工作流程和团队动态/文化的事情。