8-900-374-94-44
[email protected]
Slide Image
Меню

Verilog умножение: Знаковая арифметика в Verilog | Лаборатория Электронных Средств Обучения (ЛЭСО) СибГУТИ

Содержание

Знаковая арифметика в Verilog | Лаборатория Электронных Средств Обучения (ЛЭСО) СибГУТИ

Шауэрман Александр А. [email protected]

Что может быть проще, сложить два числа 2 и 3? Даже если числа будут представлены в двоичном коде проблем возникнуть не должно: записываем одно число под другим и поразрядно, с учетом переноса, складываем. Все просто, курс информатики за 8 класс средней школы. Но почему-то все меняется, когда сложить требуется положительное число с отрицательным, например 2 и -3, и у многих возникает сложность, как казалось бы на пустом месте, там где ее быть не должно. В данной статье не будем рассматривать принцип представления отрицательных чисел в дополнительном коде, подразумевается, что это знакомо и понятно, а попробуем изучить на практике некоторые возможности языка Verilog по работе с знаковой арифметикой, которые позволяют существенно упростить жизнь начинающему разработчику на ПЛИС.

Чтобы не быть голословным и не ограничиваться только чтением и комментированием стандарта Verilog-2001

, будем проводить эксперименты на реальной плате с ПЛИС. В качестве аппаратного обеспечения для себя я выбрал учебный стенд LESO2 последней модификации (LESO2.4). В нем есть 8 тумблеров, 8 светодиодов и одна кнопка, пожалуй, большего от него нам сейчас и не потребуется. Так как тумблеров всего восемь, будет логичным все примеры строить на четырех-битных числах. Правые четыре тумблера задают первый операнд, назовем его A, левые четыре тумблера – второй операнд B. Результат операции выведем на светодиоды.

Для того чтобы расставить все точки над i, приведу таблицу перевода десятичного числа в двоичный эквивалент.

Таблица 1 – Перевод десятичного представления в знаковое двоичное
Десятичное значение
Двоичное значение
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).

Таблица 2 – Исследование сумматора. Результат неверен
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 разрядов. Загружаем, проверяем. Работа с положительными числами осталась без изменений, а вот сложение чисел из предыдущего примера дает корректный результат:

Таблица 3 – Исследование сумматора. Корректный результат
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.

Если мы просто применим функцию к операнду A, то это будет эквивалентно объявлению A как 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
знаковый
Комментарии
Таблица 4 – Исследование сумматора
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)
    * 0010 (2)
  00000000 
+ 00011010
+ 00000000
+ 00000000
  00011010 (26)

Если операция знаковая, то дополняется знаковым битом:

      1101 (-3)
    * 0010 (2)
  00000000 
+ 11111010
+ 00000000
+ 00000000
  11111010 (-6)

В первом случае 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 знакового умножителя

Загружаем в ПЛИС, проверяем, результат исследования сведем в таблицу:

B
знаковый
A
знаковый
Mult
знаковый
Комментарий
Таблица 5 – Исследование умножителя
1101 (-3) 0010 (2) 1111 1010 (-6) Числа из вычисления столбиком. Умножаем отрицательное число на положительное. Результат имеет отрицательный знак.
0011 (3) 0010 (2) 0000 0110 (6) Произведение двух положительных чисел. Результат положительный.
0111 (7) 0111 (7) 0011 0001 (49) Произведение двух самых больших положительных чисел из допустимого диапазона. Результат корректен.
1000 (-8) 1000 (-8) 0100 0000 (64) Произведение двух самых маленьких отрицательных чисел. Результат – корректное положительное число.

Если требуется умножить знаковое число на беззнаковое, дополним беззнаковый операнд нулем и преобразуем к знаковому типу:

