vhdlの学習を始めたばかりです。ここでコードを検討してください: - http://esd.cs.ucr.edu/labs/tutorial/jkff.vhd
同時実行ステートメントとは何か、なぜここで必要なのか理解できませんか? 内部シグナル「状態」を使用せずにプロセス p で Q と Qbar を直接変更すると正しいでしょうか? また、J、K がスニペットのプロセス p の機密リストにないのはなぜですか?
vhdlの学習を始めたばかりです。ここでコードを検討してください: - http://esd.cs.ucr.edu/labs/tutorial/jkff.vhd
同時実行ステートメントとは何か、なぜここで必要なのか理解できませんか? 内部シグナル「状態」を使用せずにプロセス p で Q と Qbar を直接変更すると正しいでしょうか? また、J、K がスニペットのプロセス p の機密リストにないのはなぜですか?
ご存知かもしれませんが、純粋な機能上の意味 (つまり、ハードウェアの実装を考慮していない) では、同時実行ステートメントは遅延を引き起こしません。だからあなたが書くとき
Q <= state;
機能的には、遅れることなくQ
正確に従います。 state
プロセス内state
で直接割り当てるのではなく、中間シグナルが使用された理由は、プロセス内で出力の 1 つを直接割り当てると、出力を「読み取って」シグナルを導出できないためだと推測します。Q
Q
Qbar
つまり、これを行うことはできませんでした:
Qbar <= not Q;
これは、VHDL で出力信号を読み取ることが厳密に許可されていないためです。Q
「状態」を使用すると、 と の両方を導出できる内部信号が得られますQbar
。
これに代わる同等の実装は、両方の出力Q
をQbar
ステート マシンの各ケースに割り当て、中間state
信号を完全に排除することです。ただし、同等の機能のコード行数がほぼ 2 倍になるため、これは少し複雑に思えます。
p
2 番目の質問に答えるには、プロセスが同期プロセスであるため、J、K は機密リストに含まれていません。あなたはメモリ要素(JK FlipFlop)を記述しています。これは、定義により、clock
またはreset
変更されたときにのみ出力を更新します。入力信号は変化する可能性があり、プロセスはその出力を更新しませんJ
。K
クロック エッジがあるか、またはアサートされるたびreset
に、プロセスが「ウェイクアップ」して入力を評価し、出力がどうあるべきかを決定します。J、K でさえ、出力が でのみ更新された場合、感度リストに含まれていましたがrising_edge(clock)
、全体的な機能は同じになります (ただし、コードは混乱します)。
Q
プロセス内にandQbar
の代入を持たない理由はありません。ただし、少し注意が必要です。
シグナルが割り当てられるたびに、シミュレーターが次の「デルタサイクル」に移行するまで、値は更新されません。これは、プロセス内でシグナルに割り当てると、実際にはスケジューリングと更新のみを行い、シグナルを読み取ると「古い」値を取得することを意味します。期待どおりの順次更新を行うには、変数を使用します。したがって、次のように JKFF をモデル化できます。
architecture behv of JK_FF is
begin
p : process(clock, reset) is
variable state : std_logic;
variable input : std_logic_vector(1 downto 0);
begin
if (reset = '1') then
state := '0';
elsif (rising_edge(clock)) then
input := J & K;
case (input) is
when "11" =>
state := not state;
when "10" =>
state := '1';
when "01" =>
state := '0';
when others =>
null;
end case;
end if;
Q <= state;
Qbar <= not state;
end process;
end behv;
合成メモ: Q および Qbar への割り当ては の外部で発生するif rising_edge(clk)
ため、同時実行ドライバーと同様に解釈されます。