跳轉到內容

可程式設計邏輯/VHDL 順序語句

來自華夏公益教科書,開放書籍,開放世界

順序語句用於程序中指定訊號的賦值方式。程序以整體順序執行。在程序中的所有順序語句執行完畢後,訊號將被分配新的值。

訊號的賦值方式如下

sQ <= sQ_next;

這個語句可以理解為“在下一個模擬週期將 sQ_next 的值賦值給 sQ”。

到目前為止,在 if 語句中只使用了訊號。使用變數時同樣適用,唯一的區別是:與訊號一樣,如果變數只在 if 語句的某些分支中被賦值,那麼它的先前值會透過反饋保留下來。與使用訊號不同的是,在同一個程序中讀寫變數,只有在讀操作發生在寫操作之前才會產生反饋。在這種情況下,讀取的值是變數的先前值。而當使用訊號時,同一個程序中的讀寫操作將始終產生反饋。這種現象可以用來建立使用變數的暫存器或計數器。請記住,合成工具會透過在程序中被賦值的每個訊號上放置一個觸發器或暫存器來解釋順序程序。這意味著通常變數不會寫入觸發器或暫存器。然而,如果存在先前變數值的反饋,那麼該反饋將透過觸發器或暫存器實現,以使程序同步。示例 6.21 描述了一個使用無符號整數型別的計數器。當對無符號型別的變數進行遞增時,如果值是範圍內的最大值,則會得到範圍內的最小值。

示例 6.21

process
variable count: unsigned (7 downto 0);
begin
wait until clk = '1';
if reset = '1' then
count := "00000000";
else
count := count + 1;
end if;
result <= count;
end process;

在這個例子中,在 if 語句的 else 分支中,正在讀取 count 變數的先前值以計算下一個值。這導致了反饋。請注意,在這個例子中實際上建立了兩個暫存器。根據反饋規則,變數 count 將被註冊。訊號 result 也將被註冊,因為順序程序中被賦值的所有訊號都將被註冊。這個額外的暫存器將始終包含與變數 count 的暫存器相同的值。合成工具通常會消除這種冗餘的暫存器。

CASE 語句

[編輯 | 編輯原始碼]

CASE 語句是一種描述具有大量選擇的條件賦值的方法。

architecture behavioral of Question1 is
begin
    process(D)
    begin
        case D is
            when "0000" | "1110" =>
                Y <= "0011";		
            when "0001" | "0100" | "0101" | "0110" | "0111" | "1010" | "1011" | "1100" | "1111" =>
                Y <= "0000";
            when "0010" | "1001" =>
                Y <= "0110";
            when "0011" | "1101" =>
                Y <= "1100";
            when "1000" =>
                Y <= "1001";
            when others =>
                null;
        end case;
    end process;
end architecture behavioral;

CASE 語句通常被合成成多路複用器。

LOOP 語句

[編輯 | 編輯原始碼]
華夏公益教科書