ОСНОВНЫЕ РЕДАКТИРОВАТЬ:
Проблема была решена после прочтения комментария Уилла Дина. Оригинальный вопрос ниже пересмотренного кода:
-- 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;
Синтезированный логический блок пересмотренного кода представляет собой одиночный DFF с асинхронным сбросом, который принимает half_clk в качестве вывода и инвертированный half_clk в качестве ввода, что означает, что значение half_clk изменяется на каждом переднем фронте clk.
Спасибо, Уилл Дин:)
==== ==== ==== ==== ====
Оригинальный вопрос ниже:
==== ==== ==== ==== ====
Мне нужен простой делитель часов (просто делим на два), и вместо того, чтобы использовать шаблон, я подумал, что попытаюсь написать его самостоятельно, чтобы продолжать обучение.
К сожалению, синтезированный логический блок не работает - я представляю логический блок и код (который, я думаю, должен работать), в таком порядке.
логический блок 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;
Я уверен, что ошибка в коде очевидна, но я слепо пытался ее найти.