в сравнении с VHDL - PullRequest
       24

в сравнении с VHDL

18 голосов
/ 04 октября 2011

Я не уверен, что понимаю разницу между 'downto' и 'to' в vhdl.

Я видел некоторые онлайн-объяснения, но я все еще не думаю, что понимаю. Кто-нибудь может выложить это для меня?

Ответы [ 7 ]

41 голосов
/ 04 октября 2011

Если вы возьмете процессор, для систем с прямым порядком байтов мы можем использовать «downto», а для систем Bigendian - «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. Технический термин - возрастающий и убывающий диапазон массива.соглашения, такие как подписанный и неподписанный, ограничены диапазонами по убыванию. "

Таким образом, этот ответ может сбивать с толку ...

17 голосов
/ 04 октября 2011

Один идет вверх, другой идет вниз:

-- gives 0, 1, 2, 3:
for i in 0 to 3 loop

-- gives 3, 2, 1, 0:
for i in 3 downto 0 loop
11 голосов
/ 18 июля 2014

Интересная онлайн-ссылка, которую я нашел, это здесь , где, среди прочего, в разделе «Назначения массивов» вы можете прочитать:

Два объекта массива могут быть назначеныдруг с другом, пока они одного типа и одного размера.Важно отметить, что назначение осуществляется по позиции, а не по номеру индекса.Не существует понятия наиболее значимого бита, определенного в языке.Это строго интерпретируется пользователем, который использует массив.Вот примеры присвоений массивов:

со следующим объявлением:

....
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 x является старшим значащим битом (MSB), а y - младшим значащим битом (LSB).И наоборот, при использовании y downto x, y - это MSB, а x - LSB.Можно сказать, что разница для битовых векторов, представляющих целые числа, заключается в том, что индекс MSB идет первым, используете ли вы «to» или «downto» (хотя первый индекс меньше второго при использовании «to»)и больше при использовании «downto»).

2) Вы должны отметить, что y downto x означает y - это MSB, и, наоборот, x to y означает x - это MSB - известные соглашения, обычно используемые в интеллектуальной собственности.(IP) ядра вы можете найти реализованные и даже бесплатно.Это также соглашение, используемое библиотеками IEEE VHDL, я думаю, при преобразовании между битовыми векторами и целыми числами.Но нет ничего сложного в структурном моделировании, например, 32-битного сумматора, который использует входные битовые векторы вида y downto x и использует y в качестве LSB, или использует входные битовые векторы вида x to yгде x используется в качестве LSB ...

Тем не менее, разумно использовать обозначение x downto 0 для неотрицательного целого числа, поскольку позиции битов соответствуют степени 2, умноженной на цифру для добавлениядо числового значения.Похоже, что это было расширено и в большинстве других практик с целыми числами.

3) Порядок битов не имеет отношения к порядку байтов .Порядковый номер относится к упорядочению байтов (хорошо, упорядочение байтов является формой упорядочения битов ...).Порядковый номер - это проблема, раскрываемая на уровне архитектуры набора инструкций (ISA), т. Е. Она видна программисту, который может получить доступ к одному и тому же адресу памяти с разными размерами операндов (например, слово, байт, двойное слово и т. Д.).Порядок следования битов в реализации (как в вопросе) никогда не раскрывается на уровне ISA.Программисту видна только семантика относительных битовых позиций (например, логическое смещение влево может быть фактически реализовано смещением вправо регистра, значение битов которого обращено в реализации).

(Удивительно, сколько ответовкоторые упомянули об этом, проголосовали!)

4 голосов
/ 07 октября 2011

В векторных типах самый левый бит является наиболее значимым.Следовательно, для диапазона 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; напрямую.

3 голосов
/ 04 октября 2011

В большинстве случаев это просто мешает вам перепутать порядок следования битов при создании экземпляров компонентов.Вы не хотели бы хранить 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 для определения приоритета.

1 голос
/ 04 октября 2011

Меня учили, что хорошим правилом является использование «downto» для вопросов, где важно поддерживать двоичный порядок (например, 8-битный сигнал, содержащий символ), и «to» используется, когда сигнал не обязательно например, , если каждый бит в сигнале представляет собой светодиод, который вы включаете и выключаете.

, соединяющий 4-битный "downto" и 4-битный "to", выглядит как

sig1 (от 3 до 0) <= sig2 (от 0 до 3) </p>

------- 3 --------------------0

------- 2 -------------------- 1

------- 1-------------------- 2

------- 0 -------------------- 3

принимая часть сигнала вместо sig1 (от 2 до 1) <= sig2 (от 0 до 1) </p>

------- 2 -------------------- 0

------- 1 --------------------1

0 голосов
/ 01 марта 2019

Хотя ни в одном из приведенных выше ответов нет ничего плохого, я всегда считал, что положение обоих заключается в поддержке двух парадигм.

Во-первых, представление чисел. Если я напишу число 7249, вы сразу же интерпретируете его как 7 тысяч двести сорок девять. Числа читаются слева направо, где самая значимая цифра находится слева. Это случай «вниз».

Второе - это представление времени, когда мы всегда думаем о времени, прогрессирующем слева направо. На часах числа увеличиваются с течением времени, и 2 всегда следует за 1. Здесь я, естественно, записываю порядок битов слева направо по возрастанию во времени независимо от их представления. Например, в RS232 мы начинаем с начального бита, за которым следуют 8 бит данных (сначала LSB), а затем стоп-бит. Здесь MSB справа; случай «до».

Как уже было сказано, главное не смешивать их произвольно. При декодировании потока RS232 мы можем в конечном итоге сделать это, чтобы превратить биты, полученные в порядке времени, в байты, которые сначала являются MSB, но это скорее исключение, чем правило.

...