6 / 37 · Теория
Индексы векторов, порядок битов и знак
Читайте тракт данных, разделяя номера битов, порядок последовательной передачи и арифметическую интерпретацию.
Уроки доступны бесплатно. Запишитесь, чтобы сохранять прогресс.
Индекс — имя; смысл задаёт направление объявления
В logic [7:0] a; крайний левый разряд — a[7], а в logic [0:7] b; — b[0]. После присваивания обоим 8'h96 строки слева направо одинаковы, 10010110, но индексы битов различаются. Предположение «бит 0 всегда LSBLSB — бит с наименьшим позиционным весом. Проверяйте одновременно направление записи и правила индексации.» допустимо лишь после проверки направления объявления.
На практике согласованное направление во всём интерфейсе облегчает ревью. Явно задавайте и порядок отображения в просмотрщике диаграмм, и порядок битовых массивов в файлах. Входные JSON-массивы курса записываются от LSB, а RTL-векторы обычно читаются от MSBMSB — бит с наибольшим позиционным весом. Его индекс зависит от направления объявления вектора, поэтому нельзя всегда считать его битом с наибольшим номером..
Проверяйте направление по реальным соединениям
В q <= {q[1:0], din}; следующим q[2] будет прежнее q[1], следующим q[1] — прежнее q[0], следующим q[0] — din.
Точная спецификация — какой индекс получает какой сигнал, а не направление рисунка влево или вправо.
Стрелки показывают позиции хранения, через которые проходит бит. Все регистрыРегистр хранит многобитное состояние. Синхронные регистры в этом курсе записывают определённый вход на фронте тактового сигнала. Подробнее читают прежние значения на одном фронте. Это не означает прохождения din до q2 за один фронт.
- din: Бит, принимаемый на этом фронте
- q0: Захватите din
- q1: Захватите прежнее q0
- q2: Захватите прежнее q1
Арифметический и логический сдвиги
>> — логический сдвиг вправо, заполняющий нулями освободившиеся левые, старшие позиции. >>> можно использовать как арифметический сдвиг с расширением знака, если левый операнд signed. Даже для одинаковых битов результат зависит от знаковости операнда.
logic signed [7:0] x;
logic [7:0] logical_right, arithmetic_right;
assign logical_right = x >> 1;
assign arithmetic_right = x >>> 1;При x=8'b11111000 (−8) результаты соответственно 01111100 и 11111100. Арифметический сдвиг отрицательного числа вправо не всегда совпадает с правилом округления отрицательного целочисленного деления, поэтому в численных алгоритмах это проверяют отдельно.
Попробуйте сами
Для 3-битного q=101 и din=0 найдите следующие значения при q<={q[1:0],din} и q<={din,q[2:1]}.
Прочитать объяснение
Оба выражения дают 010: на этом входе направления случайно совпадают. При q=001, din=0 получаются 010 и 000, что позволяет различить ошибку направления.