В сравнении с VHDL
Я не уверен, что понимаю разницу между "downto" и "to" в vhdl.
Я видел некоторые онлайн объяснения, но я все еще не думаю, что понимаю. Кто-нибудь может выложить это для меня?
6 ответов
Один идет вверх, один идет вниз:
-- gives 0, 1, 2, 3:
for i in 0 to 3 loop
-- gives 3, 2, 1, 0:
for i in 3 downto 0 loop
Если вы возьмете процессор, для систем с прямым порядком байтов мы можем использовать "downto", а для систем с бигендианами - "to".
Например,
signal t1 : std_logic_vector(7 downto 0); --7th bit is MSB and 0th bit is LSB here.
а также,
signal t2 : std_logic_vector(0 to 7); --0th bit is MSB and 7th bit is LSB here.
Вы можете свободно использовать оба типа представлений, просто убедитесь, что другие части дизайна написаны соответствующим образом.
Этот пост говорит что-то другое:
"Термин big endian (или little endian) обозначает порядок байтов в байтово-ориентированных процессорах и не подходит для битовых векторов VHDL. Технический термин - возрастающий и нисходящий диапазон массива. Предопределенные числовые типы, такие как со знаком и без знака, ограничены убывающими диапазонами условно."
Таким образом, этот ответ может быть запутанным...
Интересная онлайн-ссылка, которую я нашел, находится здесь, где, среди прочего, в разделе "Назначения массивов" вы можете прочитать:
Два объекта массива могут быть назначены друг другу, если они имеют одинаковый тип и одинаковый размер. Важно отметить, что назначение осуществляется по позиции, а не по номеру индекса. Не существует понятия наиболее значимого бита, определенного в языке. Это строго интерпретируется пользователем, который использует массив. Вот примеры присваивания массивов:
со следующей декларацией:
....
SIGNAL z_bus: BIT_VECTOR (3 DOWNTO 0);
SIGNAL a_bus: BIT_VECTOR (1 TO 4);
....
z_bus <= a_bus;
такой же как:
z_bus(3) <= a_bus(1);
z_bus(2) <= a_bus(2);
z_bus(1) <= a_bus(3);
z_bus(0) <= a_bus(4);
Замечания:
1) Любая разница между "downto" и "to" появляется, когда мы хотим использовать битовый вектор не только для представления массива битов, где каждый бит имеет независимое поведение, но и для представления целого числа. Кроме того, существует разница в значении битов из-за способа обработки чисел такими схемами, как сумматоры, множители и т. Д.
В этом, возможно, частном случае, предполагая, что 0 x to y
, х - старший значащий бит (MSB), а у - младший значащий бит (LSB). И наоборот, при использовании y downto x
у - MSB, а х - младший. Можно сказать, что разница для битовых векторов, представляющих целые числа, заключается в том, что индекс MSB идет первым, независимо от того, используете ли вы "to" или "downto" (хотя первый индекс меньше второго, когда используется "to"). и больше при использовании "downto").
2) Вы должны отметить, что y downto x
что означает у MSB и, наоборот, x to y
Значение x означает MSB - известные соглашения, обычно используемые в ядрах интеллектуальной собственности (IP), которые вы можете найти реализованными и даже бесплатно. Это также соглашение, используемое библиотеками IEEE VHDL, я думаю, при преобразовании между битовыми векторами и целыми числами. Но нет ничего сложного в структурном моделировании, например, 32-битного сумматора, который использует входные битовые векторы вида y downto x
и использовать y в качестве LSB, или использует входные битовые векторы вида x to y
где х используется в качестве LSB...
Тем не менее целесообразно использовать обозначения x downto 0
для неотрицательного целого числа, потому что позиции битов соответствуют степени 2, умноженной на цифру, чтобы сложить числовое значение. Похоже, что это было расширено и в большинстве других практик с целыми числами.
3) Битовый порядок не имеет ничего общего с порядком байтов. Порядковый номер относится к упорядочению байтов (хорошо, упорядочение байтов является формой упорядочения битов...). Порядковый номер - это проблема, раскрываемая на уровне архитектуры набора инструкций (ISA), т. Е. Она видна программисту, который может получить доступ к одному и тому же адресу памяти с разными размерами операндов (например, слово, байт, двойное слово и т. Д.). Порядок следования битов в реализации (как в вопросе) никогда не раскрывается на уровне ISA. Только семантика относительных позиций битов видна программисту (например, логическое смещение влево может быть фактически реализовано смещением вправо регистра, значение битов которого обращено в реализации).
(Удивительно, сколько ответов, в которых упоминается об этом, было проголосовано!)
В векторных типах самый левый бит является наиболее значимым. Следовательно, для 0 to n
дальность, бит 0
это MSB, для n downto 0
бит дальности n
является MSB.
Это очень удобно, когда вы комбинируете IP, который использует порядки битов с прямым и прямым порядком байтов, чтобы держать голову прямо!
Например, Microblaze является байтовым порядком байтов и использует 0
как его MSB. Я подключил один к внешнему устройству с прямым порядком байтов, поэтому я использовал 15 downto 0
на внешних выводах и переназначить их 16 to 31
на конце microblaze в моем ядре интерфейса.
VHDL заставляет вас быть откровенным об этом, поэтому вы не можете сделать le_vec <= be_vec;
непосредственно.
В большинстве случаев это просто мешает вам перепутать порядок следования битов при создании экземпляров компонентов. Вы не хотели бы хранить LSB в X(0)
и передать это компоненту, который ожидает X(0)
содержать MSB.
Практически говоря, я склонен использовать DOWNTO
для векторов битов (STD_LOGIC_VECTOR(7 DOWNTO 0)
или же UNSIGNED(31 DOWNTO 0)
) а также TO
для оперативной памяти (TYPE data_ram IS ARRAY(RANGE NATURAL<>) OF UNSIGNED(15 DOWNTO 0); SIGNAL r : data_ram(0 TO 1023);
) и интегральные счетчики (SIGNAL counter : NATURAL RANGE 0 TO max_delay;
).
Чтобы расширить ответ @KerrekSB, рассмотрим кодировщик приоритетов:
ENTITY prio
PORT (
a : IN STD_LOGIC_VECTOR(7 DOWNTO 1);
y : OUT STD_LOGIC_VECTOR(2 DOWNTO 0)
);
END ENTITY;
ARCHITECTURE seq OF prio IS
BEGIN
PROCESS (a)
BEGIN
y <= "000";
FOR i IN a'LOW TO a'HIGH LOOP
IF a(i) = '1' THEN
y <= STD_LOGIC_VECTOR(TO_UNSIGNED(i, y'LENGTH));
END IF;
END LOOP;
END PROCESS;
END ENTITY;
Направление петли (TO
или же DOWNTO
) контролирует, что происходит, когда утверждается несколько входов (пример: a := "0010100"
). С TO
выигрывает вход с наибольшим номером (y <= "100"
). С DOWNTO
выигрывает вход с наименьшим номером (y <= "010"
). Это потому, что последнее присваивание в процессе имеет приоритет. Но вы также можете использовать EXIT FOR
определить приоритет.
Меня учили, что хорошим правилом является использование "downto" для вопросов, где важно поддерживать двоичный порядок (например, 8-битный сигнал, содержащий символ), и "to" используется, когда сигнал не обязательно взаимосвязан, например, если каждый бит в сигнале представлен светодиод, который вы включаете и выключаете.
подключение 4-битного "downto" и 4-битного "to" выглядит примерно так
sig1(от 3 до 0)<=sig2(от 0 до 3)
------- 3 -------------------- 0
------- 2 -------------------- 1
------- 1 -------------------- 2
------- 0 -------------------- 3
принимая часть сигнала вместо sig1(от 2 до 1) <= sig2(от 0 до 1)
------- 2 -------------------- 0
------- 1 -------------------- 1
Хотя ни в одном из приведенных выше ответов нет ничего плохого, я всегда считал, что оба варианта поддерживают две парадигмы.
Во-первых, представление чисел. Если я напишу число 7249, вы сразу же интерпретируете его как 7 тысяч двести сорок девять. Числа читаются слева направо, где самая значимая цифра находится слева. Это случай "вниз".
Второе - это представление времени, когда мы всегда думаем о времени, прогрессирующем слева направо. На часах числа увеличиваются с течением времени, и 2 всегда следует за 1. Здесь я, естественно, записываю порядок битов слева направо по возрастанию во времени независимо от их представления. Например, в RS232 мы начинаем с начального бита, за которым следуют 8 бит данных (сначала LSB), а затем стоп-бит. Здесь MSB справа; случай "до".
Как сказано, самое главное не смешивать их произвольно. При декодировании потока RS232 мы можем в конечном итоге сделать это, чтобы превратить биты, полученные в порядке времени, в байты, которые вначале являются MSB, но это скорее исключение, чем правило.