Шауэрман Александр А. [email protected]
Что может быть проще, сложить два числа 2 и 3? Даже если числа будут представлены в двоичном коде проблем возникнуть не должно: записываем одно число под другим и поразрядно, с учетом переноса, складываем. Все просто, курс информатики за 8 класс средней школы. Но почему-то все меняется, когда сложить требуется положительное число с отрицательным, например 2 и -3, и у многих возникает сложность, как казалось бы на пустом месте, там где ее быть не должно. В данной статье не будем рассматривать принцип представления отрицательных чисел в дополнительном коде, подразумевается, что это знакомо и понятно, а попробуем изучить на практике некоторые возможности языка Verilog по работе с знаковой арифметикой, которые позволяют существенно упростить жизнь начинающему разработчику на ПЛИС.
Чтобы не быть голословным и не ограничиваться только чтением и комментированием стандарта Verilog-2001
Для того чтобы расставить все точки над i, приведу таблицу перевода десятичного числа в двоичный эквивалент.
Десятичное значение | Двоичное значение |
---|---|
7 | 4’b0111 |
6 | 4’b0110 |
5 | 4’b0101 |
4 | 4’b0100 |
3 | 4’b0011 |
2 | 4’b0010 |
1 | 4’b0001 |
0 | 4’b0000 |
-1 | 4’b1111 |
-2 | 4’b1110 |
-3 | 4’b1101 |
-4 | 4’b1100 |
-5 | 4’b1011 |
-6 | 4’b1010 |
-7 | 4’b1001 |
-8 | 4’b1000 |
Рассмотрим простой модуль, который складывает два 4-х битных числа, при этом помним, что при сложении двух n-битных чисел, разрядность результата будет n+1 бит:
module adder ( input [3:0] A, // Первый операнд input [3:0] B, // Второй операнд output [4:0] Sum // Результат ); assign Sum = A + B; endmodule
Для исследования модуля создадим в Quartus проект. В модуль верхнего уровня установим экземпляр модуля adder
:
module signed_arithmetic ( (* chip_pin = "53, 54, 55, 58, 59, 60, 64, 65" *) input [7:0] sb_i, // Тумблеры (* chip_pin = "11, 10, 8, 7, 6, 3, 2, 1" *) output [7:0] led_o // Светодиоды ); adder adder_inst( .A(sb_i[3:0]), .B(sb_i[7:4]), .Sum(led_o[4:0]) ); endmodule
Сам исследуемый модуль можно поместить в том же файле, ниже основного. Компилируем, загружаем в стенд.
Устанавливая операнды A и B с помощью тумблеров. Легко убедиться, что сумматор дает вполне корректный результат, если оба операнда положительны, но что будет если один из них станет отрицательным? Проверим схему на двух примерах, сложим числа 1 (4’b0001) и -3 (4’b1101), 3 (4’b0011) и -3 (4’b1101).
B | A | Sum |
---|---|---|
1101 (-3) | 0001 (1) | 01110 (14) |
1101 (-3) | 0011 (3) | 10000 (-16) |
Не совсем то, что мы хотели бы увидеть. В первом примере такой же результат (5’b01110) даст сложение двух положительных чисел 7 (4’b0111) и 7 (4’b0111). В чем же дело? А дело в не совсем очевидной дополнительной операции, возникающей при сложении двух чисел – увеличение разрядности операндов. Когда мы складываем столбиком два числа, мы как бы подразумеваем наличие в слагаемых дополнительного старшего равного нулю разряда (выделено серым):
01101 (-3)
+ 00001 (1)
01110 (14)
Если посмотреть синтезируемую Quartus схему (Tools -> Netlist Viewers -> RTL Viewer, RTL – Register Transfer Level), то можно убедиться, что именно так и поступает компилятор:
Рисунок 1 – RTL беззнакового сумматора
Старшие разряды соединены с общим проводом, на них подается ноль.
Но этот старший разряд не всегда должен быть ноль! Старший разряд должен содержать признак знака, и потому, если число отрицательное, дополнено оно должно быть единицей: 11101 (-3)
+ 00001 (1)
11110 (-2)
Таким образом, следуя элементарной логике, перед сложением операнды необходимо дополнить знаковым разрядом. Решая эту задачу в лоб, изменим модуль adder следующим образом:
module adder ( input [3:0] A, input [3:0] B, output [4:0] Sum ); assign Sum = {A[3],A} + {B[3],B}; endmodule
Компилируем, смотрим RTL:
Рисунок 2 – RTL знакового сумматора
Теперь на вход сумматора подается все 5 разрядов. Загружаем, проверяем. Работа с положительными числами осталась без изменений, а вот сложение чисел из предыдущего примера дает корректный результат:
B | A | Sum |
---|---|---|
1101 (-3) | 0001 (1) | 11110 (-2) |
1101 (-3) | 0011 (3) | 00000 (0) |
Несмотря на работоспособность такая реализация обладает плохой масштабируемостью, а модули плохо параметризируются: представьте себе, что необходимо сложить числа различной разрядности, придется вручную вычислять и задавать длину знакового дополнения. Поэтому в Verilog начиная с версии 2001-го года, а именно эта версия используется в Quartus по умолчанию, введена поддержка знаковых операций, если для объявления A и B использовать знаковый тип, то компилятор задачу дополнения знаковыми разрядами возьмет на себя. В этом случае модуль будет иметь следующий вид:
module adder ( input signed [3:0] A, input signed [3:0] B, output signed [4:0] Sum ); assign Sum = A + B; endmodule
Нетрудно убедиться, что RTL и функционирование схемы будет точно такими же, как и в предыдущем случае (рисунок 2).
В примерах выше я использовал положительный операнд А. Может быть не обязательно порт A объявлять, как signed
? Исследуем модуль:
module adder ( input [3:0] A, input signed [3:0] B, output signed [4:0] Sum ); assign Sum = A + B; endmodule
После компиляции получаем RTL как на рисунке 1, что соответствует беззнаковому сумматору. При этом не только операнд A дополнен нулем, но и операнд B. Естественно, поведение схемы описывает таблица 2. И это полностью соответствует стандарту Verilog-2001. Запомним одно важное правило, актуальное не только для операции сложения, но и для всех арифметических операций:
Если хотя бы один из операндов имеет тип unsigned
, результат будет беззнаковым, независимо от остальных операндов и типа операции.
И наоборот:
Если все операнды знаковые (signed), то результат тоже будет знаковый.
Из этого правила следует еще одно очевидное правило:
Тип выражения определяется типом его операндов и не зависит от типа переменной, в которую присваивается результат.
Это значит, что в объявлении выходного порта Sum
, слово signed
можно опустить. На результате это не скажется, однако я не рекомендую этого делать, так как ключевое слово signed
выполняет роль комментария и помогает понять логику работы модуля.
Доверить компилятору управление знаковым разрядом – это хорошая идея. Используя тип signed
строить выражения на основе знаковой арифметики стало удобно, но проблема может прийти откуда ее совсем не ждали. А если нам понадобится сложить знаковое и беззнаковое число? Если следовать логике приведенных выше правил, при сложении знакового и беззнакового чисел результат будет беззнаковым.
Для решения таких задач стандартом языка предусмотрены специальные системные функции $signed()
и $unsigned()
. Эти функции по сути своей являются директивами компилятору, они говорят ему, как он должен интерпретировать выражение. При этом разрядность входного выражения не меняется.
$signed
– возвращаемое значение знаковое,
$unsigned
– возвращаемое значение беззнаковое.
Попробуем переписать модуль из предыдущего примера, где мы пытались операнд A сделать беззнаковым, с использованием функции $signed
.
signed
, и все значения больше 4’b0111 (‘d7) окажутся отрицательными, так как старший бит будет равен единице. Чтобы этого не произошло, вручную дополним старший бит нулем:module adder ( input [3:0] A, input signed [3:0] B, output [4:0] Sum ); assign Sum = $signed({1'b0, A}) + B; endmodule
Рисунок 3 – RTL сумматора. A – беззнаковый, B – знаковый
Как видно из RTL, старший бит операнда A всегда равен нулю, а операнд B остался знаковым. Операнд A может принимать только положительные значения в соответствии со своей разрядностью: от 0 и до 15, а операнд B может быть от -8 до 7. Так как разрядность выхода так и осталась 5 бит, диапазон значений Sum: от -16 и до 15. Потому, несмотря на то, что такой сумматор корректно работает, может возникнуть переполнение, если результат должен получиться более 15.
Загрузим в ПЛИС, помимо уже привычных нам примеров (-3+1 и -3+3) добавим еще несколько, чтобы продемонстрировать новые свойства.
B знаковый | A беззнаковый | Sum знаковый | Комментарии | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1101 (-3) | 0001 (1) | 11110 (-2) | Числа из предыдущих примеров. Ничем не примечательны. Работает корректно. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1101 (-3) | 0011 (3) | 00000 (0) | То же. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1101 (-3) | 1000 (8) | 00101 (5) | A превышает максимальное допустимое положительное число для знакового типа разрядностью 4. Результат корректен. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
0111 (7) | 1000 (8) | 01111 (15) | B – максимальное допустимое положительное число. Sum[4];
endmodule Рисунок 4 – RTL cумматора с флагом переполнения Сумматор с переносомТипичный пример сложения смешанных типов – это сумматор, который должен учитывать флаг переноса. Флаг переноса представляет собой такой же полноценный операнд как A и B, только состоит всего из одного бита, принимает значение либо 0, либо 1. Ни о каком знаке в однобитном числе и речь идти не может. Получается тип у флага переноса будет беззнаковый, а это значит, результат сложения тоже будет беззнаковым. Для решения задачи воспользуемся приемом из предыдущего пункта: дополним вход переноса нулем и преобразуем к знаковому типу: module adder ( input signed [3:0] A, input signed [3:0] B, input carry_in, output signed [4:0] Sum ); assign Sum = A + B + $signed({1'b0, carry_in}); endmodule Рисунок 5 – RTL сумматора с переносом Для того, чтобы испытать модуль на учебном стенде, нам понадобится в модуль верхнего уровня добавить еще один вход – вход тактовой кнопки. Его мы будем использовать в качестве входа переноса. Кнопка работает с инверсией: если отпущена, то на входе будет логическая единица, если нажата, то ноль. Для удобства при установке экземпляра модуля учтем и это. Ниже на листинге показан исходный код модуля верхнего уровня: module signed_arithmetic( (* chip_pin = "53, 54, 55, 58, 59, 60, 64, 65" *) input [7:0] sb_i, // тумблеры (* chip_pin = "52" *) input sw_i, // кнопка (* chip_pin = "11, 10, 8, 7, 6, 3, 2, 1" *) output [7:0] led_o // светодиоды ); adder adder_inst( .A(sb_i[3:0]), .B(sb_i[7:4]), .carry_in(~sw_i), .Sum(led_o[4:0]) ); endmodule Компилируем, загружаем, убеждаемся, что модуль работает верно: к результату сложения операндов A и B (устанавливаются тумблерами) прибавляется единица, если кнопка нажата. Знаковое перемножениеРазрядность результат перемножения двух n-битных значений равно 2n. По аналогии со сложением, в начале разберемся, как выполнить операцию умножения в столбик. Второй множитель (второй операнд) рассматривается побитно, начиная с младшего значимого бита, если бит равен единице, то первый множитель сдвигается влево на число позиций, равных весу текущего бита второго множителя и прибавляется к результату. При этом, если операция беззнаковая, то слева слагаемые дополняются нулем (дополнительные элементы показана серым): 1101 (-3) Если операция знаковая, то дополняется знаковым битом: 1101 (-3) В первом случае 4’b1101 (-3) было интерпретировано не как отрицательное число, а как положительное 13, потому и произведение получилось 26. Во втором случае, получен корректный результат с точки зрения знаковой арифметики. Реализовать такой сумматор на языке Verilog достаточно просто, сделаем модуль по аналогии с сумматором: module multipliers ( input signed [3:0] A, input signed [3:0] B, output signed [7:0] Mult ); assign Mult = A * B; endmodule Компилируем, смотрим RTL: Рисунок 6 – RTL знакового умножителя Загружаем в ПЛИС, проверяем, результат исследования сведем в таблицу:
Если требуется умножить знаковое число на беззнаковое, дополним беззнаковый операнд нулем и преобразуем к знаковому типу: module multipliers ( input [3:0] A, input signed [3:0] B, output signed [7:0] Mult ); assign Mult = $signed({1'b0, A}) * B; endmodule
Как и раньше, результат исследования сведем в таблицу:
Небольшие советы1. Результат сцепления (Concatenation) всегда дает беззнаковый результат. Потому в предыдущих примерах, при ручном добавлении знакового разряда к флагу переноса, приходилось применять функцию wire signed [N-1:0] max = $signed({1'b0,{(N-1){1'b1}}}); А самое маленькое отрицательное число (самое большое по модулю): wire signed [N-1:0] min = $signed({1'b1,{(N-1){1'b0}}}); 2. Выборка из вектора одного или нескольких бит всегда будет беззнаковой. Результат будет беззнаковым даже если выбрать вектор полностью. Для примера выведем на светодиоды значение wire signed [5:0] min = $signed({1'b1,{5{1'b0}}}); // 6'b100000 (-32) assign led_o = min; // разрядность led_o – восемь В результате на светодиоды выведется значение 1110 0000. При присвоении знакового числа знаковый разряд заполнил дополнительные биты, произошло знаковое расширение числа до разрядности приемника. Значение -32 сохранилось. Теперь проделаем, казалось бы, тоже самое, но с помощью выборки из вектора wire signed [5:0] min = $signed({1'b1,{5{1'b0}}}); // 6'b100000 (-32) assign led_o = min[5:0]; // разрядность led_o – восемь Выборка 3. Уверен, как задавать беззнаковую константу всем известно. По аналогии можно задавать знаковые положительные и отрицательные константы: -8'd11 // Можно поставить знак минус перед числом, 8'd-11 // а вот так будет не верно. -8'h0B // То же самое, только в шестнадцатеричной форме, 8'shF6 // Дополнительный символ "s" указывает на то, что число // должно интерпретироваться как знаковое. -8'b00001011 // То же самое, но в двоичной форме. 8'sb11110101 // То же значение, но с помощью "s". 4. При разработке на ПЛИС часто встречается конструкция с тернарным оператором выбора: assign led_o = ( <условие> ) ? 0 : (A + B); // беззнаковый результат При такой записи, даже если операторы A и B будут объявлены как знаковые, результат операции будет беззнаковым! Это довольно распространенная ошибка. Но это полностью соответствует правилу: если хотя бы один из операторов в выражении assign led_o = ( <условие> ) ? 'sh0 : (A + B); // знаковый результат Вместо заключенияПриведу краткий свод правил, памятку по работе с знаковым типом. 1. Результат сцепления будет беззнаковым, независимо от типа операндов. 2. Результат выборки одного или нескольких бит из вектора будет беззнаковым. 3. Для приведения выражения к знаковому типу используется системная функция $signed. 4. Для приведения выражения к беззнаковому типу используется системная функция $unsigned. 5. Результат сравнения имеет беззнаковый тип. 6. Если хотя бы один из операндов имеет беззнаковый тип (unsigned), результат будет беззнаковым, независимо от остальных операндов и типа операции. Если все операнды знаковые (signed), то результат тоже будет знаковый. 7. Тип выражения определяется только типом операторов и не зависит от типа переменной, которому это значение присваивается. 8. При записи знаковых констант можно воспользоваться дополнительным символом «s». Литература1. IEEE Standard Verilog Hardware Description Language, IEEE Computer Society, IEEE, New York, NY, IEEE Std 1364-2001. Принципиальная схема стенда LESO2.4 5.2. Умножитель знаковых целых чисел4.4. Сценарии и функцииУчебное 4. Функциональные пособие модели устройств на языке Verilog на основе потоков данных 125 4.4. Сценарии и функции 4.4.1. Общая характеристика подпрограмм в языке Verilog Одним из наиболее распространенных Подробнее3.2. Оператор включения модуля48 Verilog-HDL для моделирования и синтеза цифровых электронных схем 3.2. Оператор включения модуля Оператор описания модуля, рассмотренный в предыдущем разделе, позволяет описывать интерфейсную модель Подробнее4.2. Поведенческое моделирование91 4.2. Поведенческое моделирование Поведенческие операторы Verilog-программ концентрируются в блоках always и. Эти операторы являются базовыми в поведенческом моделировании электронных устройств. Каждый Подробнее2.6. Структуры данных Verilog30 Verilog-HDL для моделирования и синтеза цифровых электронных схем 2.6. Структуры данных Verilog При определении типа объектов данных в Verilog-программе (переменные, сигналы и пр.) следует учитывать ПодробнееБлок 8 Verilog: базовый синтаксисЯзыки описания схем (mk.cs.msu.ru Лекционные курсы Языки описания схем) Блок 8 Verilog: базовый синтаксис лектор: Подымов Владислав Васильевич e-mail: [email protected] Осень 2017 (V) Немного о семантике Подробнее4.3. Структура языка Verilog112 Verilog-HDL для моделирования и синтеза цифровых электронных схем 4. 3. Структура языка Verilog Для реализации сложных функциональных моделей язык Verilog содержит стандартные алгоритмические конструкции, Подробнее1. ЗАДАНИЕ НА КУРСОВОЙ ПРОЕКТВВЕДЕНИЕ Выполнение курсового проекта рассчитано на закрепление студентом прослушанного курса «Вычислительная техника», получение опыта и практического навыка для решения разнообразных инженерных задач. Подробнееhttp://library.bntu.by/solovev-v-v-osnovy-yazyka-proektirovaniya-cifrovoy-apparatury-verilog Введение… 3 Глава 1. Предварительное знакомство с языком V erilog. 7 1.1. История языка Verilog… 7 1.2. ПодробнееЛабораторная работа 5. ВычислительЛабораторная работа 5. Вычислитель Цель работы: изучение типовой архитектуры вычислительных устройств, совершенствование навыков разработки и моделирования устройств и систем с помощью HDL-кода на примерах ПодробнееКУРСОВАЯ РАБОТА ПО ТЕОРИИ АВТОМАТОВФЕДЕРАЛЬНОЕ АГЕНСТВО ПО ОБРАЗОВАНИЮ ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ «МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ ИНСТИТУТ РАДИОТЕХНИКИ, ЭЛЕКТРОНИКИ И АВТОМАТИКИ (ТЕХНИЧЕСКИЙ ПодробнееТема 3.Введение в VHDLТема 3. Введение в VHDL Введение в VHDL VHDL расшифровывается, как Very high speed Integrated Circuit Hardware Description Language. HDL это язык описания аппаратуры. Т.е. основная задача таких языков ПодробнееЦифровые сигнальные процессоры TMS320C674xОсновы программирования цифровых сигнальных процессоров Цифровые сигнальные процессоры TMS320C674x Конспект лекций РГРТУ, 2018 Лекция 2. Архитектура ЦСП операционное ядро По фон-нейману электронно-вычислительная ПодробнееЛабораторная работа 1Лабораторная работа 1 «Исследование подсистемы памяти ЭВМ» Цель работы: Изучение иерархии, назначения и типов памяти ЭВМ. Исследование интерфейсов типовых запоминающих устройств. Задачи: 1. Изучение классификации ПодробнееФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ «МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ ИНСТИТУТ РАДИОТЕХНИКИ, ЭЛЕКТРОНИКИ И АВТОМАТИКИ (ТЕХНИЧЕСКИЙ Подробнее3.5. Синтез простейших логических цепей67 3.5. Синтез простейших логических цепей Заметим, что оператора включения модуля уже достаточно для описания на языке Verilog простейших цифровых устройств, состоящих из стандартных логических элементов. ПодробнееФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ «МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ ИНСТИТУТ РАДИОТЕХНИКИ, ЭЛЕКТРОНИКИ И АВТОМАТИКИ (ТЕХНИЧЕСКИЙ ПодробнееВычислительная техникаВычислительная техника ВОПРОСЫ НА ВЫБОР ВАРИАНТА ОТВЕТА 1.Какой вход коммутируется на выход мультиплексора (Q) при заданных сигналах на адресных входах? 1. Q=D5 2. Q=D7 3. Q=D6 4. Коммутации не произойдет ПодробнееУДК КОНВЕЙЕРНЫЕ УСТРОЙСТВА НА FPGAУДК 004. 31 КОНВЕЙЕРНЫЕ УСТРОЙСТВА НА FPGA Волошин Д.Н., Зинченко Ю.Е., Дяченко О.Н. Донецкий национальный технический университет кафедра компьютерной инженерии E-mail: [email protected] Источник: ПодробнееАрифметика в фиксированной точкеАрифметика в фиксированной точке 1. Основные вопросы Системы счисления Система счисления представляет из себя набор правил и символов для записи числа. Человечество на протяжении истории своего развития ПодробнееКомбинационные и последовательные схемыФедеральное агентство по образованию Государственное образовательное учреждение высшего профессионального образования Ухтинский государственный технический университет Комбинационные и последовательные ПодробнееКлючевые слова: АППАРАТНАЯ РЕАЛИЗАЦИЯ, АЛУ, ЯЗЫК ПРО- ГРАММИРОВАНИЯ ЛЯПАС, ПЛИС, ЯЗЫК ОПИСАНИЯ АППАРАТУРЫ VHDL, ФУНКЦИОНАЛЬНОЕ МОДЕЛИРОВАНИЕисточников. Реферат Дипломная работа содержит 28 страниц, 1 рисунок, 9 литературных Ключевые слова: АППАРАТНАЯ РЕАЛИЗАЦИЯ, АЛУ, ЯЗЫК ПРО- ГРАММИРОВАНИЯ ЛЯПАС, ПЛИС, ЯЗЫК ОПИСАНИЯ АППАРАТУРЫ VHDL, ФУНКЦИОНАЛЬНОЕ ПодробнееРис Схема включения процессора.2.Организация обмена информацией: Функции устройств магистрали 2.4. Функции устройств магистрали Рассмотрим теперь, как взаимодействуют на магистрали основные устройства микропроцессорной системы: процессор, Подробнее(PDF) Библиотека VERILOG описаний арифметических операций в поле Галуа49СОВРЕМЕННАЯ ЭЛЕКТРОНИКА ◆№ 5 2007 WWW.SOEL.RU ПРОЕКТИРОВАНИЕ И МОДЕЛИРОВАНИЕ © СТАПРЕСС Новости мира News of the World Новости мира Toshiba перейдёт на 43 нм в течение года? Намереваясь опередить компанию Samsung Electronics в технологической гонке, Toshiba планирует в конце 2007/на чале 2008 г. запустить производство флэшпамяти типа NAND по 43нм про ектным нормам. Переход на более преци зионные нормы позволит Toshiba сущест венно сократить удельную стоимость микросхем, получаемых с кремниевой пластины. По оценкам издания Nikkei business daily, при 43нм производстве количество чипов, получаемых с одной пластины, увеличивается примерно на 40% по срав нению с 56нм. Таким образом, Toshiba будет иметь потенциальный 40процент ный запас по снижению цен на свою про дукцию, что даст ей неоспоримые преи мущества перед конкурентами. Как извест но, на данный момент технологическим лидером в этой отрасли является компа ния Samsung, которая ещё в марте нача ла отгрузки образцов 50нм NANDчипов. Потеснит ли Toshiba своего главного конкурента в технологической гонке? Успеет ли она вовремя и без задержек пе рейти на инновационное производство? Пока ответить на эти вопросы сложно, ведь сам производитель ещё даже офици ально не подтвердил свои планы по пере ходу на 43 нм. Источник утверждает, что к концу текущего года Toshiba построит за вод для 43нм производства в югозапад ной префектуре Мие (Mie Prefecture), что в Японии. Этот завод станет четвёртым по производству чипов памяти в Японии. cdrinfo.com 20 DRAM*чипов в упаковке толщиной 1,4 мм Молодая компания Akita Elpida Memory (создана летом 2006 г. по инициативе Elpida, известного производителя DRAM памяти) сообщила о разработке нового метода упаковки чипов. С его помощью ей удалось впервые в мире поместить 20 полупроводниковых кристаллов DRAM в одной MCPупаковке (multichip pack age) толщиной всего 1,4 мм. Для достижения успеха инженеры Akita Elpida разработали инновационную тех нологию для утонения (шлифовки) кри сталлов толщиной 30 мкм перед упаков кой, метод соединения слоёв с помощью тончайших проводников, технику впры скивания канифоли в микроскопические отверстия. Компания намерена тесно со рудничать с производителями оборудова ния для дальнейшего продвижения своей разработки и коммерциализации произ водства. Хочется отметить важность подобных разработок в свете беспрерывного про цесса миниатюризации портативной тех ники и растущих требований к её произ водительности. В этой области работает множество полупроводниковых компа ний. Из недавних достижений стоит отме тить разработки таких производителей, как IBM и Samsung Electronics. www.3dnews.ru Samsung на пути к созданию ОЗУ нового поколения Одним из важнейших технологических достижений в полупроводниковой отрас ли за последний месяц стала разработка компанией IBM методики так называемой «трёхмерной» упаковки чипов. Нечто по добное на днях анонсировала и компания Samsung Electronics. Как сообщается в прессрелизе, Samsung разработала метод упаковки чи пов памяти, использующий технологию TSV (through silicon vias, внутрикремние вые межсоединения). По заявлению ком пании, это позволит существенно уско рить память, уменьшить энергопотребле ние и габариты микросхем. Новая упаковка называется WSP (waferlevelprocessed stacked package). Она может вмещать четыре чипа DDR2 DRAM плотностью 512 Мбит (4 ×512 Мбит). Используя такие двухгигабитные структу ры, Samsung может создать модули ОЗУ ёмкостью 4 Гб. Инновационный технологический ме тод Samsung устраняет необходимость в относительно длинных металлических проводниках, которые соединяют между собой традиционные «двухмерные» чи пы и их составные элементы, заменяя эти проводники внутрикремниевыми со единениями. Межсоединения TSV пред ставляют собой вертикальные каналы диаметром порядка единиц микрон, про травленные в кремниевой пластине с по мощью лазера и заполненные проводни ком – медью. Такие внутрикремниевые соединения позволяют располагать кри сталлы плотнее и создавать более тонкие упаковки. Межсоединения throughsilicon vias покрыты алюминием, который играет роль экрана, в результате чего снижаются перекрестные помехи. Конкретные сроки внедрения новой разработки в массовое производство пока не называются. www.3dnews.ru После Intel о 450*мм пластинах заговорила TSMC Компания TSMC (Taiwan Semiconductor Manufacturing Company) сформировала группу, заданием которой является оцен ка осуществимости перехода на произ водственный процесс с использованием кремниевых пластин диаметром 450 мм. Представители TSMC подтверждают за интересованность в переходе на 450мм пластины, но отмечают, что о какихлибо сроках внедрения нового производства речь пока идти не может. Напомним, что на Форуме IDF Spring 2007, который не давно завершился в Пекине, компания Intel также выразила сильную заинтере сованность в 450мм производстве. На данный момент в полупроводнико вой индустрии лидерство продолжают удерживать 200мм фабрики, которые могут похвастаться объёмом производст ва в 380. ..390 тыс. пластин в месяц. 300мм фабрики постепенно набирают обороты, и уже сегодня количество чипов, изготавливаемых на новых производст венных линиях за месяц, эквивалентно производству 200 тыс. 200мм пластин. Переход на 450мм пластины понизит удельную стоимость микросхем, но перво начальные вложения в такое производст во в три раза превышают инвестиции в 300мм производство. Поэтому, как счита ют эксперты, компаниям стоит задуматься о переходе именно на 300мм пластины – это самое оптимальное решение на сегод няшний день. В 2009 г. 300мм фабрики полностью вытеснят старые 200мм. По оценкам специалистов IEK (Taiwan’s Industrial Economics and Knowledgde Center), среди тайваньских компаний в будущем одними из первых 450мм фаб рики построят TSMC, Powerchip Semi conductor Corporation (PSC), Nanya Tech nology и ProMOS Technologies. Но когда будет построена первая 450мм фабри ка? На этот вопрос пока никто не может дать определённый ответ. digitimes.com Verilog. Фиксированая точка и умножитель | IT. Как это работает?Всем привет! На этот раз разберемся с числами с фиксированной точкой. До этого момента мы рассматривали и проводили операции только с целыми числами, однако, не одними целыми числами живы вычисления. Существует немало областей, где без представления числа с дробной частью просто не обойтись. В зарубежных источниках предмет нашего рассмотрения называется числа с фиксированной точкой, мы же больше привыкли к запятой. В программах верстки на виртуальных листах бумаги расстояния измеряются долями миллиметров. Использование чисел с дробной частью для измерения расстоянийТочное время без долей записать невозможно, денежные операции зачастую сопряжены с дроблением валюты. Уж если мы заговорили об обработке сигнала, то необходимо особо подчеркнуть, что одними целыми числами мы никак не обойдемся. При обработке сигнала использование чисел с фиксированной точкой строго обязательно. Как устроено двоичное число с дробной частью?Теперь настало время разобраться с этими числами подробнее. Число с фиксированной точкой это двоичное число, имеющее строго определенное назначение разрядов. Старший бит такого числа отвечает за его знак. Ноль в старшем разряде — признак положительного числаОстальные делятся на отвечающие за целую и дробную части. Конструкцию числа можно задать двумя параметрами. Параметр N показывает сколько бит в числе, параметр Q показывает сколько бит выделяется под дробную часть. Арифметика определяется числом бит Q в дробной частиСо знаком и целой частью все предельно ясно и без сюрпризов, а о дробной части стоит поговорить подробнее. Как мы знаем, у чисел с дробной частью после запятой расположена часть единицы. Все так и остается, двоичное число показывает сколько долей единицы от максимально возможного. Это немного непривычно и более-менее становится понятно при помощи пропорции, которой можно вычислить двоичный код дробной части. Представление дробной части в двоичном видеВ представленном примере необходимо получить двоичный код числа 0.6, при этом под дробную часть выделено 4 бита. Значит 5-й бит это уже будет целая единица, тогда при помощи пропорции находим решение. Очень важный вопрос о той самой запятой между целой и дробной частью. В действительности, никакая схемотехника не поддерживает существование этой запятой. Это всего лишь вопрос интерпретации пользователя. Преобразование чисел из прямого в дополнительный код, сложение и вычитание чисел — ни на какую из этих операций эта самая запятая (точка) не влияет. Исключением является умножение. Умножение при помощи целочисленного умножителяДля того, чтобы умножить два числа, используют целочисленный аппаратный умножитель, присутствующий в ПЛИС. Этот блок умеет умножать целые числа, а уж если возникла необходимость учитывать знаки множителей, их дробные части и преобразовать форматы, так это целиком и полностью забота программиста. По счастью, ничего сложного во всем перечисленном нет. Знак результата это операция исключающего ИЛИ над старшими битами. Если оба множителя положительные или оба отрицательные, то результат положителен. В чистом виде операция XOR. При учете количества знаков после запятой можно просто провести сдвиг результата вправо и тем самым сохранить нужно число бит в дробной части. Пожалуй, стоит детально разобрать только необходимость преобразования множителей из дополнительного кода в прямой. Умножитель справится со своей работой только в этом случае. Прямой и дополнительный код числаСоздадим пару модулей преобразования чисел из прямого в дополнительный код и обратно. Как мы помним, для положительных чисел их двоичные представления совпадают. Но как только мы имеем дело с отрицательными числами, то появляется необходимость в несложных операциях преобразования. Для начала преобразуем число из прямого кода в дополнительный. Отрицательный знак оставляем в покое, потом инвертируем (~) все справа от знака и прибавляем единицу. Модуль преобразования чисел из прямого в дополнительный кодОбратное преобразование происходит так: оставляем отрицательный знак в покое, вычитаем единицу и инвертируем (~). Модуль преобразования чисел из дополнительного в прямой кодКак происходит умножение?Небольшое отступление. Произведение двух чисел с фиксированной запятой в десятичной и двоичной системах счисления происходит похожим образом. Поразрядным умножением получаем несколько слагаемых, что в двоичной системе счисления упрощает все оборудование, так как вариантов всего два. Это единица и ноль. Сложение чисел в обеих системах счисления не представляет ничего сложного, в двоичной системе с этой задачей хорошо справляется арифметико-логическое устройство. Как можно заметить под результат умножения необходимо выделить в два раза больше бит, чем требуется для множителя. Умножение на низком уровнеКак и в случае десятичной системы счисления, в двоичной системе результат отделяется запятой ровно через столько разрядов, сколько разрядов после запятой в совокупности у каждого из множителей. Если попытаться привести результат в такой же формат данных, как и у множителей, то необходимо будет оставить три разряда после запятой. Это приведет к потери части результата и приводит к шуму округления. Это несоответствие между настоящим результатом и округленным значением Блок умножения чисел с фиксированной точкойТак же, как это делается в тетрадках в клетку в младшей школе, умножение чисел с дробной частью подчиняется определенному правилу. Запятой в результате отделяется столько цифр, сколько их отделено у множителей. В двоичном представлении правило не меняется. Умножитель чисел с фиксированной точкой на языке VerilogВ разработанном умножителе в первую очередь происходит преобразование чисел в прямой код (модули d2p). Под результат целочисленного умножения выделяется в два раза больше бит, чем во множителе. При учете количества бит в дробной части отбрасываются младшие биты результата и не забываем про обратное преобразование числа в дополнительный код (модуль p2d). МоделируемНапишем небольшой тестовый модуль, где умножим два положительных числа 2,5 на 6,25. Потом попробуем совершить умножение чисел с разными знаками. Тестовый модуль умножителяВ результате, нас ждут довольно сложные в интерпретации результаты, но лучше день потерять, но потом за 5 минут долететь. Так что во избежании ошибок в дальнейшем, интерпретируем, дамы и господа! Результат моделированияПри умножении двух положительных чисел знак положительный, результат 15,625 что соответствует истине. При умножении 2,5 на -0,999.. результат -2,5, что тоже верно (точность — не лучшее качество цифровых вычислителей). Поддержите статью лайком если понравилось и подпишитесь чтобы ничего не пропускать. Таблица умножения: 32bit_me — LiveJournalНи один проект на Verilog не может быть использован и запущен в железе до тех пор, пока он не пройдёт полную верификацию с 100% тестовым покрытем.Для верификации используется множество методов и инструментов, однако для своих простых проектов я использую простые тестбенчи на обычном же Verilog (даже не на System, хотя следовало бы). Обычно нужно проверить все «corner cases», т.е. разные максимальные и минимальные значения переменных, а затем проверить по возможности большое количество случайных комбинаций сигналов и команд, подаваемых на тестируемый модуль. По-научному это называется CRT, Constrained Random Testing, то есть тестирование случайными сигналами, на которые наложены некоторые ограничения. Хороший тест бывает очень непросто придумать. Главное при верификации цифрового дизайна, чтобы в тестируемой схеме (DUT, device under test) при прохождении теста было проверено срабатывание каждой цепи хотя бы один раз. Тогда такой тест будет иметь покрытие 100%, чего и нужно добиваться. Не зря в серьёзных местах разработкой тестов занимаются специально обученные люди, инженеры по верификации. Вот, например, кусок из тестового файла, который тестирует модуль умножения: 0000000000000000 0000000000000000 0000000000000000 //0 * 0 = 0 0000000000000000 8000000000000000 8000000000000000 //0 * -0 = -0 0000000000000000 7ff8000000000000 7ff8000000000000 //0 * nan = nan 0000000000000000 fff8000000000000 fff8000000000000 //0 * nan = nan 0000000000000000 7ff0000000000000 fff8000000000000 //0 * +inf = nan 0000000000000000 fff0000000000000 fff8000000000000 //0 * -inf = nan 8000000000000000 0000000000000000 8000000000000000 //-0 * 0 = -0 8000000000000000 8000000000000000 0000000000000000 //-0 * -0 = 0 8000000000000000 7ff8000000000000 7ff8000000000000 //-0 * nan = nan 8000000000000000 fff8000000000000 fff8000000000000 //-0 * nan = nan 8000000000000000 7ff0000000000000 fff8000000000000 //-0 * +inf = nan 8000000000000000 fff0000000000000 fff8000000000000 //-0 * -inf = nan 7ff8000000000000 0000000000000000 7ff8000000000000 //nan * 0 = nan 7ff8000000000000 8000000000000000 7ff8000000000000 //nan * -0 = nan 7ff8000000000000 7ff8000000000000 7ff8000000000000 //nan * nan = nan 7ff8000000000000 fff8000000000000 7ff8000000000000 //nan * nan = nan 7ff8000000000000 7ff0000000000000 7ff8000000000000 //nan * +inf = nan 7ff8000000000000 fff0000000000000 7ff8000000000000 //nan * -inf = nan fff8000000000000 0000000000000000 fff8000000000000 //nan * 0 = nan fff8000000000000 8000000000000000 fff8000000000000 //nan * -0 = nan fff8000000000000 7ff8000000000000 fff8000000000000 //nan * nan = nan fff8000000000000 fff8000000000000 fff8000000000000 //nan * nan = nan fff8000000000000 7ff0000000000000 fff8000000000000 //nan * +inf = nan fff8000000000000 fff0000000000000 fff8000000000000 //nan * -inf = nan 7ff0000000000000 0000000000000000 fff8000000000000 //+inf * 0 = nan 7ff0000000000000 8000000000000000 fff8000000000000 //+inf * -0 = nan 7ff0000000000000 7ff8000000000000 7ff8000000000000 //+inf * nan = nan 7ff0000000000000 fff8000000000000 fff8000000000000 //+inf * nan = nan 7ff0000000000000 7ff0000000000000 7ff0000000000000 //+inf * +inf = +inf 7ff0000000000000 fff0000000000000 fff0000000000000 //+inf * -inf = -inf fff0000000000000 0000000000000000 fff8000000000000 //-inf * 0 = nan fff0000000000000 8000000000000000 fff8000000000000 //-inf * -0 = nan fff0000000000000 7ff8000000000000 7ff8000000000000 //-inf * nan = nan fff0000000000000 fff8000000000000 fff8000000000000 //-inf * nan = nan fff0000000000000 7ff0000000000000 fff0000000000000 //-inf * +inf = -inf fff0000000000000 fff0000000000000 7ff0000000000000 //-inf * -inf = +inf Это, как можно заметить, и есть corner cases, пограничные случаи, использующие значения +-inf, +-0, и nan. А дальше идут рандомные пары чисел, десятки тысяч. Тестировать такой модуль на ста тестах, или даже на тысяче тестах нельзя, слишком много нюансов, которые проявляются только в одном случае из тысяч. Ошибка может появиться, например, на 5000-м тесте, и она произойдёт из-за такой комбинации чисел, что её трудно как-то заранее предугадать. Модулярная арифметикаМатериал из Модулярная арифметики
32-битовое дробное умножение с методом перекрестного умножения (без промежуточного результата 64-бит)There are a few ideas at play. First, multiplication of 2 shorter integers to produce a longer product. Consider unsigned multiplication of 2 32-bit integers via multiplications of their 16-bit «halves», each of which produces a 32-bit product and the total product is 64-bit: a * b = (a_hi * 216 + a_lo) * (b_hi * 216 + b_lo) = a_hi * b_hi * 232 + (a_hi * b_lo + a_lo * b_hi) * 216 + a_lo * b_lo. Now, if you need a signed multiplication, you can construct it from unsigned multiplication (e.g. from the above). Supposing a < 0 and b >= 0, a *signed b must be equal 264 — ((-a) *unsigned b), where -a = 232 — a (because this is 2’s complement) IOW, a *signed b = 264 — ((232 — a) *unsigned b) = 264 + (a *unsigned b) — (b * 232), where 264 can be discarded since we’re using 64 bits only. In exactly the same way you can calculate a *signed b for a >= 0 and b < 0 and must get a symmetric result: (a *unsigned b) — (a * 232) You can similarly show that for a < 0 and b < 0 the signed multiplication can be built on top of the unsigned multiplication this way: (a *unsigned b) — ((a + b) * 232) So, you multiply a and b as unsigned first, then if a < 0, you subtract b from the top 32 bits of the product and if b < 0, you subtract a from the top 32 bits of the product, done. Now that we can multiply 32-bit signed integers and get 64-bit signed products, we can finally turn to the fractional stuff. Suppose now that out of those 32 bits in a and b N bits are used for the fractional part. That means that if you look at a and b as at plain integers, they are going to be 2N times greater than what they really represent, e.g. 1.0 is going to look like 2N (or 1 << N). So, if you multiply two such integers the product is going to be 2N*2N = 22*N times greater than what it should represent, e.g. 1.0 * 1.0 is going to look like 22*N (or 1 << (2*N)). IOW, plain integer multiplication is going to double the number of fractional bits. If you want the product to have the same number of fractional bits as in the multiplicands, what do you do? You divide the product by 2N (or shift it arithmetically N positions right). Simple. A few words of caution, just in case. .. In C (and C++) you cannot legally shift a variable left or right by the same or greater number of bits contained in the variable. The code will compile, but not work as you may expect it to. So, if you want to shift a 32-bit variable, you can shift it by 0 through 31 positions left or right (31 is the max, not 32). If you shift signed integers left, you cannot overflow the result legally. All signed overflows result in undefined behavior. So, you may want to stick to unsigned. Right shifts of negative signed integers are implementation-specific. They can either do an arithmetic shift or a logical shift. Which one, it depends on the compiler. So, if you need one of the two you need to either ensure that your compiler just supports it directly or implement it in some other ways. Страница не найдена | MITПерейти к содержанию ↓
Попробуйте поискать что-нибудь еще! Что вы ищете? Увидеть больше результатов Предложения или отзывы? Знаковое последовательное / параллельное умножение — Маркус НентвигКлючевые слова: Реализация двоичного знакового умножения, RTL, Verilog, алгоритм Сводка
Знаковое последовательное / параллельное умножение Простой способ умножения двух двоичных чисел состоит в многократном сдвиге первого аргумента на и добавлении в регистр, если установлен соответствующий бит в другом аргументе b . Идея похожа на умножение, которое преподается в школе, но простые ворота и определяют произведение двух цифр. Википедия [2] дает пример этого алгоритма, но не говорит, как он работает («для объяснения … см. Учебник по компьютерной арифметике»). Быстрый поиск в Интернете ничего не дал, и я закончил реверс-инжиниринг этого примера с некоторой помощью из [1], приложение A. Ширина сумматораКак оказалось, эффективная реализация требует больше усилий, чем просто сдвиг и добавление. Выход множителя вдвое шире аргументов. Но простое использование сумматора двойного размера приведет к довольно медленной схеме, поскольку распространение переноса через сумматор задает критический путь. Проблема с числами со знаком — это необходимое расширение знака для масштабирования до выходной разрядности. Число со знаком со знаком до двух расширяется до большей ширины за счет копирования знакового бита в позиции MSB. На рисунке 1 показано 8-битное знаково-знаковое умножение. Рисунок 1: Знаково-знаковое умножение путем повторного сложения Теперь, как мы можем избежать расширения знака и использовать более короткий сумматор? Ответ: мы расширяем только на один бит и добавляем некоторую временную константу, которая гарантирует неотрицательное число. Позже мы удалим из результата сумму всех констант. Расширение знака Знаковый бит в дополнительном числе до двух имеет отрицательный вес старшего бита беззнакового числа в том же месте. Давайте рассмотрим несколько примеров для двух дополнительных чисел: Рисунок 2: -1 и +1 как 8-битные числа с дополнением до двух Расширение знака путем дублирования бита знака сохраняет значение неизменным (рисунок 3): Рисунок 3: обычное знаковое расширение до 9 бит 1-битное расширение до неотрицательного диапазонаТеперь я переворачиваю исходный бит знака и помещаю ноль в расширенный бит знака (рисунок 4): Рисунок 4: Знаковый бит инвертирован, и расширенный знаковый бит очищен Как видно, 128 было добавлено в обоих случаях, и получилось неотрицательное число. Другими словами: Инвертирование знакового бита и добавление нуля в качестве MSB добавляет положительный вес знакового бита и гарантирует неотрицательное число. Частичные модифицированные изделия Теперь смещение применяется к частичным продуктам , то есть результату и — стробирования сдвинутого аргумента a с одним битом аргумента b . Рисунок 5: Битовые изменения для гарантии неотрицательных частичных продуктов Добавление еще двух битов, одного на нижнем конце и одного на верхнем конце диапазона коррекции, приведет к переполнению суммы всех констант и, таким образом, к нулю (рис. 5, внизу). Это эквивалентно вычитанию констант из суммы (добавлением двух дополнений). Отрицание последней строкиНо это еще не все: до сих пор мы не обращали внимания на знаковый бит в аргументе b (рис. 1). Поскольку его вес отрицательный, последняя строка должна быть инвертирована перед добавлением. Дополнительное число до двух инвертируется путем инвертирования каждого бита, включая знак, и добавления 1. Рисунок 6: Изменение знака последней строки Младшие биты вводятся путем заполнения нулями и, следовательно, известны как нулевые (рисунок 6). Их инвертирование и добавление 1 приведет к переполнению одной единицы в активных битах частичного произведения.То же самое достигается с меньшими усилиями за счет инвертирования только активных частичных битов продукта и добавления единицы к их младшему разряду (рисунок 7): Рисунок 7: Упрощенная смена знака в последней строке Итоги на данный момент:
Все константы объединеныДругими словами, есть два +1 в столбце (x) (рис. 8), которые переходят в +1 в следующем более высоком бите. Его удобно включить, изменив MSB + 1 в первой строке (ранее расширенный знаковый бит, см. Рисунок 4) с 0 на 1 (y). Рисунок 8: Расчетный поток Фиг. 8 показана последовательность вычислений. Отмечены исключения из обычного беззнакового умножения. Сумматору требуется только на один бит больше, чем аргументов. Реализация Verilog (скачать) Включена реализация Verilog (ссылки внизу), которая реализует знаково-знаковое умножение, как обсуждалось. Разрядность параметризуется, должна быть 3 или больше. Моделирование с помощью iverilog: «x» используются неукоснительно, поскольку они делают результаты моделирования более читаемыми, поддерживают оптимизацию и помогают выявлять концептуальные ошибки (рис. 9). Рисунок 9: Моделирование Ссылка: исходный код Verilog Ссылка: Отформатированный исходный код (PDF) Ссылка: исходный код testbench Verilog Список литературы[1] Быстрое умножение: алгоритмы и реализация: докторская диссертация, Гэри У.Бьюик, 1994 [2] Википедия: Двоичный умножитель Реализация умножения векторов разреженной матрицы в Verilog HDL — IJERTCH. Raviteja KRKSastry Департамент ECE GVPCollege of Engg (A) Департамент ECE GVPCollege of Engg (A) Висакхапатнам, AP, Индия Висакхапатнам, AP, Индия Аннотация В этой статье представлена высокопроизводительная технология умножения разреженных матричных векторов (SpMxV) в ПЛИС. Помимо пропускной способности также достигается производительность системы.Разреженные матрицы Университета Флориды с разреженностью менее 0,09 используются в качестве тестового шаблона для проверки производительности проекта. Сжатое хранилище строк (CRS) минимизирует логику управления. В нашей конструкции реализована конвейерная архитектура, которая помогает повысить производительность системы более чем в 5 раз по сравнению с программным кодом, работающим на процессоре Pentium4. Дизайн нацелен на XC2VP70-7 Xilinx FPGA и соответствует рабочей частоте 205 МГц. SpMxV реализован на Verilog HDL. Ключевые слова FPGA, SPARSE, простое двухпортовое ОЗУ, MAC, с плавающей запятой, CRS. ВВЕДЕНИЕ Разреженное матрично-векторное умножение (SpMxV) y = Ax, используется во многих высокопроизводительных научных вычислительных приложениях, таких как итерационные решатели линейных систем, решатели блочных LU и решатели собственных значений, включая поиск информации, получение медицинских изображений и экономическое моделирование. Параллелизм в реконфигурируемом оборудовании (FPGA) значительно улучшает производительность вычислений при операциях с целыми числами и с плавающей запятой [1]. Швета и Рон использовали формат переменных двойных сжатых блоков (VDCB) для умножения разреженных матриц и матриц.Формат VDCB работает путем деления матрицы на ряд меньших подматриц переменного размера, называемых BLOCKS [2]. Чжуо и Прасанна разработали реализацию SpMxV на основе дерева сумматора для плавающей запятой двойной точности. В их конструкции используется редукционная схема, которую необходимо настраивать в соответствии с различными параметрами матрицы [3]. ПЛИСпродемонстрировали большой потенциал в реконфигурируемых вычислениях благодаря внутреннему параллелизму и гибкой архитектуре. Благодаря быстрому увеличению пропускной способности затвора и частоты FPGA могут превосходить микропроцессоры как в операциях с целыми числами, так и с плавающей запятой [4].Эль-Гинди и Шу предложили SpMxV на ПЛИС для данных с фиксированной точкой [5]. ДеЛоримье и ДеХон расположили PE в двунаправленном кольце, чтобы вычислить уравнение y = Aix, где A — квадратная матрица, а i — целое число. Предложенная ими конструкция значительно снижает требования к пропускной способности ввода / вывода за счет совместного использования результатов между ПЭ [6]. Эль-Курди и др. Предложили сквозную архитектуру для матриц метода конечных элементов [7]. В этой статье мы реализуем SpMxV в хранилище сжатых строк (CRS) для инвариантности к количеству входов. Эта статья организована следующим образом. SpMxV на FPGA и формате CRS объясняются в разделе 2. Раздел 3 описывает базовую конструкцию SpMxV и MAC, поясняются блоки контроллеров. Полный дизайн объяснен в разделе 4. Результаты реализации сравниваются с [1] в разделе 5. В итоге делаем вывод и предлагаем дальнейшую работу. SPMXV НА ПЛИС CRS используется в нашей FPGA, а вектор множимого x (y = Ax) сохраняется в памяти FPGA в виде одного столбца и количества строк в соответствии с длиной входного столбца. Чтобы минимизировать количество аппаратных компонентов, длина вектора множимого ограничена 630 элементами, хранящимися как 63 × 10. Формат CRS показан на рисунке 1. Рис.1: Сжатое хранилище строк (CRS) В качестве примера рассмотрим разреженную матрицу 4 × 7 следующим образом: Формат CRS этой матрицы можно описать тремя приведенными ниже векторами:
С.УСТРОЙСТВО MAC В представлении CRS вектор val представляет ненулевые элементы разреженной матрицы, вектор col представляет соответствующие индексы столбца ненулевых элементов, а вектор row_cnt показывает количество ненулевых элементов в каждой строке. Первая позиция вектора row_cnt представляет первую строку разреженной матрицы, вторая позиция представляет вторую строку и так далее. Подробная блок-схема MAC показана на рисунке 3. Конвейерная обработка используется в MAC для повышения скорости. Row_count указывает количество умножений и сложений, которые должны быть перенесены в данные, хранящиеся в векторах столбцов и строк.Простое двухпортовое ОЗУ используется в конфигурации «запись сначала чтение, затем». БАЗОВЫЙ ДИЗАЙН
Блок контроллера отвечает за управление процессом разреженного умножения векторов-строк. Он постоянно отслеживает row_col_id. В row_col_id верхний полубайт 6 бит представляет индекс строки, а нижний полубайт 6 бит представляет индекс столбца ненулевых элементов. Контроллер сравнивает текущий row_col_id с pre row_col_id, если индекс строки двух row_col_ids равен приращению row_cnt на единицу, иначе row_cnt записывается в FIFO row_cnt и повторяет тот же процесс для оставшихся.Младший полубайт каждого row_col_id хранится в FIFO col_id. Всякий раз, когда действительный row_cnt доступен в FIFO row_cnt, тогда эти конкретные элементы строки разреженной матрицы и соответствующие элементы вектора множимого обрабатываются в MAC. Для чтения элементов множимого вектора в качестве адресов чтения используются индексы col_id. Рис. 3. Блок MAC с плавающей запятой Чтобы выполнить скалярное произведение одной строки, умножитель выполняет количество умножений row_cnt, а схема накопления накапливает каждый результат умножения. Сигналconv_done генерируется для указания действительного умножения строк после действительного сигнала, другая строка может быть выбрана в MAC, что указывает действительный результат mult_out. Результат mult_out представляет собой скалярное произведение между вектором-строкой разреженной матрицы и вектором-столбцом матрицы коэффициентов. ПОЛНЫЙ ДИЗАЙН Параллельная структура SE, показанная на рис. 4, поможет в разработке многострочных операций. Результаты завершенных строк сохраняются в BRAM результатов.В общем, на основе FPGA мы можем использовать n количество SE. В нашей конструкции для работы SpMxV используется 8 SE. Рис. 4: Полный проект РЕЗУЛЬТАТЫ РЕАЛИЗАЦИИ Конструкция предназначена для FPGA Xilinx XC2VP70-7. Результаты внедрения приведены в Таблице 1. Мы проверили наши результаты для одиночных значений с плавающей запятой, и наш дизайн может быть адаптирован к целочисленным и двойным значениям с плавающей запятой также с определенной оптимизацией. Таблица 1: Характеристики SpMxV
Мы используем наш дизайн из 8 SE для сравнения с программным обеспечением на микропроцессоре. Машина представляет собой двойной процессор Intel Pentium 4 с тактовой частотой 2,8 ГГц, 16 КБ L1, 512 КБ L2 Cashe и 1 ГБ памяти. Ускорение нашей разработки по сравнению с Pentium4 показано на рис. 5. Две тестовые матрицы принадлежат группе Bai, взятой из коллекции матриц Florida Sparse [8]. По мере увеличения количества ненулевых элементов производительность увеличивается. Рис. 5: Ускорение по сравнению с Pentium4 2,8 ГГц ВЫВОДЫ Мы использовали формат CRS для хранения разреженных матриц в дизайне SpMxV. По сравнению с [1], наша конструкция имеет значительную площадь, улучшение скорости и меньше зависит от разреженности матрицы.Наша будущая работа включает реализацию нашей разработки на суперкомпьютере Cray XD1 для научных приложений и анализа производительности. Цзюньцин Сунь, Грегори, Олаф Сторааслы. Разреженная матрица — разработка векторного умножения на ПЛИС, IEEE, февраль 2007 г. Швета Джайн-Мендон и Рон Сасс, Оценка производительности умножения разреженных матриц на матрицу, IEEE, июнь 2013 г. Л. Чжуо, В. К. Прасанна, Разреженное умножение матрицы на вектор на ПЛИС, ПЛИС, февраль 2005 г. К. Д. Андервуд. FPGA и CPU: тенденции пиковой производительности операций с плавающей запятой, FPGA, февраль 2004 г. H. A. ElGindy, Y. L. Shue., О умножении разреженных матриц на вектор с помощью системы на основе FPGA, FCCM, апрель 2002 г. M. deLorimier и A. DeHon. Разреженная матрица с плавающей точкой — векторное умножение для ПЛИС. Международный симпозиум по программируемым вентильным массивам, февраль 2005 г. Я. Эль-Курди, В. Дж. Гросс и Д.Яннакопулос. Умножение разреженных матриц и векторов для матриц метода конечных элементов на ПЛИС 2006 г. Симпозиум IEEE по программируемым пользовательским вычислительным машинам, апрель 2006 г. Т. Дэвис, Коллекция разреженных матриц Университета Флориды, http://www.cise.ufl.edu/research/sparse/matrices, NA Digest, 92 (42), 16 октября 1994 г. , NA Digest, 96 (28) , 23 июля 1996 г., и NA Digest, 97 (23), 7 июня 1997 г. IRJET-Запрошенная вами страница не найдена на нашем сайтеIRJET приглашает статьи из различных инженерных и технологических и научных дисциплин для Тома 8, выпуск 5 (май-2021) Отправить сейчас IRJET Vol-8 Issue 5, Май 2021 г. Публикация продолжается… Обзор статей IRJET получил «Импакт-фактор научного журнала: 7,529» за 2020 год. Проверить здесь IRJET получил сертификат регистрации ISO 9001: 2008 для своей системы менеджмента качества. IRJET приглашает специалистов по различным инженерным и технологическим дисциплинам, научным дисциплинам для Тома 8, выпуск 5 (май 2021 г.) Отправить сейчас IRJET Vol-8, выпуск 5, май 2021 г. Публикация продолжается… Обзор статей IRJET получил «Импакт-фактор научного журнала: 7,529» за 2020 год. Проверить здесь IRJET получил сертификат регистрации ISO 9001: 2008 для своей системы менеджмента качества. IRJET приглашает специалистов по различным инженерным и технологическим дисциплинам, научным дисциплинам для Тома 8, выпуск 5 (май 2021 г.) Отправить сейчас IRJET Vol-8, выпуск 5, май 2021 г. Публикация продолжается… Обзор статей IRJET получил «Импакт-фактор научного журнала: 7,529» за 2020 год. Проверить здесь IRJET получил сертификат регистрации ISO 9001: 2008 для своей системы менеджмента качества. IRJET приглашает специалистов по различным инженерным и технологическим дисциплинам, научным дисциплинам для Тома 8, выпуск 5 (май 2021 г.) Отправить сейчас IRJET Vol-8, выпуск 5, май 2021 г. Публикация продолжается… Обзор статей IRJET получил «Импакт-фактор научного журнала: 7,529» за 2020 год. Проверить здесь IRJET получил сертификат регистрации ISO 9001: 2008 для своей системы менеджмента качества. IRJET приглашает специалистов по различным инженерным и технологическим дисциплинам, научным дисциплинам для Тома 8, выпуск 5 (май 2021 г.) Отправить сейчас IRJET Vol-8, выпуск 5, май 2021 г. Публикация продолжается… Обзор статей IRJET получил «Импакт-фактор научного журнала: 7,529» за 2020 год. Проверить здесь IRJET получил сертификат регистрации ISO 9001: 2008 для своей системы менеджмента качества. IRJET приглашает специалистов по различным инженерным и технологическим дисциплинам, научным дисциплинам для Тома 8, выпуск 5 (май 2021 г.) Отправить сейчас IRJET Vol-8, выпуск 5, май 2021 г. Публикация продолжается… Обзор статей IRJET получил «Импакт-фактор научного журнала: 7,529» за 2020 год. Проверить здесь IRJET получил сертификат регистрации ISO 9001: 2008 для своей системы менеджмента качества. IRJET приглашает специалистов по различным инженерным и технологическим дисциплинам, научным дисциплинам для Тома 8, выпуск 5 (май 2021 г.) Отправить сейчас IRJET Vol-8, выпуск 5, май 2021 г. Публикация продолжается… Обзор статей IRJET получил «Импакт-фактор научного журнала: 7,529» за 2020 год. Проверить здесь IRJET получил сертификат регистрации ISO 9001: 2008 для своей системы менеджмента качества. IRJET приглашает специалистов по различным инженерным и технологическим дисциплинам, научным дисциплинам для Тома 8, выпуск 5 (май 2021 г.) Отправить сейчас IRJET Vol-8, выпуск 5, май 2021 г. Публикация продолжается… Обзор статей IRJET получил «Импакт-фактор научного журнала: 7,529» за 2020 год. Проверить здесь IRJET получил сертификат регистрации ISO 9001: 2008 для своей системы менеджмента качества. Операторы Verilog | АлхитрийВ этом руководстве рассматриваются различные операторы, доступные в Verilog. Если вы программировали на C / C ++ или Java, многие из этих операторов будут вам знакомы. Однако есть несколько новых способов использования, которые удобны для работы с оборудованием.~ |
Эти операторы называются побитовыми операторами, потому что они работают с каждым битом индивидуально. Они используются для выполнения основных логических функций и синтезируются в их эквивалентные логические элементы.
Взгляните на следующий пример.
проволока [3: 0] а, б, в; присвоить a = 4'b1010; присвоить b = 4'b1100; присвоить c = a & b;
c теперь будет иметь значение 4’b1000. Это потому, что старшие биты a и b — единственные, которые оба равны 1.
Когда вы выполняете побитовый оператор над многобитными значениями, как указано выше, вы, по сути, используете несколько вентилей для выполнения побитовой операции. В этом случае нам нужны четыре гейта И для и каждый бит a и b вместе. Результатом каждого гейта И будет значение c .
Все эти операторы используются с двумя значениями, кроме оператора NOT ( ~ ), который принимает только одно значение.Взгляните на этот пример, в котором мы заменяем последнюю строку предыдущего примера.
присвоить c = ~ a;
Теперь c будет иметь значение 4’b0101. Опять же, это связано с тем, что каждый бит a индивидуально инвертируется и назначается c .
Если два значения, используемые побитовым оператором, различаются по длине, более короткое значение заполняется нулями, чтобы длины совпадали.
Функция | Оператор |
---|---|
И | и |
NAND | ~ и |
ИЛИ | | |
НОР | ~ | |
XOR | ^ |
XNOR | ~ ^ или ^ ~ |
Операторы сокращения очень похожи на побитовые операторы, за исключением того, что они выполняются для всех битов одного значения. Они используются, чтобы уменьшить количество битов до одного, выполняя указанную функцию для каждого бита.
Взгляните на этот пример.
провод [3: 0] а; провод б; присвоить a = 4'b1010; назначить b = & a;
В этом примере b будет 0. Это связано с тем, что каждый бит a соединяется друг с другом. Другими словами, это эквивалентно следующему.
присвоить b = a [0] & a [1] & a [2] & a [3];
По сути, это синтез большого одиночного логического элемента с достаточным количеством входов, чтобы соответствовать входному значению.В этом случае будут синтезированы четырехвходовой вентиль И .
Функция | Оператор |
---|---|
Сдвиг вправо | >> |
Сдвиг влево | << |
Арифметический сдвиг вправо | >>> |
Арифметический сдвиг влево | <<< |
Операторы сдвига в Verilog очень похожи на операторы других языков. Они просто сдвигают бит в значении во много раз вправо влево.
Основными операторами сдвига являются с заполнением нулями и , что означает, что биты, в которые не было сдвинуто значение, заменяются нулями. Взгляните на следующий пример.
проволока [4: 0] а, б, в; присвоить a = 5'b10100; присвоить b = a << 2; присвоить c = a >> 2;
В этом примере b будет иметь значение 5’b10000, а c будет иметь значение 5’b00101.Вы можете видеть, что с b потеряны два верхних бита a , а с c потеряны два нижних бита.
Теперь давайте взглянем на операторы арифметического сдвига. Они отличаются от операторов базовой смены, потому что они выполняют смену с расширенным знаком и смены. При сдвиге влево он работает точно так же, как и основной оператор сдвига, но при сдвиге вправо играет роль старший значащий бит (знак , , , бит, ).
Если бит знака равен 0, то оператор арифметического сдвига действует так же, как и основной оператор сдвига.Однако, если бит знака равен 1, сдвиг заполнит левую часть единицами.
Взгляните на этот пример.
проволока [4: 0] а, б, в; присвоить a = 5'b10100; присвоить b = a <<< 2; присвоить c = a >>> 2;
Теперь b будет иметь значение 5’b10000, как и раньше, но c будет иметь значение 5’b11101.
Зачем вам нужно заполнять левую часть самым старшим битом? Причина в том, что сдвиг битов — очень дешевый способ выполнить умножение и деление на степени двойки.Возьмите значение 6 (4’b0110). Если мы сдвинем его влево на один бит, мы получим 4’b1100 или 12, а если мы сдвинем его вправо, мы получим 4’b0011 или 3. А что насчет значения -4 (4’b1100)? Если сдвинуть его на один бит влево, мы получим 4’b1000 или -8. Однако если мы сдвинем его вправо на один бит, мы получим 4’b0110 или 6! Это потому, что нам нужно использовать арифметический сдвиг. Если использовать арифметический сдвиг, мы получим 4’b1110 или -2!
Операции переключения передач очень дешевы! Это потому, что они, по сути, просто переименование сигнала.
Функция | Оператор |
---|---|
Конкатенация | {,} |
Репликация | {{}} |
Это два очень полезных оператора для управления битами.
Оператор конкатенации используется для объединения двух значений в более широкое значение.
проволока [3: 0] а, б; проволока [7: 0] c; присвоить a = 4'b1100; присвоить b = 4'b1010; присвоить c = {a, b};
В этом примере c имеет значение 8’b11001010.Вы можете объединить столько сигналов, сколько захотите, добавив их в список, разделенный запятыми.
Оператор репликации используется для многократного дублирования значения.
провод [1: 0] а; проволока [7: 0] b; присвоить a = 4'b10; присвоить b = {4 {a}};
В этом примере a реплицируется 4 раза, в результате чего значение b будет 8’b10101010.
Функция | Оператор |
---|---|
Дополнение | + |
Вычитание | – |
Умножить | * |
Разделить | / |
Модуль | % |
Мощность | ** |
Verilog предоставляет эти шесть основных арифметических операторов, чтобы упростить основную математику.Однако при использовании этих операторов важно помнить, как они будут реализованы на оборудовании.
Самое важное, что нужно помнить, это то, что не все эти операторы можно синтезировать! Синтезировать можно только сложение, вычитание и умножение! Некоторые синтезаторы позволят вам использовать разделение, если вы делите на степень двойки, но вы все равно должны использовать для этого оператор сдвига. Причина, по которой остальные три не могут быть синтезированы, заключается в том, что схемы, необходимые для их реализации, довольно сложны.Есть много компромиссов, которые вам как дизайнеру нужно сделать, если вам нужно использовать разделение, модульность или мощность, которые синтезатор не может сделать за вас. В большинстве случаев эти операции будут линейными, чтобы обеспечить скорость или уменьшить количество используемого оборудования. Это то, что синтезатор не может сделать за вас.
При использовании сложения и вычитания синтезатор, вероятно, синтезирует схему, аналогичную показанной в этом руководстве. Однако синтезатор может выполнять оптимизацию, если он складывает два значения.
Для умножения многие ПЛИС (включая ту, которая используется в Mojo) имеют специальные ресурсы, предназначенные для быстрой математики. Если они доступны, они будут использоваться, однако, если они у вас закончатся, придется сгенерировать схему умножения, которая может быть большой и медленной. Из-за этого вам никогда не следует умножать на степень двойки, а вместо этого следует сдвигать. Большинство синтезаторов достаточно умны, чтобы сделать это за вас, но не следует полагаться на это.
Также обратите внимание, что оператор — может использоваться для отрицания числа.
Когда два N-битных числа складываются или вычитаются, получается N + 1-но число. Если вы добавляете или вычитаете два N-битных числа и сохраняете значение в N-битном числе, вам нужно подумать о переполнении. Например, если у вас есть двухбитное число 3 (2’b11) и вы добавляете его к 2 (2’b10), результатом будет 5 (3’b101), но если вы сохраните значение в двухбитном числе, вы получите 1 (2’b01).
Для умножения двух N-битных чисел результатом будет N * 2-битное число. Например, 7 (3’b111) * 6 (3’b110) = 42 (6’b101010).
Функция | Оператор |
---|---|
Менее | < |
Больше | > |
Меньше или равно | <= |
Больше или равно | > = |
Равенство | == |
Неравенство | ! = |
Равенство случаев | === |
Дело Неравенство | ! == |
Эти операторы сравнивают два значения и выдают один бит для представления результата. 1 — истина, а 0 — ложь.
Единственная странная вещь, на которую следует обратить внимание, — это case-версия тестов на равенство. Биты в Verilog — это не только 0 или 1 , но они также могут иметь размер x или z . Для стандартных тестов на равенство, если любое значение имеет x или z , результатом будет x . Однако для тестов на равенство случаев он проверит, совпадают ли они в другом значении. Например, 4’b01x0 == 4’b01x0 дает x , а 4’b01x0 === 4’b01x0 дает 1 .
На самом деле, оборудование не может иметь значение x , поэтому тесты на равенство случаев не синтезируемы, но полезны для моделирования.
Функция | Оператор |
---|---|
логический и | && |
логический или | || |
Логическое Не | ! |
Эти операторы используются для объединения нескольких операций сравнения. Взгляните на этот пример.
, если ((4'b1100> 4'b1011) && (4'b0111 == 4'b0111)) начало ... конец
Важно отметить, что эти операторы производят одноразрядное значение, как операторы сравнения. Также все, что не равно нулю, считается истиной, а ноль — ложью.
проволока [3: 0] а, б; проволока c; присвоить a = 4'b1010; присвоить b = 4'b1110; присвоить c = a && b;
В этом примере c будет иметь значение 1, потому что a и b оба ненулевые.
Функция | Оператор |
---|---|
Условно | ? |
Условный оператор — это способ записывать компактные операторы if. Он используется для выбора значения на основе логического значения.
проволока [3: 0] а, б, в, г; присвоить a = 4'b1000; присвоить b = 4'b0111; присвоить c = 4'b1010; назначить d = a> b? c: 4'b0000;
В этом примере d будет иметь значение 4’b1010. Когда выражение слева от ? истинно (ненулевое), значение слева от : будет присвоено. Если выражение ложно, используется значение справа. В этом случае, поскольку a больше, чем b , значение c было присвоено d .
статей | Открытый доступ
Vol.2 № 06 (2013) | Номер страницы: |
: Двоичный умножитель является неотъемлемой частью подсистемы арифметико-логического устройства (ALU) во многих процессорах. Арифметика с плавающей запятой широко используется в области банковского дела, расчета налогов, конвертации валют и других финансовых областях, включая вещание, музыкальные инструменты, конференц-связь и профессиональное аудио. Многие из этих приложений нуждаются в решении разреженных линейных систем, в которых используется достаточное количество умножения матриц. Целью данной диссертации является разработка и реализация ядер с плавающей запятой одинарной точности (32 бита) для умножения. Умножитель соответствует стандарту IEEE 754 для одинарной точности. Стандарт IEEE для двоичной арифметики с плавающей запятой (IEEE 754) является наиболее широко используемым стандартом для вычислений с плавающей запятой, за ним следуют многие реализации ЦП и FPU. Стандарт определяет форматы для представления чисел с плавающей запятой (включая отрицательные нули и денормальные числа) и специальных значений (бесконечные числа и NaN) вместе с набором операций с плавающей запятой, которые работают с этими значениями.Он также определяет четыре режима округления и пять исключений. В этой диссертации я использовал VERILOG как HDL, и Xilinx ISE был синтезирован на одном и том же инструменте. Свойства тайминга и корректности были проверены. Вместо написания Test-Benches и Test-Cases мы использовали анализатор формы волны, который может дать лучшее понимание сигналов и переменных, а также оказался хорошим выбором для моделирования проектирования. Для выполнения умножения с плавающей запятой реализована программа VERILOG. Конструкция с фиксированной запятой расширена для поддержки умножения с плавающей запятой путем добавления нескольких компонентов, включая генерацию экспоненты, округление, сдвиг и обработку исключений.
Данные для скачивания пока недоступны.