1

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

我在 VHDL 中部分使用了#ifdef 的等效项来进行模拟/综合分离?使用上面的编译指示。但是,这仅适用于综合,但在模拟中是语法错误。

除了使用外部工具(建议的另一个答案是 M4、C 预处理器)之外,还有没有更好的方法来为合成和模拟提供单独的代码?当我在综合和仿真之间切换时,我不想担心这些常数。

如何使用 VHDL 将 24MHz 和 12MHz 时钟转换为 8MHz 时钟的答案?告诉我计数器/分频器不是最佳解决方案,但它对我的作业来说足够简单:-)

我的完整分隔符代码在这里: https ://github.com/linuxlizard/vhdl/blob/master/divider.vhdl

谢谢!

4

3 回答 3

2

正如西蒙所说,您可以使用带有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-22T10:24:12.743 回答
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。

于 2012-10-21T21:07:59.120 回答
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在编译源代码之前设置它(或者如果您不需要经常手动更改它)。

于 2012-10-22T07:43:59.780 回答