我是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
谢谢!
答案 0 :(得分:2)
正如simon所说,您可以使用带有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)
...
答案 1 :(得分:1)
模拟器给出语法错误是正确的,因为代码中有两个通用语句。
最简单的方法是在设计中将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。
答案 2 :(得分:1)
您可以将generate
语句与包中的boolean
标志结合使用。
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
(如果您不经常这样做,只需手动更改它)。