VHDL(Quartus)が生成する回路図
前回「エレキ素人が何か考える(その10)&ずっとFPGA初心者(その15):JKフリップフロップ(1)」にて、
「回路上の左のAND回路と右のNOR回路は、Process文内で順番に実施してはいけないということを意味するはず、、(FPGA内で同時処理が必要)。
(間違っていたら、どなたか、ご指摘ください。)」
とつぶやいたところ、有識者の方から、Quartusにて、RTL Viewer(下記サイト参照)を使うと、回路図表示ができるというアドバイスを頂いたので、その内容を記載する。
そもそもFPGAの構成?
回路図表示(後述)を行ったところ、Dフリップフロップが現れ、初心者として、少々驚いたので調べてみた。
FPGAは、ルックアップテーブルとDフリップフロップなどから構成されているとのこと。
JKフリップフロップ(再掲)
前回の復習。
ANDおよびNORロジックで構成されたFPGAの対象の回路
VHDLコード
library ieee;
use ieee.std_logic_1164.all;
entity JK is
port (CLK, J, K : in std_logic; -- ①
Q, Qbar : out std_logic); -- ②
end;
architecture RTL of JK is
signal out1 : std_logic := '0'; -- ③
signal out2 : std_logic := '0';
signal out3 : std_logic := '1';
signal out4 : std_logic := '0';
begin
process (CLK)
begin
if (rising_edge(CLK)) then -- ④
out1 <= J and out3;
out2 <= K and out4;
-- out3 <= not(out1 or out4); -- does not work -- ⑤
-- out4 <= not(out2 or out3); -- does not work
end if;
end process;
out3 <= not(out1 or out4); -- ⑥
out4 <= not(out2 or out3);
Q <= out4;
Qbar <= out3;
end RTL;
上記のコード(以降、正しい動きをするもの:A)の回路図表示をしたものと、⑥以下2行の代わりに、⑤以下2行を用いたときのコード(以降、正しくない動きをするもの:B)の回路図表示をしたものとを比較する。
回路図表示
正しい動きをするもの(コードA)
正しくない動きをするもの(コードB)
考察
(理解できていないところ多々あるので、誤りなどあるかもしれません。)
まずは、前記のとおり、Dフリップフロップが用いられていることがわかる。コードAでは、CLKがAND回路のみ適用される(CLKの立ち上がり時のみANDの結果が次のInputとなる)(のように見える)。コードBでは、AND回路にもNOR回路にもCLKが適用されているようだ。
JKフリップフロップにCLKが入るのは左側のAND回路だけなので、コードBのようにNOR回路にCLKが入ると、動作が期待どおりにならないのは当然、、、と思えるようになってきた。(コードBでは、CLKの立ち上がり時のみに、すべての信号が変化している。)
また、回路図表示にて、コードAでもコードBでも、CLKの立ち上がり時に順番(Process文)に処理されているのかは、素人&初心者にはよくわからず。というより、FPGA的には、そういった構文にすべきではないような気がする。
ソフトウェア視点があるとは言っても、FPGAでは、クロックに合わせた信号の変化を考慮して設計する必要がある、つまり、ハードウェアの資質がMustである、、と勝手に解釈。
次回
素人には、正直、あまり深堀りできず。とにかく、リアルFPGAボードで、VHDLで記述されたコードの動作を確認する。