module multipliers (
input	       [3:0]	A,
input	signed [3:0]	B,
output	signed [7:0]	Mult
);
	assign Mult = $signed({1'b0, A}) * B;
endmodule


Рисунок 7 – RTL умножителя. Вход A – беззнаковый, вход B – знаковый

Как и раньше, результат исследования сведем в таблицу:

B
знаковый
A
беззнаковый
Mult
знаковый
Комментарии
Таблица 6 – Исследование умножителя
1101 (-3) 0010 (2) 1111 1010 (-6)  
0011 (3) 0010 (2) 0000 0110 (6)  
1000 (-8) 1000 (8) 1100 0000 (-64) Числа из предыдущего примера. Но теперь умножается отрицательное число на положительное, поэтому результат отрицателен.
0111 (7) 1111 (15) 0110 1001 (105) Произведение двух самых больших положительных чисел из допустимого диапазона. Результат корректен.

Небольшие советы

1. Результат сцепления (Concatenation) всегда дает беззнаковый результат. Потому в предыдущих примерах, при ручном добавлении знакового разряда к флагу переноса, приходилось применять функцию $signed для получения знакового типа. Отсюда пара полезных приемов. Для получения самого большого положительного числа разрядности N можно поступить так:

 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. Выборка из вектора одного или нескольких бит всегда будет беззнаковой. Результат будет беззнаковым даже если выбрать вектор полностью. Для примера выведем на светодиоды значение min, но для эксперимента разрядность min выберем меньше восьми:

wire signed [5:0] min = $signed({1'b1,{5{1'b0}}});  // 6'b100000 (-32)
assign led_o = min;	// разрядность  led_o – восемь

В результате на светодиоды выведется значение 1110 0000. При присвоении знакового числа знаковый разряд заполнил дополнительные биты, произошло знаковое расширение числа до разрядности приемника. Значение -32 сохранилось. Теперь проделаем, казалось бы, тоже самое, но с помощью выборки из вектора min:

wire signed [5:0] min = $signed({1'b1,{5{1'b0}}});  // 6'b100000 (-32)
assign led_o = min[5:0];	// разрядность  led_o – восемь

Выборка min[5:0] дала беззнаковый результат, и, как следствие, на светодиодах положительное значение 0010 0000 (32).

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 будут объявлены как знаковые, результат операции будет беззнаковым! Это довольно распространенная ошибка. Но это полностью соответствует правилу: если хотя бы один из операторов в выражении unsigned, то и результат unsigned. В данном случае учитывается беззнаковый тип константы 0 и достаточно явно указать константе 0 ее знаковость, например, так 'sh0, и все станет на свои места:

 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. Структуры данных Verilog

30 Verilog-HDL для моделирования и синтеза цифровых электронных схем 2.6. Структуры данных Verilog При определении типа объектов данных в Verilog-программе (переменные, сигналы и пр.) следует учитывать

Подробнее

Блок 8 Verilog: базовый синтаксис

Языки описания схем (mk.cs.msu.ru Лекционные курсы Языки описания схем) Блок 8 Verilog: базовый синтаксис лектор: Подымов Владислав Васильевич e-mail: [email protected] Осень 2017 (V) Немного о семантике

Подробнее

4.3. Структура языка Verilog

112 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упаковке (multichip pack

age) толщиной всего 1,4 мм.

Для достижения успеха инженеры Akita

Elpida разработали инновационную тех

нологию для утонения (шлифовки) кри

сталлов толщиной 30 мкм перед упаков

кой, метод соединения слоёв с помощью

тончайших проводников, технику впры

скивания канифоли в микроскопические

отверстия. Компания намерена тесно со

рудничать с производителями оборудова

ния для дальнейшего продвижения своей

разработки и коммерциализации произ

водства.

Хочется отметить важность подобных

разработок в свете беспрерывного про

цесса миниатюризации портативной тех

ники и растущих требований к её произ

водительности. В этой области работает

множество полупроводниковых компа

ний. Из недавних достижений стоит отме

тить разработки таких производителей,

как IBM и Samsung Electronics.

www.3dnews.ru

