主な編集:
Will Dean のコメントを読んだ後、問題は解決しました。元の質問は、改訂されたコードの下にあります。
-- REVISED CODE (NOW WORKS)
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
entity CLOCK_DIVIDER is
port(
reset : in std_logic;
clk : in std_logic;
half_clk : out std_logic
);
end CLOCK_DIVIDER;
architecture CLOCK_DIVIDER of CLOCK_DIVIDER is
signal tick : std_logic;
begin
process(clk, reset)
begin
if reset = '1' then
tick <= '0';
elsif clk = '1' and clk'EVENT then
if tick = '0' then
tick <= '1';
elsif tick = '1' then
tick <= '0';
end if;
end if;
end process;
process(tick)
begin
half_clk <= tick;
end process
end CLOCK_DIVIDER;
修正されたコードの合成ロジック ブロックは、half_clk を出力として取り、反転した half_clk を入力として取る単一の非同期リセット DFF です。これは、half_clk の値が clk の立ち上がりエッジごとに変化することを意味します。
ありがとう、ウィルディーン:)
==== ==== ==== ==== ====
以下の元の質問:
==== ==== ==== ==== ====
シンプルなクロック分周器 (2 で分周するだけ) が必要なので、テンプレートを使用する代わりに、自分で作成してトレーニングを続けることにしました。
残念ながら、合成されたロジック ブロックは機能していないようです。ロジック ブロックとコード (実際に機能するはずだと思います) をこの順序で提示します。
論理ブロック http://img808.imageshack.us/img808/3333/unledly.png
私が本当に疑問に思っているのは、悪魔が「ティック」DFF で何をしているのかということです。明らかに、マルチプレクサ セレクタから入力を取得します。
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
entity CLOCK_DIVIDER is
port(
reset : in std_logic;
clk : in std_logic;
half_clk : out std_logic
);
end CLOCK_DIVIDER;
architecture CLOCK_DIVIDER of CLOCK_DIVIDER is
signal tick : std_logic;
begin
process(clk, reset)
begin
if reset = '1' then
half_clk <= '0';
tick <= '0';
elsif clk = '1' and clk'EVENT then
if tick = '0' then
half_clk <= '0';
tick <= '1';
elsif tick = '1' then
half_clk <= '1';
tick <= '0';
end if;
end if;
end process;
end CLOCK_DIVIDER;
コードのエラーは明らかだと思いますが、それを見つけようとして盲目的に自分自身を見つめてきました。