0

私は VHDL プログラミングが初めてで、これが私の最初のプロジェクトです。正規/逆カウント順序の両方の機能を備えたバイナリ カウンターを作成することです。私の計画は単純です:

  1. 分周器プロセスを記述して、目的のクロック周波数を取得し、この新しいクロックをビット信号として出力しますflag
  2. 「フラグ」を別のプロセスの機密リストに入れ、通常/逆の状態に従ってカウントします-curr_s私のコードに保存されています。
  3. 3番目のプロセスは入力ctl信号をセンシティブとして受け取り、最後のプロセスのカウントを保存するように設定されている -curr_sの値を切り替えてリセットします。count

ただし、Quartus II は次のエラー メッセージを返します。

エラー (10028): bi_counter.vhd(35) で、ネット "count[31]" の複数の定数ドライバーを解決できません

エラー (10029): bi_counter.vhd(46) の定数ドライバー

エラー (10028): bi_counter.vhd(35) でネット "count[30]" の複数の定数ドライバーを解決できません

...

エラー (10028): bi_counter.vhd(35) でネット "count[14]" の複数の定数ドライバーを解決できません

少しグーグルで調べたところ、複数のプロセスで a の値を変更することは許可されていないなどのルールがありますが、問題は、 myをシグナルではなく共有変数としてsignal宣言していることです-このようなエラーは発生しません。そして、プロセス間で情報を交換する変数としてcount使用したいので、これを行うつもりでした-これは理にかなっていますか?そうでない場合、回避策はありますか?count

これが私のコードです:

--
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.numeric_std.all;
--
entity bi_counter is
    port(
        master_clk, ctl, rst: in std_logic;
                           q: out std_logic_vector(7 downto 0)
        );
end bi_counter;
--
architecture behv of bi_counter is
    shared variable curr_s: std_logic := '0'; -- 0 for incremental, 1 for reverse counting
    shared variable count: integer := -1;
    shared variable master_count: natural := 0;
    signal flag: std_logic;
begin
    p_freq_div: process(master_clk, rst)
    begin
        if rst = '0' then
            master_count := 0;
        elsif master_clk'event and master_clk='1' then
            master_count := master_count + 1;
            if master_count = 24000000 then
                flag <= not flag;
                master_count := 0;
            end if;
        end if;
    end process p_freq_div;
    
    p_count: process(flag)
    begin
        if curr_s = '1' then
            count := count + 1;
            q <= conv_std_logic_vector(count, 8);
        else
            count := count - 1;
            q <= conv_std_logic_vector(count, 8);
        end if;
    end process p_count;
    
    p_switch: process(ctl)
    begin
        if ctl'event and ctl='1' then
            curr_s := not curr_s;
            if curr_s = '0' then
                count := 0;
            else
                count := 1000;
            end if;
        end if;
    end process p_switch;
end behv;
4

1 に答える 1