Samsung на пути

к созданию ОЗУ

нового поколения

Одним из важнейших технологических

достижений в полупроводниковой отрас

ли за последний месяц стала разработка

компанией IBM методики так называемой

«трёхмерной» упаковки чипов. Нечто по

добное на днях анонсировала и компания

Samsung Electronics.

Как сообщается в прессрелизе,

Samsung разработала метод упаковки чи

пов памяти, использующий технологию

TSV (through silicon vias, внутрикремние

вые межсоединения). По заявлению ком

пании, это позволит существенно уско

рить память, уменьшить энергопотребле

ние и габариты микросхем.

Новая упаковка называется WSP

(waferlevelprocessed stacked package).

Она может вмещать четыре чипа DDR2

DRAM плотностью 512 Мбит (4 ×512 Мбит).

Используя такие двухгигабитные структу

ры, Samsung может создать модули ОЗУ

ёмкостью 4 Гб.

Инновационный технологический ме

тод Samsung устраняет необходимость в

относительно длинных металлических

проводниках, которые соединяют между

собой традиционные «двухмерные» чи

пы и их составные элементы, заменяя

эти проводники внутрикремниевыми со

единениями. Межсоединения TSV пред

ставляют собой вертикальные каналы

диаметром порядка единиц микрон, про

травленные в кремниевой пластине с по

мощью лазера и заполненные проводни

ком – медью. Такие внутрикремниевые

соединения позволяют располагать кри

сталлы плотнее и создавать более тонкие

упаковки. Межсоединения throughsilicon

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-м тесте, и она произойдёт из-за такой комбинации чисел, что её трудно как-то заранее предугадать.

Модулярная арифметика

Материал из Модулярная арифметики

Генераторы Verilog (базовые операции)

Модулярные сумматоры

  1. Генератор Verilog для сумматора по модулю 2n-1 — реализация на базе двух сумматоров и мультиплексора (Р-2012).
  2. Генератор Verilog для сумматора по модулю 2n-1 — полностью комбинационная реализация без мультиплексора (Д-2012).
  3. Генератор Verilog для сумматора по произвольному модулю — реализация предлагающая оптимальный вариант.
  4. Генератор Verilog для многовходового сумматора по произвольному модулю — несколько различных вариантов сумматора нескольких переменных по модулю.
  5. Генератор Verilog для многовходового сумматора по произвольному модулю — реализация на базе метода сложения в позиционных кодах (Г-2015).

Модулярные умножители

  1. Генератор Verilog для умножения по модулю (метод 1) — от 3 до 1000 по индексному методу (умножение заменено на сложение).
  2. Генератор Verilog для умножения по модулю (метод 2) — от 3 до 1000 по методу разности квадратов (X*Y = (1/4)*(X+Y)2 — (1/4)*(X-Y)2)
  3. Генератор Verilog для умножения по модулю (метод 3) — позиционное умножение с последующим прямым преобразованием
  4. Генератор Verilog для умножения по модулю (метод 4) — модулярный умножитель на базе большой таблицы (case)
  5. Генератор Verilog для умножения по модулю (метод 5) — на базе частичных сумм
  6. Генератор Verilog для умножителя по модулю 2n+1 — для n от 3 до 43.
  7. Генератор Verilog для умножителя по модулю 2n-1 — для n от 3 до 43.
  8. Генератор Verilog для умножителя по модулю 2n — для n от 3 до 43.

Классические умножители (до 128 бит)

  1. Бинарный умножитель на базе модулярного базиса (2n-1, 2n, 2n+1)
  2. Бинарных умножитель на базе рекурсивной модулярного базиса (2n-1, 2n, 2n+1) — используется два иерархических уровня модулей вида (2n-1, 2n, 2n+1).
  3. Бинарный умножитель на базе модулярного базиса (2n-1, 2n+1, 2n+1-1, 2n+1+1) — используется перспективный набор из 4-х модулей.
  4. Бинарный умножитель на базе иерархического метода — используется метод «разделяй и властвуй» без использования модулярной арифметики.

