В сравнении с 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, но это скорее исключение, чем правило.

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