Поэтому, если бы я хотел присвоить std_logic 1-битному usnigned, я мог бы просто написать...
signal X : unsigned(0 downto 0);
signal Y : std_logic;
X(0) <= unsigned(Y)
Но как лучше преобразовать std_logic в unsigned при использовании в выражении? То есть без прямого присваивания сигналу типа unsigned.
Сценарий у меня такой. У меня есть два флага A и B, которые являются сигналами типа std_logic. Каждый флаг имеет строб (A_valid, B_valid) типа std_logic, который подтверждается в течение 1 такта каждый раз, когда их флаг (A, B) действителен. У меня есть счетчик (CNT), который представляет собой сигнал беззнакового типа, который должен подсчитывать количество раз, когда любой из флагов равен «1». В любой заданный такт я должен увеличить CNT на 0, 1 или 2 в зависимости от того, сколько флагов равно 1.
Вот прямой способ сделать это с оператором «если».
signal A : std_logic;
signal A_valid : std_logic;
signal B : std_logic;
signal B_valid : std_logic;
signal CNT : unsigned;
if rising_edge(clk) then
if (A and A_valid and B and B_valid) = '1' then
CNT <= CNT + 2;
elsif (A and A_valid) = '1' then
CNT <= CNT + 1;
elsif (B and B_valid) = '1' then
CNT <= CNT + 1;
end if;
end if;
Проблема с приведенным выше кодом заключается в том, что он не очень хорошо обобщает, поскольку количество случаев растет экспоненциально с количеством флагов. Например, если бы у меня было 5 флагов, мне пришлось бы написать 32 ветвления в операторе IF.
Более компактный способ представления одного и того же объекта с помощью агрегата и знака типа... Это лучше, потому что я просто пишу одно выражение для каждого флага.
if rising_edge(clk) then
CNT <= CNT + unsigned'(0=> A AND A_valid) + unsigned'(0=> B AND B_valid);
end if;
Существуют ли другие встроенные способы (кроме написания функции) для преобразования std_logic в unsigned в выражении на VHDL?
Самый простой способ — соединить std_logic с нулевым массивом, получив массив длины 1.
Cnt <= cnt + ("" & a_valid);
Он должен иметь возможность определить тип из контекста, иначе вам может потребоваться указать его с помощью unsigned.
как я уже сказал, это будет зависеть от контекста. Никакой квалификации здесь не требуется, потому что есть только одна возможная функция "+" - беззнаковая + беззнаковая. Таким образом (""&A_Valid) становится беззнаковым (от 0 до 0).
Мне это нравится. Это хорошая альтернатива. Вероятно, это должно быть написано (unsigned("") & (A и A_valid)).