Как преобразовать std_logic в беззнаковое в выражении

Поэтому, если бы я хотел присвоить 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?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
2 610
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Самый простой способ — соединить std_logic с нулевым массивом, получив массив длины 1.

Cnt <= cnt + ("" & a_valid);

Он должен иметь возможность определить тип из контекста, иначе вам может потребоваться указать его с помощью unsigned.

Мне это нравится. Это хорошая альтернатива. Вероятно, это должно быть написано (unsigned("") & (A и A_valid)).

user4574 17.07.2019 17:50

как я уже сказал, это будет зависеть от контекста. Никакой квалификации здесь не требуется, потому что есть только одна возможная функция "+" - беззнаковая + беззнаковая. Таким образом (""&A_Valid) становится беззнаковым (от 0 до 0).

Tricky 17.07.2019 21:54

Другие вопросы по теме