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

As simon says, you can use a flag with a generate - if you put this code into some utility package, you can use it throughout your design. Or just add it to the local architecture if it's a one-off:

constant in_simulation : boolean := false
--synthesis translate_off
                                    or true
--synthesis translate_on
;

A potentially useful alternative is:

constant in_simulation : integer  := 0
--synthesis translate_off
                                    + 1
--synthesis translate_on
;

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

Which can be used, in your case, to do:

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

It is correct that the simulator is giving you a syntax error, because you have two generic statements in the code.

The easiest way to do this is to make 50000 your default value in your design and then modify your code to this:

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

This way, for simulation, you get the clkmax set to 4, and for synthesis it will be set to the default value of 50000.

于 2012-10-21T21:07:59.120 に答える
1

You could use the generate statement in combination with a boolean flag in a package.

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;

You might be able to write a simple simulation/synthesis script that sets the SIMULATION_FLAG before compiling your sources (or just change it manually if you don't have to do it often).

于 2012-10-22T07:43:59.780 に答える