Тогда так. Ниже и под отредактированный вариант. В языке ещё есть несинтезируемая часть, например задать задержки (задать, что инверсный сигнал запаздывает от опорного) через
transport и
after, но я это шаманство пока не освоил.
Естественно, ругается на латчи
Warning (10631): VHDL Process Statement warning at NK_test.vhd(22): inferring latch(es) for signal or variable "r_oS1", which holds its previous value in one or more paths through the process
ARCHITECTURE RTL OF NK_test IS
signal r_S4 : std_logic;
signal r_oS1 :std_logic;
signal w_X1 : std_logic;
signal w_X2 : std_logic;
BEGIN
w_X1 <= not inS2 or inS3;
w_X2 <= inS2 or inS3;
process(w_X1, inS1)
begin
if (w_X1 = '1') then
r_oS1 <= inS1;
end if;
end process;
process(w_X2, r_oS1)
begin
if (w_X2 = '1') then
r_S4 <= r_oS1;
end if;
end process;
outS4 <= r_S4;
END RTL;
Второй, "классика".
library ieee;
use ieee.std_logic_1164.all;
ENTITY NK2_test IS
PORT(
i_D : in std_logic;
i_clk : in std_logic;
o_Q : out std_logic
);
END ENTITY;
ARCHITECTURE RTL OF NK2_test IS
signal r_Q1 : std_logic;
signal r_Q2 : std_logic;
signal w_nCK : std_logic;
BEGIN
w_nCK <= not i_clk;
process(w_nCK, i_D)
begin
if (w_nCK = '1') then
r_Q1 <= i_D;
end if;
end process;
process(i_clk, r_Q1)
begin
if (i_clk = '1') then
r_Q2 <= r_Q1;
end if;
end process;
o_Q <= r_Q2;
END RTL;