[英]implementing a flip-flop with concurrent statement
在VHDL編程中規定,對於組合電路,使用並發語句,而對於順序電路,並發和順序語句均適用。 現在的問題是:
如果以並發形式編寫順序代碼會怎樣? 例如,我不使用process
並用when..else
編寫觸發器
architecture x of y is
begin
q <= '0' when rst=1 else
d when (clock'event and clock='1') else
q;
end;
那是正確且可合成的代碼嗎? 如果代碼不正確,那到底是什么問題(除了語法錯誤)?
您說:“在VHDL編程中指出,對於組合電路,使用並發語句,而對於順序電路,並發和順序語句均適用。” 那明顯是錯的。 您可以使用並發或順序語句對組合代碼和順序代碼進行建模。
使用並發語句為順序邏輯建模是很不尋常的。 (我之所以這樣說是因為我在工作中看到了很多其他人的代碼,而我幾乎從沒看到過)。 但是,這是可能的。 您的代碼確實存在語法錯誤和更基本的錯誤。 您的代碼的此修改后的版本綜合為具有異步,高電平有效復位的上升沿觸發觸發器,如您所料:
q <= '0' when rst='1' else
d when clock'event and clock='1';
語法錯誤是您擁有rst=1
而不是rst='1'
。 更根本的錯誤是您不需要else q
。 這是不必要的,因為VHDL中的信號會保留先前分配的值,直到分配了新值為止。 因此,在VHDL代碼建模順序邏輯中, 永遠不需要寫q <= q
(或其等值)。 在您的情況下,在MCVE中,我構造的q
是輸出,因此您的else q
給出了語法錯誤,因為您無法讀取輸出。
這是MCVE:
library IEEE;
use IEEE.std_logic_1164.all;
entity concurrent_flop is
port (clock, rst, d : in std_logic;
q : out std_logic);
end entity concurrent_flop;
architecture concurrent_flop of concurrent_flop is
begin
q <= '0' when rst='1' else
d when clock'event and clock='1';
end architecture concurrent_flop;
我寫了一個MCVE來檢查我要說的是正確的。 您可以做同樣的事情。 這樣做是學習VHDL的好方法。 EDA Playground通常是一個嘗試的好地方(無恥的插件),但在這種情況下就不好了,因為不能在EDA Playground上合成VHDL。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.