首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >独立时钟分频器的综合与仿真

独立时钟分频器的综合与仿真
EN

Stack Overflow用户
提问于 2012-10-21 22:19:02
回答 3查看 877关注 0票数 1

我是VHDL新手,正在做一项家庭作业。

我有一个非常简单的时钟分频器使用一个通用的。(它是一个计数器/分频器。)

代码语言:javascript
复制
-- 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

谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-10-22 18:24:13

正如西蒙所说,您可以将标志与generate一起使用--如果您将此代码放入某个实用程序包中,则可以在整个设计中使用它。或者,如果它是一次性的,则将其添加到本地体系结构中:

代码语言:javascript
复制
constant in_simulation : boolean := false
--synthesis translate_off
                                    or true
--synthesis translate_on
;

一个潜在有用的替代方案是:

代码语言:javascript
复制
constant in_simulation : integer  := 0
--synthesis translate_off
                                    + 1
--synthesis translate_on
;

constant in_synthesis : integer  := 1
--synthesis translate_off
                                    - 1
--synthesis translate_on
;

在你的例子中,它可以用来做:

代码语言:javascript
复制
constant clkmax_coefficient : integer := 4*in_simulation + 50000*in_synthesis;

run_divider : clk_divider
    generic map(clkmax => clkmax_coefficient)
...
票数 2
EN

Stack Overflow用户

发布于 2012-10-22 05:07:59

模拟器给出了一个语法错误,这是正确的,因为代码中有两个通用语句。

最简单的方法是在设计中将50000设置为默认值,然后将代码修改为:

代码语言:javascript
复制
    -- 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。

票数 1
EN

Stack Overflow用户

发布于 2012-10-22 15:44:00

您可以在包中结合使用boolean标志和generate语句。

代码语言:javascript
复制
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 (或者,如果您不需要经常这样做,也可以手动更改它)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12998658

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档