Прямые модулярные преобразователи

  1. Модулярный базис (2n-1, 2n, 2n+1) — прямой преобразователь из позиционной системы счисления в систему остаточных классов (Р-2012).
  2. Модулярный базис (2n-1, 2n, 2n+1) — прямой преобразователь из позиционной системы счисления в систему остаточных классов (Д-2012).
  3. Модулярный базис (2n-1, 2n+1, 2n+1-1, 2n+1+1) — прямой преобразователь из позиционной системы счисления в систему остаточных классов.
  4. Универсальный прямой преобразователь — прямой преобразователь из позиционной системы счисления в СОК для произвольной системы модулей (Две версии: комбинационный и конвейерный).

Обратные модулярные преобразователи

  1. Генератор Verilog для обратного преобразователя из базиса вида (2n-1, 2n, 2n+1) — сверхбыстрый обратный преобразователь в позиционную систему.
  2. Генератор Verilog для обратного преобразователя из 4-х элементного базиса (2n-1, 2n+1, 2n+1-1, 2n+1+1) — обратный преобразователь в позиционную систему.
  3. Генератор Verilog обратного преобразователя для произвольных взаимнопростых модулей — универсальный обратный преобразователь в позиционную систему для произвольного числа модулей (комбинационная и конвейерная версии).
  4. Генератор Verilog конвеерного обратного преобразователя на базе полиадического кода — универсальный обратный преобразователь в позиционную систему для произвольного числа модулей.
  5. Генератор Verilog конвеерного обратного преобразователя на базе полиадического кода с коррекцией ошибок — универсальный обратный преобразователь в позиционную систему для произвольного числа модулей с коррекцией одиночной ошибки в одном из каналов. Два старших модуля являются избыточными. Используется перспективная схема с уменьшенной площадью.
  6. Генератор Verilog конвеерного обратного преобразователя на базе полиадического кода с коррекцией ошибок — универсальный обратный преобразователь в позиционную систему для произвольного числа модулей с коррекцией одиночной ошибки в одном из каналов. Два старших модуля являются избыточными. Используется стандартный метод проекций.

КИХ-фильтры

  1. Генератор Verilog для КИХ-фильтров (простейший метод) — конвейерная структура сделанная по формуле свертки O(N2).
  2. Генератор Verilog для конвейерных КИХ-фильтров на базе модулярного базиса (2n-1, 2n, 2n+1)
  3. Генератор Verilog для конвейерных КИХ-фильтров на базе модулярной арифметики и БПФ — перспективный метод с использование БПФ в конечном поле и сложностью O(N*logN)

Скалярное произведение

  1. Генератор Verilog для MAC-Unit (простейший метод) — синхронный вариант с дефолтной реализацией.
  2. Генератор Verilog для быстрого вычисления скалярного произведения с конвейризацией — синхронный вариант на обычной позиционной арифметике.
  3. Генератор Verilog для вычисления скалярного произведения на базе модулярной арифметики — синхронный вариант на модулярной арифметике.

Другое

  1. Генератор Verilog для модулярных операций по методу Квайна — генератор операций сложения и умножения, для малых модулей (от 3 до 15).
  2. Генератор Verilog для квадрата разности по модулю p — состоит из вычитателя и таблицы квадратов (LUT).
  3. Генератор умножителя для конвейерной реализации модулярного FIR-фильтра
  4. Генератор Verilog для прямых и инверсных Теоретико Числовых БПФ — используется конвейерная структура Radix2SPDF.
  5. Генератор Verilog для кодера и декодера Галуа — только отдельные кодер и декодер.

SAD процессоры (поиск различия между двумя картинками)

  1. Генератор Verilog для реализации позиционного SAD процессора — поиск векторов компенсации движения в стандартном виде.
  2. Генератор Verilog для реализации модулярного SAD процессора — поиск векторов компенсации движения в модулярном базисе вида (2n-1, 2n, 2n+1).

