這是爲了補充替代anderswb的回答,並證明你可以做代表一個二進制值和一個數值文字表示值數組類型之間的比較表達式的數組類型。
它還提供了一個機會,可以指出有關評估具有比'9'和'1'更多值的元素基類型的類型中的表達式的內容。
有可能修改你的設計和比較數值,以s
:
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity simplemux is
port (
i0: in std_logic;
i1: in std_logic;
i2: in std_logic;
i3: in std_logic;
s: in std_logic_vector(1 downto 0);
o: out std_logic
);
end entity simplemux;
architecture foo of simplemux is
begin
o <= i0 when unsigned(s) = 0 else
i1 when unsigned(s) = 1 else
i2 when unsigned(s) = 2 else
i3 when unsigned(s) = 3 else
'X';
end architecture;
這依賴於s
類型轉換爲unsigned。您也可以在端口聲明中將s
作爲無符號提供,以避免類型轉換,並在關聯列表中進行類型轉換(實例化simplemux的端口映射)。
在numeric_std軟件包中,有一個「=」函數爲等於運算符的重載定義,其簽名爲[unsigned,natural return boolean]。
這允許比較適合於無符號數的數值與無符號數進行比較。
這將分析,詳細闡述和模擬。注意我最後拋出了一個額外的元素來處理元值。爲什麼可以用一個簡單的測試平臺不會初始化任何輸入的值來證明simplemux:
library ieee;
use ieee.std_logic_1164.all;
entity tb_simplemux is
end entity;
architecture fum of tb_simplemux is
signal i0, i1, i2, i3: std_logic; -- default value = 'U'
signal s: std_logic_vector (1 downto 0); -- default "UU"
signal o: std_logic;
begin
DUT:
entity work.simplemux
port map (
i0 => i0,
i1 => i1,
i2 => i2,
i3 => i3,
s => s,
o => o
);
MONITOR:
process
begin
wait on o;
report "o = " & std_logic'image(o);
end process;
STIMULUS:
process
begin
wait;
end process;
end architecture;
如果我們分析和闡述,然後運行測試平臺:
ghdl -r tb_simplemux
../../../src/ieee/numeric_std-body.v93:1710:7:@0ms:(assertion warning):NUMERIC_STD。「=」:檢測到元值,返回FALSE
../ .. /../src/ieee/numeric_std-body.v93:1710:7:@0ms:(assertion warning):NUMERIC_STD。「=」:檢測到元值,返回FALSE
../../../src/ieee/numeric_std-body.v93:1710:7:@0ms:(assertion warning):NUMERIC_STD。「=」:檢測到元值,返回FALSE
../ .. /../src/ieee/numeric_std-body.v93:1710:7:@0ms:(assertion warning):NUMERIC_STD。「=」:檢測到元值,返回FALSE
simplemux。VHDL:50:9:@ 0毫秒:(報告注):O = 'X'
在監視處理的wait on o;
消除0的默認值從顯示出來(這將是 'U')。註釋出來,並添加一個敏感列表與s
,你會看到:
...
simplemux.vhdl:49:9:@ 0毫秒:(報告註釋):O = 'U'
simplemux.vhdl:49:9:@ 0ms :(報告說明):o ='X'
o
的默認值也顯示出來。
在s
上有一個metavalue,你的simplemux在模擬過程中實際上不會給o
分配任何值,但會合成得很好(只考慮二進制表示值)。
'X'是信息性的,在模擬目的上有s
的元值。
我們可以在測試平臺刺激過程分配不同的值給i0
,i1
,i2
和i3
(比如「9」,「1」,「L」和「H」,後兩個圖以二進制值中合成),然後遍歷矢量s
的二進制值,並在賦值之間延遲,並證明simplemux是功能性的。您還可以設置一個與其他輸入值不同的輸入值,並通過s
的二進制值進行選通,以顯示正確的輸入被選中,從而爲每個輸入執行此操作。
這樣做的關鍵在於std_ulogic是std_logic的基本類型,而std_logic_vector或unsigned的元素類型的基本類型是一個多級值邏輯信號,它提供的不僅僅是用於仿真目的的二進制信息,我們還可以在故障排除中使用附加信息。
我們可以編寫仿真模型,告訴我們有關模型正在做什麼的信息(如來自「=」的斷言警告),同時仍能正確合成。
查看'std_logic(_vector)'的有效值,並將它們與表達式中的值進行比較,然後將其計算出來... –