Почему умножение в VHDL иногда не работает должным образом с целым числом? - PullRequest
0 голосов
/ 07 апреля 2019

В VHDL со строгой типизацией при выполнении умножения я ожидаю, что следующий оператор получит 14-битный вывод:

frame_addr  : out STD_LOGIC_VECTOR(13 downto 0);

...

signal  y_pos       : unsigned(4 downto 0);

...

frame_addr <= std_logic_vector(y_pos * 320);

Но я получаю ошибку:

expression has 10 elements, but must have 14 elements

Что не имеет смысла для меня ... Поскольку 320 должно быть не менее 9 битов как без знака, 10 как целое число, а при умножении на 5-битный сигнал y_pos я бы ожидал увидеть AT-LEAST 14 бит ...

У меня есть еще одна секция кода, где это работает ОТЛИЧНО:

ram_addr <= std_logic_vector(h_pos + (v_pos * 80))(14 downto 0);

Умножение с 80 работает просто отлично, без ошибок.

Итак, я попробовал все, чтобы получить до 14 бит ... и, конечно, умножение просто не происходит, когда в моей логике ... Итак, я наконец сказал, хорошо, что если я просто умножу с BINARY, скажи ему, что я хочу ...

frame_addr <= std_logic_vector(y_pos * "101000000");

Компилируется нормально без ошибок ... И логика начинает работать так, как я ожидал.

Так почему же это несоответствие? Оба они находятся в пределах структуры архитектуры для релевантности, а не внутри процессов или чего-то подобного. Я просто не могу обернуть голову, почему существуют эти несоответствия ... Оба используют одни и те же библиотеки:

library ieee;
use ieee.std_logic_1164.ALL;
use ieee.numeric_std.ALL;

Так что же дает? Нужно ли использовать двоичный код в любом месте, где я хочу, чтобы число соответствовало коду?

1 Ответ

0 голосов
/ 07 апреля 2019

Поскольку целое число не имеет битовой длины, оно преобразуется в ту же длину, что и y_pos.Итак, в вашем первом примере Y_pos 5 бит.таким образом, 320 преобразуется в 5-битное без знака, что дает 10-битный результат.Это правило одинаково для всех арифметических операторов со знаком и без знака.

Целые числа в VHDL не имеют побитового определения, поэтому их необходимо как-то преобразовать.Компилятор не может выполнить интеллектуальное определение размера, поэтому полагается на то, что пользователь правильно его измерит.В вашем примере, преобразование 320 в 5 бит явно усекает значение, и в результате вы получите «00000» и предупреждение о том, что это происходит во время симуляции.

Здесь нет несоответствий, «101000000»и 320 совершенно разные и не связанные типы.Беззнаковое не является целым числом - это двоичное представление целого без знака.

Вы, вероятно, хотите использовать функцию to_unsigned () для ваших целочисленных литералов, чтобы получить явный размер:

frame_addr <= std_logic_vector(y_pos * to_unsigned(320, 9));
...