Формулы и математика

  1. Генератор простых чисел Прота для реализации операции свёртки (Версия 2) — по методу БПФ в конечном поле.
  2. Формула для обратного преобразователя для базиса вида (2n-1, 2n, 2n+1) — обратный преобразователь для спец. системы модулей из системы остаточных классов в позиционный код.
  3. Проверка формул обратного преобразователя для базиса вида (2n-1, 2n, 2n+1) — обратный преобразователь для спец. системы модулей из системы остаточных классов в позиционный код.
  4. Генератор базисов для SAD процессоров разной размерности — базисы специального вида и обычного.
  5. Рисовалка области значений комплексного вычета — вычет комплексного числа по комлексному переменному
  6. Проверка базиса и расчет его динамического диапазона
  7. Нахождение обратного элемента по модулю
  8. Преобразование позиционной системы счисления для заданного числа
  9. Преобразование из системы остаточных классов в позиционный вид
  10. Генератор базисов для рекурсивной модулярной арифметики

Справочные материалы

Определения

Алгоритмы

Программы

Разное

Результаты исследований

  1. 2015. n-1 (модуль вида 2n-1) — сравнение позиционного сумматора и двух вариантов реализации сумматора по модулю 2n-1 (Генератор 1, Генератор 2).

Временные и тестовые скрипты

  1. Список случайных простых чисел — для теста от 900 до 20000
  2. Таблица умножения по модулю — от 3 до 100

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

Перейти к содержанию ↓
  • Образование
  • Исследовать
  • Инновации
  • Прием + помощь
  • Студенческая жизнь
  • Новости
  • Выпускников
  • О MIT
  • Подробнее ↓
    • Прием + помощь
    • Студенческая жизнь
    • Новости
    • Выпускников
    • О MIT
Меню ↓ Поиск Меню Ой, похоже, мы не смогли найти то, что вы искали!
Попробуйте поискать что-нибудь еще! Что вы ищете? Увидеть больше результатов

Предложения или отзывы?

Знаковое последовательное / параллельное умножение — Маркус Нентвиг

Ключевые слова: Реализация двоичного знакового умножения, RTL, Verilog, алгоритм

Сводка

  • Подробное обсуждение хитрости на уровне битов в знаково-знаковом умножении
  • Алгоритм на основе примера Википедии
  • Включает реализацию Verilog с параметризованной разрядностью

Знаковое последовательное / параллельное умножение

Простой способ умножения двух двоичных чисел состоит в многократном сдвиге первого аргумента на и добавлении в регистр, если установлен соответствующий бит в другом аргументе b . Идея похожа на умножение, которое преподается в школе, но простые ворота и определяют произведение двух цифр.
Задержка обработки в значительной степени равна ширине бита, потому что каждый бит в b требует одного шага накопления.
Это может быть привлекательным компромиссом между стоимостью и скоростью в «среднем поле»: например, при 100 МГц и ширине битов 20 умножитель работает со скоростью около 5 MMUL / с. Это все еще довольно быстро, например. для обработки звука или аналогичных приложений, которые не оправдывают использование аппаратного умножителя, который легко справится с 20-кратной пропускной способностью, но является дефицитным ресурсом на ПЛИС.С другой стороны, последовательно-параллельный умножитель все еще в 20 раз быстрее, чем полностью последовательный умножитель (который в остальном очень компактен), и менее сложен в реализации, чем более сложные алгоритмы, такие как, например, кодирование Бута [1], которое обрабатывать несколько строк за итерацию по цене большего количества оборудования.

Википедия [2] дает пример этого алгоритма, но не говорит, как он работает («для объяснения … см. Учебник по компьютерной арифметике»). Быстрый поиск в Интернете ничего не дал, и я закончил реверс-инжиниринг этого примера с некоторой помощью из [1], приложение A.
Эта статья является результатом вместе с кодом Verilog RTL в последнем разделе.

