簡體   English   中英

用並發語句實現觸發器

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM