合成与仿真独立时钟分频器

时间:2012-10-21 14:19:02

标签: vhdl

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

谢谢!

3 个答案:

答案 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(如果您不经常这样做,只需手动更改它)。