注意してください、これは学習問題です。
vhdl で単純な d-latch を記述してから合成する必要があります。問題は、それが「単項」の d ラッチであり、その単一の入力がその出力 (Q および nQ) に直接マップされることです。これは、clk 信号が常に高い従来の非同期 d ラッチとして想像できます。これはロジックでは役に立たない要素であり、ほとんどの場合、ザイリンクス シンセサイザーは空のテクノロジ スキーマを提供します。ただし、この要素を保持する理由は、たとえば、スキーマに存在するがそのロジックには影響しないハードウェアの「透かし」を作成するためです。
次のコードを思いつきました:
entity dLatch is
port(
d: in std_logic;
q: out std_logic);
end dLatch;
architecture dLatch_beh of dLatch is
signal o: std_logic;
begin
latch: process(d)
begin
if d = '1' then
o <= '1';
elsif d = '0' then
o <= '0';
end if;
end process;
q <= o;
end;
このコードは、次のテクノロジ スキーマを生成します。
しかし、nQ 出力ポートを追加しようとすると、ラッチが重複します。
entity dLatch is
port(
d: in std_logic;
q, nq: out std_logic);
end dLatch;
architecture dLatch_beh of dLatch is
signal o: std_logic;
begin
latch: process(d)
begin
if d = '1' then
o <= '1';
elsif d = '0' then
o <= '0';
end if;
end process;
q <= o;
nq <= not o;
end;
技術スキーマ:リンク
ここで 2 つの完全に等しいラッチが得られる理由がわかりません。追加の 'not' ゲートは 1 つだけだと思っていました。したがって、私の質問は、ラッチの重複を回避する方法、またはこの問題を解決する他の方法です。合成には Xilinx ISE Web Pack 14.6 を使用しています。
UPD 解決策は、シンセサイザーのフラグ -register_duplication を false に設定することです。