Ширина сумматора

Как оказалось, эффективная реализация требует больше усилий, чем просто сдвиг и добавление. Выход множителя вдвое шире аргументов. Но простое использование сумматора двойного размера приведет к довольно медленной схеме, поскольку распространение переноса через сумматор задает критический путь.

Проблема с числами со знаком — это необходимое расширение знака для масштабирования до выходной разрядности.

Число со знаком со знаком до двух расширяется до большей ширины за счет копирования знакового бита в позиции MSB.

На рисунке 1 показано 8-битное знаково-знаковое умножение.


Рисунок 1: Знаково-знаковое умножение путем повторного сложения

Теперь, как мы можем избежать расширения знака и использовать более короткий сумматор? Ответ: мы расширяем только на один бит и добавляем некоторую временную константу, которая гарантирует неотрицательное число. Позже мы удалим из результата сумму всех констант.
Это похоже на трюк сценического фокусника: я сначала увеличиваю на один бит, а затем игнорирую его, потому что знаю, что он равен нулю. Есть несколько, казалось бы, не связанных между собой вещей, которые встают на свои места в конце и поф , лягушка превращается в жабу.

Расширение знака

Знаковый бит в дополнительном числе до двух имеет отрицательный вес старшего бита беззнакового числа в том же месте.
Например, старший бит 8-битового числа без знака представляет 128. Для числа со знаком знаковый бит в том же месте имеет значение -128.

Давайте рассмотрим несколько примеров для двух дополнительных чисел:


Рисунок 2: -1 и +1 как 8-битные числа с дополнением до двух

Расширение знака путем дублирования бита знака сохраняет значение неизменным (рисунок 3):


Рисунок 3: обычное знаковое расширение до 9 бит

1-битное расширение до неотрицательного диапазона

Теперь я переворачиваю исходный бит знака и помещаю ноль в расширенный бит знака (рисунок 4):


Рисунок 4: Знаковый бит инвертирован, и расширенный знаковый бит очищен

Как видно, 128 было добавлено в обоих случаях, и получилось неотрицательное число. Другими словами:

Инвертирование знакового бита и добавление нуля в качестве MSB добавляет положительный вес знакового бита и гарантирует неотрицательное число.

Частичные модифицированные изделия

Теперь смещение применяется к частичным продуктам , то есть результату и — стробирования сдвинутого аргумента a с одним битом аргумента b .
На рисунке 5 показаны частичные продукты и выделены все биты, которые были изменены, чтобы избежать расширения знака.Фактически к каждой строке добавляется константа. Обратите внимание, что процедура всегда добавляет к результату одно и то же общее смещение независимо от входных данных.


Рисунок 5: Битовые изменения для гарантии неотрицательных частичных продуктов

Добавление еще двух битов, одного на нижнем конце и одного на верхнем конце диапазона коррекции, приведет к переполнению суммы всех констант и, таким образом, к нулю (рис. 5, внизу). Это эквивалентно вычитанию констант из суммы (добавлением двух дополнений).

Отрицание последней строки

Но это еще не все: до сих пор мы не обращали внимания на знаковый бит в аргументе b (рис. 1). Поскольку его вес отрицательный, последняя строка должна быть инвертирована перед добавлением.

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


Рисунок 6: Изменение знака последней строки

Младшие биты вводятся путем заполнения нулями и, следовательно, известны как нулевые (рисунок 6). Их инвертирование и добавление 1 приведет к переполнению одной единицы в активных битах частичного произведения.То же самое достигается с меньшими усилиями за счет инвертирования только активных частичных битов продукта и добавления единицы к их младшему разряду (рисунок 7):


Рисунок 7: Упрощенная смена знака в последней строке

