私は VHDL プログラミングが初めてで、これが私の最初のプロジェクトです。正規/逆カウント順序の両方の機能を備えたバイナリ カウンターを作成することです。私の計画は単純です:
- 分周器プロセスを記述して、目的のクロック周波数を取得し、この新しいクロックをビット信号として出力します
flag
。 - 「フラグ」を別のプロセスの機密リストに入れ、通常/逆の状態に従ってカウントします-
curr_s
私のコードに保存されています。 - 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;