2017-03-09 10 views
0

て変化するパワーに数を上げ、私は、この相関テーブルを実装するプロセスを記述する必要がありました:はVHDL

E - > S

0 - > 2

1 - > 4

2 - > 8

3 - > 16

4 - > 32

5 - > 64

などです。

あなたは出力が容易に計算することができることをはっきりと見ることができます。

S = 1^(E+1) 

私は左シフトとVHDLでこれを行うことが可能であるかはわからないが。私が気にするのは、(E + 1)のサイズを事前に知らないので、0の数を追加する必要がないので、方程式の両辺が同じサイズになるということです。

これを行うには、VHDLでスマートな方法がありますか?

+0

VHDLでかなり可能です。しかし、あなたは何を望んでいますか?単なるシミュレーション、あるいは合成可能なコードですか?後者の場合、実行するクロック周波数はどのくらいですか?問題は実際には困難ではないが、出力は可変である(すなわち、ビット数)。 – JHBonarius

答えて

1

これを達成する方法はいくつかあります(合成の目的で)。私はここにリストされている以上のものがあると確信しています。 Eがモジュールの入力汎用モジュールである場合(これはそうでない場合は、あらかじめE+1が何であるか知っているでしょう)、 "追加"ロジックは必要ありません。

Eがモジュールへの入力ですが、Eの上限がある場合は、単純にROMをルックアップとして使用することができます(これはメモリの効率的な使用ではありませんが動作します)。代わりに、Eを入力とし、結果を表すベクトルSを返す関数を使用することもできます(これは、結果のサイズを制限する、Eがバインドされている必要があります)。

constant MAX_WID : natural := 64; 
... 

-- You can use unsigned in place of slv, if that is more suitable 
function calc_s(e : integer) return std_logic_vector is 
    -- MAX_WID is effectively your maximum value of E 
    variable ret : std_logic_vector(MAX_WID+1 downto 0) := (others => '0'); 
begin 
    ret(e+1) := '1'; 
    return ret; 
end calc_s; 
+0

それは動作しますが、 "(MAX_WID + 1 downto 0)"はどのように合成されますか?シンセサイザーは、バスが変化する場合、バスの長さをどのように知っていますか? – Subert

+1

これはありません。 MAX_WIDは入力の上限を表す定数です。 – gsm

+0

はい、これも可能です;)明らかに最良のもの; P – JHBonarius

1

これは多くの方法で可能です。例えば。

use ieee.math_real.all; 

constant E : natural := 0; -- any value >= 0 
constant S : integer := natural(2 ** real(E+1)); 

それとも

use ieee.numeric_std.all; 
.... 
constant E : natural := 0; 
constant S : unsigned((E+1) downto 0):= (
    (E+1) => '1', 
    others => '0'); 

それとも

use ieee.math_real.all; 
use ieee.numeric_std.all; 
.... 
constant E : natural := 0; 
constant S : unsigned((E+1) downto 0) := 
    to_unsigned(integer(2 ** real(E+1)), E+2)); 

それとも

use ieee.numeric_std.all; 
.... 
constant E : natural := 0; 
signal S : unsigned((E+1) downto 0); 
.... 
S <= left_shift(to_unsigned(1, (E+2)), E+1); 

などなど

:開始するには

私はあなたが達成したいと思いますか?