Итоги на данный момент:

  • Изменение знака бита каждого частичного произведения приводит к принудительному использованию неотрицательных чисел путем добавления констант. Это позволяет избежать расширения знаков и позволяет использовать узкий сумматор.
  • Добавление +1 к столбцу младшего и самого высокого битов знака приводит к переполнению констант из предыдущего шага и их исчезновению из результата (здесь нет ничего удивительного: значение коррекции — это просто дополнение до двух констант, добавленных ранее).
  • Последняя строка вычитается путем инвертирования всех активных битов и добавления 1 к самому низкому активному биту.Обратите внимание, что знаковый бит уже был инвертирован и теперь изменен обратно.
  • Еще 1 должна быть добавлена ​​в самый младший активный бит последней строки как часть отрицания дополнения до двух.

Все константы объединены

Другими словами, есть два +1 в столбце (x) (рис. 8), которые переходят в +1 в следующем более высоком бите. Его удобно включить, изменив MSB + 1 в первой строке (ранее расширенный знаковый бит, см. Рисунок 4) с 0 на 1 (y).


Рисунок 8: Расчетный поток

Фиг. 8 показана последовательность вычислений. Отмечены исключения из обычного беззнакового умножения. Сумматору требуется только на один бит больше, чем аргументов.

Реализация Verilog (скачать)

Включена реализация Verilog (ссылки внизу), которая реализует знаково-знаковое умножение, как обсуждалось. Разрядность параметризуется, должна быть 3 или больше.
Существует тестовая среда, которая проверяет все возможные входные значения. Обратите внимание, что умножитель должен работать для любой разрядности, но исчерпывающее моделирование для широких сигналов становится слишком медленным.

Моделирование с помощью iverilog:
iverilog -DSK61LIB_INCLUDES -g2005 -Wall -o tmp tb_mul.v
vvp tmp -lxt2
Код работает на ISIM из веб-издания Xilinx ISE 14.7.
Тест быстрого синтеза на Spartan 6-slx9 с источником PN дало максимальную тактовую частоту 159 МГц. Использование двух отдельных сумматоров вместо мультиплексирующего (см. Комментарии в коде) увеличивает его до 237 МГц, но использует больше срезов. Если скорость не является проблемой, попробуйте другую кодировку FSM для состояния (т.е.е. «компактный») для немного меньшей конструкции.

Присвоения

«x» используются неукоснительно, поскольку они делают результаты моделирования более читаемыми, поддерживают оптимизацию и помогают выявлять концептуальные ошибки (рис. 9).
Для разрядности n выполнение занимает n +2 цикла. Его можно улучшить до n или даже n-1 , используя более сложную логику управления. Основные «аргументы» в пользу реализации как таковой — максимальная тактовая частота и простота.


Рисунок 9: Моделирование

Ссылка: исходный код Verilog Ссылка: Отформатированный исходный код (PDF) Ссылка: исходный код testbench Verilog

Список литературы

[1] Быстрое умножение: алгоритмы и реализация: докторская диссертация, Гэри У.Бьюик, 1994

[2] Википедия: Двоичный умножитель

Реализация умножения векторов разреженной матрицы в Verilog HDL — IJERT

