我有我的代碼的以下簡化示例,其中可以模擬DeltasTest
實體來顯示問題。真正設計中的時鐘是基於通用的反轉或非反轉的,並且在此之下提供幾個其他實體。我該如何解決這個增量週期時鐘延遲問題
問題在於,行爲模擬中簡單的邊緣檢測器不起作用(data_out
只是一個小故障),這是由於反轉階段在時鐘上引入的Δ週期延遲。有沒有一個標準或其他優雅的方式來解決這個問題?
到目前爲止,我的最佳解決方案是將data_in
信號分配給另一個信號,使其具有與clk
相同的增量循環延遲。我想使用一個函數來根據需要反轉時鐘作爲函數的第二個參數,但這個時鐘在很多地方都有使用,這看起來不是很優雅,而且我很確定它甚至可以解決這個問題。問題。抓着吸管,我也試着把時鐘反轉賦值給transport
賦值,但是,正如所料,這沒有任何區別。
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity Deltas is
Generic (
CLK_INVERT : boolean := false
);
Port (
clk : in std_logic;
data_in : in std_logic
);
end Deltas;
architecture Behavioral of Deltas is
-- Signals
signal data_reg : std_logic := '0';
signal clk_inverted : std_logic := '0';
signal data_out : std_logic := '0';
begin
ClkInvert : if (CLK_INVERT) generate
clk_inverted <= not clk;
else generate
clk_inverted <= clk;
end generate;
process (clk_inverted)
begin
if (rising_edge(clk_inverted)) then
data_reg <= data_in;
end if;
end process;
process (data_reg, data_in)
begin
if (data_reg /= data_in) then
data_out <= '1';
else
data_out <= '0';
end if;
end process;
-- Other entities use `clk_inverted`. Commented out so that this example compiles
--LowerEntity : entity work.Counter
--port map (
-- clk => clk_inverted
--);
end Behavioral;
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity DeltasTest is
end DeltasTest;
architecture Behavioral of DeltasTest is
signal clk : std_logic := '0';
signal data_in : std_logic := '0';
begin
clk <= not clk after 10 ns;
process (clk)
variable count : integer := 0;
begin
if (rising_edge(clk)) then
count := count + 1;
if (count = 4) then
count := 0;
data_in <= not data_in;
end if;
end if;
end process;
uut : entity work.Deltas
Port map (
clk => clk,
data_in => data_in
);
end Behavioral;
有兩個問題:1)爲什麼在'Deltas'中不使用'falling_edge()',而是用delta延遲生成'clk_inverted',然後在這個上使用'rising_edge()'? 2)爲什麼在實際設計中不是基於'clk'生成的'data_in'上的刺激,而是僅僅基於時間?改變這將使邊緣檢測器工作。如果需要反轉時鐘,則除了clk之外,還要在頂層進行分配,並通過層次結構進行分配。 –
@MortenZilmer感謝您的評論。 1)我沒有使用'falling_edge()',因爲時鐘的極性取決於一個通用的。 2)數據信號實際上是由'clk'生成的,但這最終沒有任何區別,因爲我的例子與我的真實代碼不完全相同。我會更新示例以包含您的更改。 –
您可能會在http://electronics.stackexchange.com/ – Tansir1