我是VHDL新手,正在做一项家庭作业。
我有一个非常简单的时钟分频器使用一个通用的。(它是一个计数器/分频器。)
-- the actual divider will be 2.1e6 or so (25Mhz down to 15hz)
run_divider : clk_divider
--pragma synthesis off
generic map(clkmax => 4) -- simulation
--pragma synthesis on
generic map(clkmax => 50000) -- synthesis
port map( clk_in => mclk,
reset => rst,
clk_out => divider_out );我在上面的杂注中部分使用了Equivalent of #ifdef in VHDL for simulation/synthesis separation?。然而,这只在合成中起作用,但在模拟中是一个语法错误。
除了使用外部工具(如另一个答案所建议的M4,C预处理器)之外,有没有更好的方法来使用单独的代码来进行综合和仿真?当我从合成切换到模拟时,我不想再担心这些常量了。
How to convert 24MHz and 12MHz clock to 8MHz clock using VHDL?的答案告诉我计数器/分频器不是一个最优的解决方案,但它对于我的家庭作业来说已经足够简单了:-)
我的完整分隔符代码在这里:https://github.com/linuxlizard/vhdl/blob/master/divider.vhdl
谢谢!
发布于 2012-10-22 18:24:13
正如西蒙所说,您可以将标志与generate一起使用--如果您将此代码放入某个实用程序包中,则可以在整个设计中使用它。或者,如果它是一次性的,则将其添加到本地体系结构中:
constant in_simulation : boolean := false
--synthesis translate_off
or true
--synthesis translate_on
;一个潜在有用的替代方案是:
constant in_simulation : integer := 0
--synthesis translate_off
+ 1
--synthesis translate_on
;
constant in_synthesis : integer := 1
--synthesis translate_off
- 1
--synthesis translate_on
;在你的例子中,它可以用来做:
constant clkmax_coefficient : integer := 4*in_simulation + 50000*in_synthesis;
run_divider : clk_divider
generic map(clkmax => clkmax_coefficient)
...发布于 2012-10-22 05:07:59
模拟器给出了一个语法错误,这是正确的,因为代码中有两个通用语句。
最简单的方法是在设计中将50000设置为默认值,然后将代码修改为:
-- the actual divider will be 2.1e6 or so (25Mhz down to 15hz)
run_divider : clk_divider
--pragma synthesis off
generic map(clkmax => 4) -- simulation
--pragma synthesis on
port map( clk_in => mclk,
reset => rst,
clk_out => divider_out );这样,对于模拟,您将clkmax设置为4,而对于合成,它将设置为默认值50000。
发布于 2012-10-22 15:44:00
您可以在包中结合使用boolean标志和generate语句。
g_simulation : if SIMULATION_FLAG generate
run_divider : clk_divider
generic map(clkmax => 4) -- simulation
port map(clk_in => mclk,
reset => rst,
clk_out => divider_out);
end generate g_simulation;
g_synthesis : if not SIMULATION_FLAG generate
run_divider : clk_divider
generic map(clkmax => 50000) -- synthesis
port map(clk_in => mclk,
reset => rst,
clk_out => divider_out);
end generate g_synthesis;您可以编写一个简单的模拟/合成脚本,在编译源代码之前设置SIMULATION_FLAG (或者,如果您不需要经常这样做,也可以手动更改它)。
https://stackoverflow.com/questions/12998658
复制相似问题