CH. 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 этой матрицы можно описать тремя приведенными ниже векторами:

    val

    10

    6

    1

    4

    3

    3

    5

    col

    1

    2

    1

    6

    2

    4

    7

    С.УСТРОЙСТВО MAC

    В представлении CRS вектор val представляет ненулевые элементы разреженной матрицы, вектор col представляет соответствующие индексы столбца ненулевых элементов, а вектор row_cnt показывает количество ненулевых элементов в каждой строке. Первая позиция вектора row_cnt представляет первую строку разреженной матрицы, вторая позиция представляет вторую строку и так далее.

    Подробная блок-схема MAC показана на рисунке 3. Конвейерная обработка используется в MAC для повышения скорости. Row_count указывает количество умножений и сложений, которые должны быть перенесены в данные, хранящиеся в векторах столбцов и строк.Простое двухпортовое ОЗУ используется в конфигурации «запись сначала чтение, затем».

  • БАЗОВЫЙ ДИЗАЙН

    1. Верхний уровень Блок-схема

      В нашей конструкции Sparse Engine (SE) является основным вычислительным блоком. Архитектура верхнего уровня SE, состоящая из двух блоков RAM (размер Coeff.RAM 64X32, размер Sparse RAM 1024 × 32), двух FIFO (размер 1024 × 6), MAC с плавающей запятой (32 бит) и блока контроллера, показана на рисунке 2.

      MAC

      состоит из умножителя и сумматора с задержкой 8 тактов каждый для выполнения 32-битных операций с плавающей запятой. Дизайн разработан как параллельный MAC. Срыв генерируется, когда FIFO любого из Col_id или row_id заполнен.

      Рис.2: Редкий двигатель (SE)

    2. Блок контроллера

    Блок контроллера отвечает за управление процессом разреженного умножения векторов-строк. Он постоянно отслеживает 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

    [1]

    Предлагается

    Целевое устройство

    XC2VP70-7

    Типовой проект

    одиночный FP

    достижимо

    Частота

    200 МГц

    210 МГц

    Ломтики

    10528

    (31%)

    6877

    MULT18x18

    32 (9%)

    32 (9%)

    Мы используем наш дизайн из 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 .

    Разработка и реализация эффективного 32-битного умножителя с плавающей запятой с использованием Verilog

    статей | Открытый доступ

    Vol.2 № 06 (2013) | Номер страницы: |

    Разработка и реализация эффективного 32-битного умножителя с плавающей запятой с использованием Verilog


    Абстрактные

    : Двоичный умножитель является неотъемлемой частью подсистемы арифметико-логического устройства (ALU) во многих процессорах. Арифметика с плавающей запятой широко используется в области банковского дела, расчета налогов, конвертации валют и других финансовых областях, включая вещание, музыкальные инструменты, конференц-связь и профессиональное аудио. Многие из этих приложений нуждаются в решении разреженных линейных систем, в которых используется достаточное количество умножения матриц. Целью данной диссертации является разработка и реализация ядер с плавающей запятой одинарной точности (32 бита) для умножения. Умножитель соответствует стандарту IEEE 754 для одинарной точности. Стандарт IEEE для двоичной арифметики с плавающей запятой (IEEE 754) является наиболее широко используемым стандартом для вычислений с плавающей запятой, за ним следуют многие реализации ЦП и FPU. Стандарт определяет форматы для представления чисел с плавающей запятой (включая отрицательные нули и денормальные числа) и специальных значений (бесконечные числа и NaN) вместе с набором операций с плавающей запятой, которые работают с этими значениями.Он также определяет четыре режима округления и пять исключений. В этой диссертации я использовал VERILOG как HDL, и Xilinx ISE был синтезирован на одном и том же инструменте. Свойства тайминга и корректности были проверены. Вместо написания Test-Benches и Test-Cases мы использовали анализатор формы волны, который может дать лучшее понимание сигналов и переменных, а также оказался хорошим выбором для моделирования проектирования. Для выполнения умножения с плавающей запятой реализована программа VERILOG. Конструкция с фиксированной запятой расширена для поддержки умножения с плавающей запятой путем добавления нескольких компонентов, включая генерацию экспоненты, округление, сдвиг и обработку исключений.

    Загрузки

    Данные для скачивания пока недоступны.


    Авторские права и лицензия

    Авторские права © 2017 . Сурендра Сингх Раджпут Нидхи Махешвари, Д.С. Ядав, это статья в открытом доступе, распространяемая в соответствии с лицензией Creative Commons Attribution License, которая разрешает неограниченное использование, распространение и воспроизведение на любом носителе при условии правильного цитирования оригинальной работы.

    Добавить комментарий

    Ваш адрес email не будет опубликован.