1

まず、C に関する知識は非常に限られており、基本的な機能しかありません。私は経験のない VHDL でタスクを設定されました。

このタスクは、ループを使用して 10 個の数字 (13、8、6、5、19、21、7、1、12、3) のリストを追加するプログラムを VHDL で作成することです。

Cでもこれを行う方法を考えていたので、その方法をいくらか模倣できるかどうかを確認しました。これまでのところ、私は思いついただけです

    int start = 0;
    int add = start;
    int increment = 5;

    for (int i=0; i<10; i++) {
    add = add + increment;
    }

これは非常に基本的なことだとわかっていますが、これが私にできる最善のことです。そのループは、私が持っているリストに並置されているように、5だけインクリメントします。

どんな助けも大歓迎です。これが私の最初の質問です。「不文律」に違反している場合はお詫びします

4

3 に答える 3

1

以下の解決策は、VHDL の問題を解決するのに役立ちます。

FPGA での実装については、より優れたソリューションが考え出される可能性があります。だから、それをスタートとして考えてください...

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity add is

    port (
        clk : in  std_logic;
        rst : in  std_logic;
        add : in  std_logic;
        sum : out std_logic_vector(31 downto 0));

end entity add;

architecture RTL of add is

    constant rom_size : integer := 10;
    type     t_rom is array (0 to rom_size-1) of unsigned(31 downto 0);
    constant rom : t_rom := (
        to_unsigned(13, sum'length),
        to_unsigned(8, sum'length),
        to_unsigned(6, sum'length),
        to_unsigned(5, sum'length),
        to_unsigned(19, sum'length),
        to_unsigned(21, sum'length),
        to_unsigned(7, sum'length),
        to_unsigned(1, sum'length),
        to_unsigned(12, sum'length),
        to_unsigned(3, sum'length));
    signal add_d : std_logic;
    signal index : integer range 0 to rom_size;
    signal sum_i : unsigned(sum'range);

begin

    p_add : process (clk) is
    begin
        if rising_edge(clk) then        -- rising clock edge
            if rst = '1' then           -- synchronous reset (active high)
                sum_i <= (others => '0');
                add_d <= '0';
                index <= 0;
            else

                add_d <= add;           -- rising edge detection

                if add_d = '0' and add = '1' then  -- rising_edge -> add next item to sum
                    sum_i <= sum_i + rom(index);
                    index <= index + 1;
                end if;
            end if;
        end if;
    end process p_add;


    -- output
    sum <= std_logic_vector(sum_i);

end architecture RTL;

ここに画像の説明を入力

于 2013-02-21T14:13:16.873 に答える
1

std_logic_vector最初に、 と を使用してs やベクトル演算の複雑さを追加する必要がないことを指摘しsignedますunsigned。これは単純な整数で問題なく動作します:

したがって、いくつかの数値が入力され、合計が出力されます。

entity summer
port (
  inputs : integer_vector := (13,8,6,5,19,21,7,1,12,3);
  sum_out : integer);
end entity summer;

入力ポートを値で初期化したことに注意してください。通常は、テストベンチでそのポートに書き込みます。

それらを合計するには、次のプロセスが必要です。

process(inputs)
    variable sum : integer;
begin
    sum := 0;
    for i in inputs'range loop
        sum := sum + inputs(i);
    end for;
    sum_out <= sum;
end process;

これは単純なソリューションです。「最適な」ソリューションを作成するには、より詳細な仕様が必要です。例: 入力はどのくらいの頻度で変更されますか? 入力が変化した後、どれくらい早く答えが必要ですか? 時計はありますか?

于 2013-02-22T13:28:23.960 に答える
1

これは parwan プロセッサに関する研究の一部だとおっしゃいましたが、それについての考え方は、それらをどのように研究しているかによって大きく異なります。

プロセッサの実装を構築する場合は、論理演算の構文を学習するだけでなく、型 unsigned range 0 to 255signed range -128 to 127. パッケージieee.numeric_std.allを利用することで、これらの型に対して定義された加算操作を取得できます。

ただし、プロセッサがすでに定義されている場合は、プロセッサ インターフェイスをよく見てください。このために作成するコードは、より明示的なステート マシンになります。

いずれにしても、テスト ベンチを作成することから始めるのが最善の方法だと思います。これは、入力のリストをフィードする部分です。最終的にはfor (int i=0; i<10; i++)ではなく、while(1)処理のスタイルにしたいからです。

これはすべて理論的なものなので、単純なアキュムレータ プロセスの疑似コードを次に示します。

signal acc : unsigned range 0 to 255 := 0; --accumulator register
signal b : unsigned range 0 to 255 := 5;   --value to be added 
--each cycle you would change b

accumulator :process (clk)
begin
    if rising_edge(clk)
        acc <= acc + b;
    end if;
end process;

または、ここを見てください:アキュムレータ

于 2013-02-21T21:25:11.247 に答える