ずっとFPGA初心者（その18）：JKフリップフロップ(4)

# 回路図からVHDLコードを作成
こちらの記事「[ずっとFPGA初心者（その16）：JKフリップフロップ(2)](https://qiita.com/infinite1oop/items/9248bd8421f6afd3ed1b)」にて、Quartusでは回路図エディタからVHDLコードを作成できるとのコメントを、有識者から頂いたので、その内容を記す。

## 参考URL
- [Quartusで、回路図からHDLを生成する](https://neco-tech.com/archives/2555)
- [Quartus II はじめてガイド 回路図エディタの使い方](https://www.macnica.co.jp/business/semiconductor/articles/pdf/ELS1270_Q1000_10__1.pdf)

## JKフリップフロップ（再掲）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/ffcbd512-4a6e-3ae2-8f23-3e73b009f11f.png)

## 自作コード（再掲）
```vhdl:JK.vhd
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;
```

## 回路図エディタ
### 基本操作
新しいProjectを作成後、回路図ファイル（拡張子bdf）を作成する。
![New.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/4acf72fe-6133-a322-91f1-b68042313241.png)
![BDF.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/c7621f56-f763-9ef2-628f-496138179176.png)

SymbolToolを選択し、
![SymbolTool.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/c0cff2b6-0ce1-57e3-3324-2868a1f2e929.png)
ANDなどのロジック（primitives内にある）や入出力ライン（信号線）を適宜選択する。
![and2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/83fd5fbe-8bde-dd41-33bb-86829f747edb.png)
![InOut.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/cfc96448-df95-3aa6-92cb-eb07f93cbd51.png)
信号線の追加は、Node Toolなどを用いる。
![NodeTool2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/efa37254-312b-0278-36dc-ca51bc2bcb1b.png)

### 作成した回路図
![Schematics.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/c66dc15e-22cf-15a8-d1ad-62483f3c711e.png)

### VHDLへの変換
「Create HDL Design File from Current File」をクリックし、
![CreateHDL.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/5f36f0b0-10d5-ef20-d0dd-0064c6473c4b.png)
VHDLを選択する。
![SelectVHDL.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/701e2dc5-269f-2e45-e44a-f85f7b04373f.png)
作成されたコードは下記となる（Copyright記述は省略）。
```vhdl:
-- PROGRAM		"Quartus Prime"
-- VERSION		"Version 20.1.1 Build 720 11/11/2020 SJ Lite Edition"
-- CREATED		"Sun Aug 21 09:37:41 2022"

LIBRARY ieee;
USE ieee.std_logic_1164.all; 

LIBRARY work;

ENTITY Circ1 IS 
	PORT
	(
		J :  IN  STD_LOGIC;
		CLK :  IN  STD_LOGIC;
		K :  IN  STD_LOGIC;
		Q :  OUT  STD_LOGIC;
		Qbar :  OUT  STD_LOGIC
	);
END Circ1;

ARCHITECTURE bdf_type OF Circ1 IS 

SIGNAL	SYNTHESIZED_WIRE_8 :  STD_LOGIC;
SIGNAL	SYNTHESIZED_WIRE_1 :  STD_LOGIC;
SIGNAL	SYNTHESIZED_WIRE_2 :  STD_LOGIC;
SIGNAL	SYNTHESIZED_WIRE_9 :  STD_LOGIC;
SIGNAL	SYNTHESIZED_WIRE_5 :  STD_LOGIC;
SIGNAL	SYNTHESIZED_WIRE_6 :  STD_LOGIC;

BEGIN 
Q <= SYNTHESIZED_WIRE_9;
Qbar <= SYNTHESIZED_WIRE_8;

SYNTHESIZED_WIRE_1 <= J AND CLK;
SYNTHESIZED_WIRE_2 <= CLK AND K;
SYNTHESIZED_WIRE_5 <= SYNTHESIZED_WIRE_8 AND SYNTHESIZED_WIRE_1;
SYNTHESIZED_WIRE_6 <= SYNTHESIZED_WIRE_2 AND SYNTHESIZED_WIRE_9;
SYNTHESIZED_WIRE_8 <= NOT(SYNTHESIZED_WIRE_9 OR SYNTHESIZED_WIRE_5);
SYNTHESIZED_WIRE_9 <= NOT(SYNTHESIZED_WIRE_6 OR SYNTHESIZED_WIRE_8);

END bdf_type;
```
回路図を忠実にコード化したものとなっている。

ただし、当然のことながら、CLKは単なる入力信号となっており、立ち上がりなどが考慮されたコードにはならない（上記自作コード参照）。センシティビティリストや条件を考慮したコードが必要なのであろう。もっと賢くならないと、まともなものにならない、、ということを痛感したシロートであった。

EOF