在閱讀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;
的修改後的代碼所合成的邏輯塊是單個異步復位DFF即需要half_clk作爲輸出和反相half_clk作爲輸入,這意味着值的half_clk改變上每一個clk的上升沿。
謝謝,請問院長:)
==== ==== ==== ==== ====
下面原題:
==== ==== ==== ==== ====
我需要一個簡單的時鐘分頻器(只需除以二),而不是使用模板,我想我會嘗試寫一個自己繼續訓練。
不幸的是,合成的邏輯塊似乎不起作用 - 我按順序呈現邏輯塊和代碼(我真的認爲應該工作)。
logic block 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;
我敢肯定,在代碼中的錯誤是明顯的,但我一直在盯着自己瞎試圖找到它。
我是一個Verilog的人,而不是VHDL,但我不明白爲什麼你需要兩個寄存器做除法兩個。 'tick'的(延遲)反轉除外'half_clock'是什麼? – 2011-06-07 07:47:30
我不需要兩個寄存器,我不知道它爲什麼推斷兩個寄存器。 half_clck是邏輯塊的輸出,而tick是內部信號 - 如果我打勾輸出,它不能讀取它,如果我將half_clk作爲內部信號,我不能輸出它。但是:它現在可以工作了 - 記住你所說的話,我從if語句中刪除了half_clk,並創建了一個單獨的進程,它將tick的值始終分配給half_clk,現在它可以工作。 – medivh 2011-06-07 08:29:43