読者です 読者をやめる 読者になる 読者になる

guruguru123’s diary

かなり雑な作業日記です。

ゲーテッドクロックからクロックイネーブル付きへの変更練習

以前、ゲーテッドクロックをイネーブル付きのものに置き換えるというようなことを言っていた。そこでゲーテッドクロックをクロックイネーブルに変更していくための練習をした。

まずはゲーテッドクロックになってしまう例を作成。

entity clock_pra is
port(
clk : in std_logic;
D : in std_logic;
Q : out std_logic;
a : in std_logic;
b : in std_logic
);
end clock_pra;

architecture Behavioral of clock_pra is
signal dbuf : std_logic;
signal c : std_logic;

begin
c <= (clk and a and b);
process (clk) begin
if c' event and c = '1' then
dbuf <= D;
end if;
end process;

Q <= dbuf;

end Behavioral;

f:id:guruguru123:20170313153038p:plain

RTL Schematicを見るとクロックがAND回路の出力になっていることがわかる。

次にイネーブルのものを作成。

entity clock_pra is
port(
clk : in std_logic;
d_i : in std_logic;
Q : out std_logic;
a : in std_logic;
b : in std_logic
);
end clock_pra;

architecture Behavioral of clock_pra is
signal dbuf : std_logic;
signal c : std_logic;
signal D : std_logic;

begin
c <= (a and b);

process(c,d_i,dbuf) begin
if c = '1' then
D <= d_i;
else
D <= dbuf;
end if;
end process;

process (clk) begin
if clk' event and clk = '1' then
dbuf <= D;
end if;
end process;

Q <= dbuf;

end Behavioral;

f:id:guruguru123:20170313153508p:plain

こちらはクロックがそのまま用いられており、AND出力がイネーブルとして用いられている。また、以下のようなパターンでも同様な回路が構成される。

architecture Behavioral of clock_pra is
signal dbuf : std_logic;
signal c : std_logic;

begin
c <= (a and b);

process (clk,c) begin
if clk' event and clk = '1' then
if c = '1' then
dbuf <= D;
end if;
end if;
end process;

Q <= dbuf;

end Behavioral;

f:id:guruguru123:20170313153805p:plain

以下参考にしたサイト

https://japan.xilinx.com/support/documentation/sw_manuals_j/xilinx11/sim.pdf

https://japan.xilinx.com/support/answers/51737.html