0

私はvhdlモジュールに取り組んでいます。

6クロックサイクルの入力値を合計してから、しきい値に達したかどうかに応じて出力をハイまたはローに設定したいと思います。

私が抱えている問題は、最後のクロックサイクルで、合計値に最終的な入力値が追加されていないことです。クロックの立ち上がりエッジで出力をハイにする必要があります。

コードは次のとおりです。

architecture Behavioral of inputCounter is

signal totalBitWidth     : integer := 6;

-- This signal is specified by the user to determine the majority value
-- for the output.
signal majorityValue     : integer := 4;
signal Sum : integer := 0;

process(clk, input)
    variable clkCount     : integer := 0;
begin
    if input = '1' then
        Sum <= Sum + 1;
    else
        Sum <= Sum + 0;
    end if;

    clkCount := clkCount + 1;

    if clkCount >= (totalBitWidth) then
    -- Determine if the majoritySum variable has met the
    -- threshold for a 1 value
    if Sum >= majorityValue then
    output <= '1';
    else
    output <= '0';
    end if;

    if Sum = totalBitWidth Or Sum = 0 then
    countError <= '0';
    else
    countError <= '1';
    end if;

    -- Reset the clock counter, sum value and majority vector
    clkCount := 0;
    Sum <= 0;

    -- Set the bit counter high to alert other midules that a new bit
    -- has been received
    bitReady <= '1';
end process;
end behavioral;

さらに情報が必要な場合は、私に知らせてください。助けてくれてありがとう。

更新:私は合計整数をいじっていましたが、アーキテクチャの全体的な信号ではなく、プロセスでそれを変数に変更しました。これはうまくいったようです。しかし、ISimとISEプロジェクトナビゲーターを使用しているため、プロセスから変数を追跡できません。

4

2 に答える 2

1

これに対する解決策は、プロセスでシグナルを変数に変更することでした。

これが私のコードです:

    architecture Behavioral of inputCounter is

signal totalBitWidth     : integer := 6;

signal majorityValue     : integer := 4;
-- This signal is to trace the variable sum
signal SumS              : integer := 0;



begin

-- Process for recognizing a single input value from a 6 clock cycle
-- wide input signal
majority_proc: process(clk, input)
    variable clkCount     : integer := 0;
    variable Sum  : integer := 0;

    begin

        if rising_edge(clk) And enable = '1' then
            -- Reset bitReady after one clock cycle
            bitReady <= '0';

            -- Check the input value and add it to the Sum variable
            if input = '1' then
                Sum := Sum + 1;
            else
                Sum := Sum + 0;
            end if;

            -- Increment the clock counter variable
            clkCount := clkCount + 1;

            -- Check if the clock count has reached the specified number of cycles
            if clkCount >= totalBitWidth then
                -- Determine if the Sum variable has met the threshold for
                -- value of 1, set the output accordingly
                if Sum >= majorityValue then
                    output <= '1';
                else
                    output <= '0';
                end if;

                -- This checks if the value for all clock cycles was the same and
                -- sets an error flag if not
                if Sum = totalBitWidth Or Sum = 0 then
                    countError <= '0';
                else
                    countError <= '1';
                end if;

                -- Reset the clock counter and sum value
                clkCount := 0;
                Sum := 0;

                -- Set the bit counter high to alert other midules that a new bit
                -- has been received
                bitReady <= '1';
            end if;
        end if;

        -- Assign the variable Sum to the signal SumS
        SumS <= Sum;
end process;

end Behavioral;
于 2013-03-14T15:26:58.310 に答える
1

最後の入力を取得するのと同じクロック サイクルの終わりに出力を変更する必要がある場合は、アキュムレータ レジスタと加算器を分割する必要があります。アキュムレータ レジスタと出力比較ロジックをプロセスに配置し、加算器を非同期ロジックに取り込みます。簡略化されたコード例:

process (clk)
  if rising_edge(clk) and enable='1' then
    accumulator <= sum;
    if sum >= majorityValue then
      output <= '1';
    else
      output <= '0';
    end if;
  end if;
end process;

sum <= accumulator + 1 when input='1' else accumulator;
于 2013-03-14T16:01:02.953 に答える