Как видите, я пытаюсь создать универсальный компонент, который проверяет, равно ли число единице (используя для этого WHEN ELSE).
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_unsigned.all;
ENTITY isone IS
GENERIC ( N: integer );
PORT (a : IN STD_LOGIC_VECTOR(N-1 DOWNTO 0);
equals : OUT STD_LOGIC);
END isone;
ARCHITECTURE rtl OF isone IS
BEGIN
equals <= '1' WHEN A = "0001" ELSE '0';
END rtl;
Моя проблема в том, как мне адаптировать "0001"
в equals <= '1' WHEN A = "0001" ELSE '0';
, чтобы увеличить его размер, когда, например, общее значение N равно 8?
Единственное решение, о котором я подумал, это заменить "0001"
на a-a +'1'
(довольно плохое)
Использование пакета numeric_std и преобразования типов, когда unsigned (A) = 1, или без преобразования типов в -2008 с использованием пакета numeric_std_unsigned. Оба гарантированно используют числовое равенство.
В пакете numeric_std для перегрузки оператора " = "[unsigned, natural return boolean] естественный параметр преобразуется с помощью to_integer с размером (длиной) другого параметра.
В общем случае следует использовать ieee.numeric_std.all вместо ieee.std_logic_unsigned, что является старым решением и не является стандартом.
Вы можете использовать функции преобразования стандартного пакета "numeric_std":
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.numeric_std.all;
ENTITY isone IS
GENERIC ( N: integer );
PORT (a : IN STD_LOGIC_VECTOR(N-1 DOWNTO 0);
equals : OUT STD_LOGIC);
END isone;
ARCHITECTURE rtl OF isone IS
CONSTANT ONE : STD_LOGIC_VECTOR(N-1 DOWNTO 0) := STD_LOGIC_VECTOR(TO_UNSIGNED(1, N));
BEGIN
equals <= '1' WHEN A = one ELSE '0';
END rtl;
Собственно, ieee.numeric_std определяет функцию:
function " = " (L: UNSIGNED; R: NATURAL) return BOOLEAN;
Так что вы могли бы просто сделать
equals <= '1' WHEN UNSIGNED(A) = 1 ELSE '0';
Или лучше начните с неподписанного
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.numeric_std.all;
ENTITY isone IS
GENERIC ( N: integer );
PORT (a : IN UNSIGNED(N-1 DOWNTO 0);
equals : OUT STD_LOGIC);
END isone;
ARCHITECTURE rtl OF isone IS
BEGIN
equals <= '1' WHEN a = 1 ELSE '0';
END rtl;
НО! если это единственный объект здесь, и вы уверены, что хотите использовать беззнаковую арифметику для ввода std_logic_Vector, вы можете использовать VHDL-2008 ieee.numeric_std_unsigned
:
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.numeric_std_unsigned.all;
ENTITY isone IS
GENERIC ( N: integer );
PORT (a : IN STD_LOGIC_VECTOR(N-1 DOWNTO 0);
equals : OUT STD_LOGIC);
END isone;
ARCHITECTURE rtl OF isone IS
BEGIN
equals <= '1' WHEN a = 1 ELSE '0';
END rtl;
equals <= '1' WHEN unsigned(A) = 1 ELSE '0';
может сработать