Суперпроизводительность для медленных задач?!

Анатолий Сергиенко

Известно, что потенциальные вычислительные возможности ПЛИС огромны. Это суперпроизводительность в 5 млрд. сложений в секунду для ПЛИС на 10 тыс. вентилей и 300 млрд. сложений в секунду для 1 млн. вентилей. Поэтому ПЛИС наиболее часто используются в приложениях обработки в реальном времени потоков сигналов с частотами 1 — 200 МГц, т.е. они заняли устойчивую нишу между специализированными СБИС и сигнальными микропроцессорами.

Микроконтроллеры являются наиболее распротраненным устройством вычислительной техники. Их количество штук в мире электроники в сотни раз превышает число РС, не считая ПЛИС. Хотя они имеют потенциальную производительность всего порядка 1 млн. операций сложения в секунду, этого достаточно, чтобы решать наибольшую массу задач управления, обслуживания, измерения, слежения, засекречивания, облегчения жизни трудящихся. К тому же они дёшевы, потребляют мало энергии, легко программируются и без сложностей включаются в схему.

Возникают вопросы — а можно ли ПЛИСами «подвинуть» микроконтроллеры в их нише? где именно? и каким образом?

Своё слово сказала, например, фирма Atmel, разместившая на одном кристалле микроконтроллер AVR и небольшую ПЛИС, которая справляется с тем, что не может выполнить микроконтроллер самостоятельно. За ней пошли другие фирмы. Но это не ответ в принципе.

Чем может перекрыть ПЛИС микроконтроллеры, так это:

  • высокой производительностью (см. выше);
  • большим числом выводов (до 100 и более);
  • сравнительно большим выходным током (20 мА и более), а также настраиваемой стыковкой входов и выходов с практически любым стандартом логических уровней;
  • способностью заменить собой несколько микросхем, включая микроконтроллер, регистры портов, интерфейсы, дешифраторы, буферы и т.п.

Можно было бы сказать также о минимуме энергопотребления. Но, к сожалению, у ПЛИС довольно заметный уровень тока потребления при низкой активности переключений. Исключением является только большая ПЛМ (CPLD) серии Coolrunner.

Как же за счет производительности обойти микроконтроллеры? (Остальные перечисленные преимущества ПЛИС не должны вызывать сомнений.)

Известно, что цена ПЛИС пропорциональна ее емкости. Другими словами, под реализованную схему необходимо подбирать ПЛИС с оптимальной емкостью. Так вот, можно за счет быстрой повторяемости простых операций выполнять медленные приложения и получать малые аппаратурные затраты, а следовательно, использовать дешевые ПЛИС.

С другой стороны, если уже ПЛИС выбрана, то почему бы не «выжать» из нее максимум функциональности за счет усложнения алгоритма и увеличения числа операций, выполняемых в секунду.

Одним из подходов является последовательное и многократное выполение операций на одних и тех же вычислительных ресурсах. Другой подход основан на применении таких алгоритмов решения задачи, которые отличаются выполнением преимущественно одинаковых и простых операций и которые из-за ненормально большого количества повторений этих операций на практике встречаются редко. Ну как алгоритмы для машины Тьюринга. Эти подходы могут сочетаться.

Явным примером первого подхода может быть следующий. Фирмой Celoxica предлагается компилятор Celoxica с языка Handel-C, который представляет собой некоторый диалект языка С, ориентированный на алгоритмы, реализуемые аппаратно. Пользователь-разработчик описывает свой алгоритм работы (управления, обслуживания, измерения и т.п.) на языке Handel-C с использованием операторов сложения, сдвига, условных операторов, циклов и т.п. как буд-то он пишет программу для контроллера. Затем компилятор Celoxica транслирует эту программу в логическую схему для ПЛИС, которая выполняет заданные операторы последовательно на синтезированных ресурсах сумматора, сдвигателя и т.п. Причем синтезируются также соответствующие схемы сравнения для реализации условных переходов, генераторы адресов и счетчики циклов для реализации операторов циклов. Основной порядок выполнения операций определяет синтезированный конечный автомат Мура.

Таким образом, в результате разработчик получает свой собственный, ни на что не похожий, уникальный специализированный микроконтроллер, который исполняет алгоритм точно так же, как и обычный микроконтроллер, но намного быстрее и на меньшем оборудовании. Такой эффект объясняется тем, что схема не содержит лишних ресурсов, «тяжелых» дешифраторов команд, не нужно нестандартные операции (например, выделение бита, свёртку битовых последовательностей) заменять цепочками команд. Отсутствует также ПЗУ программы. Кроме того, по желанию разработчика вычисления можно распараллеливать среди нескольких вычислительных ресурсов.

Примером применения второго подхода может быть цифровой дифференциальный анализатор (ЦДА). ЦДА появились на заре вычислительной техники как спецЭВМ с минимумом аппаратуры. Они были способны решать большие системы разностных дифференциальных уравнений, уравнений Шеннона. Их единственный ресурс — накапливающий сумматор с фиксацией переполнений — разделялся во времени между десятками и сотнями интеграторов, а программирование сводилось к передаче переполнений межу интеграторами в соответствии с графом задачи. После многих миллионов повторений в ЦДА оператора одного типа — интегратора — получалось решение довольно сложной задачи.

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

Однако, во многих случаях, например, в датчиках числа оборотов, частоты пульса, частота выходного сигнала слишком низкая для измерения с точностью до 3-5 десятичных цифр в реальном масштабе времени. Кроме того, ещё необходима коррекция результата измерения путем умножения на масштабный коэффициент, т.е.Y=M*Fx. Выход в том, что необходимо измерять период Тх сигнала датчика, а измеряемую величину находить как результат деления Y=M/Tx.

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

Можно предложить для вычисления Y=M/Tx очень простой и удобный алгоритм. Если из большеразрядного целого М вычитать малоразрядное Тх до тех пор, пока М не приблизится к нулю, то число вычитаний будет равно искомому Y. При этом счетчик числа этих вычитаний можно выполнить по любому основанию, например, по основанию 2, 10, в кодах 7-сегментных индикаторов, в унитарном коде, т.е. коде бегущей единицы, в коде отображения столбика единиц и т.п. Нетрудно также ввести аддитивную, мультипликативную коррекцию. Если поизобретать, можно ввести коррекцию нелинейности датчика.

Недостатком алгоритма является его высокая алгоритмическая сложность, т.е. то, что для получения 3-5 — разрядного десятичного результата необходимо выполнить до 1 -100 тыс. вычитаний и столько же сложений с единицей на одно измерение или 0.1 — 100 млн. операций в секунду, в зависимости от быстродействия измерений. Это довольно сложно для микроконтроллера, зато совсем нетрудно для ПЛИС и даже CPLD.

Здесь приводится простая модель частотомера для медленно меняющихся сигналов. Модель представлена в Приложении.

Частотомер работает периодически с последовательным повторением четырех фаз. В фазе Waiting ожидается фронт входного сигнала, в фазе Measure измеряется период сигнала Period как число тактов синхросерии между двумя соседними фронтами входного сигнала, В фазе Calculate вычисляется частота F= Masstab/Period . При этом частота F вычисляется в виде кода столбика единиц, который пригоден для непосредственного вывода на линейный светодиодный индикатор. В фазе Display ничего не происходит, кроме вывода результатов измерения.

Такой частотомер помещается в любой самый дешевый корпус ПЛИС или CPLD. Так что весь прибор займет один корпус CPLD и генератор синхроимпульсов, не считая индикатора. С использованием соответствующих датчиков его можно использовать, например, как термометр или автомобильный тахометр.

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

Приложение.

--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
--  FILE: FREQMETR.VHD
--  PROJECT: Unit for frequency measuring
--  AUTHOR:       Anatoli Sergyienko
--  Created: 		   15/01/02 
--  Email:        aser@comsys.kpi.ua
--
--  FUNCTION: - measuring and displaying the frequency of
--   slowly exchanged signals.
--  ALGORITHM: 1. period Period of the signal DATAI
--                is measured in clocks
--             2. frequency is calculated as
--                 F= Masstab/Period
--             3. frequency is outputted through DATAO
--                 to the barcode display
--  CONSTRAINTS: the barcode display length is limited 
--              by Fmax,maximum period of the signal is
--               measure_T;display period is equal to
--                        Disp_T - Fmax.
--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
library IEEE;
use IEEE.std_logic_1164.all;
entity Freqmeter is
	generic( Fmax: integer:=32);
                        -- Максимальная частота
	port(CLK: in STD_LOGIC;
         RST: in STD_LOGIC;
         DATAI: in STD_LOGIC;
         DATAO: out STD_LOGIC_VECTOR (Fmax-1 downto 0));
end Freqmeter;

architecture Simple of Freqmeter is
	constant measure_T: integer := 1024;
                 --Максимальный период сигнала, тактов
	constant Disp_T: integer := 4093;
                          --Период отображения, тактов
	constant Masstab:integer := 1000;

                          --Масштабный коэффициент
	signal DATAId: STD_LOGIC;
	signal Calculate,Measure,Display, Waiting :boolean;
                                              --FSM states
	signal CT2:integer range 0 to Disp_T+3;
	signal Period: integer range 0 to measure_T;
	signal M: integer range 0 to measure_T-1;
	signal F: STD_LOGIC_VECTOR(Fmax-1 downto 0);
                                      --F = Masstab/Period  


begin
	--DATAI __/^^\___/^^\___/^^\___
	--DATAId __/^^\___/^^\___/^^\___
	--Measure__|^^^^^^|_____________________
	--Calculate_______|^^^^^^^^|_____________
	--Display__________________|^^^^^^^^^^^|____
	--Waiting^^|___________________________|^^^^

	CNTRL:process(CLK,RST)
	begin
		if RST='1' then
			Calculate<=false;
			Measure<=false;
			Display<=false;                 
			Waiting<=true;
			CT2<= 0;
		elsif CLK='1' and CLK'event then
			DATAId<=DATAI;    --input delay
	-- finite state machine
	if ( DATAI='1' and DATAId='0' and Waiting ) then
			Measure<= true ;
			Waiting<= false;
	elsif ( DATAI='1' and DATAId='0'and Measure ) then
			Measure<=false ;
			Calculate<=true;
	elsif(CT2 = Disp_T) then
			Display<=false;
			Waiting<=true;
	elsif (CT2 = Fmax)then
			Calculate<=false;
			Display<=true;
	end if;
	--clock counter
			if ( calculate or display) then
				CT2<= CT2+1;
			elsif  Waiting then
				CT2<= 0;
			end if;
		end if;
	end process;

	CT_PERIOD: 	process(CLK,RST)
	begin
		if RST='1' then
			Period<=0;
		elsif CLK='1' and CLK'event then
			if Measure then
				Period<=Period+1;
			elsif Waiting then
				Period<=0;  
			end if;	   
		end if;
	end process;

	AU_FREQ:process(CLK,RST)
	begin
		if RST='1' then
			Fr<=0;
			f<=(others=> '0');
			M<=Masstab;
		elsif CLK='1' and CLK'event then
			if  measure then
				M<=Masstab;
				f<=(others=> '0');
			elsif calculate then
			if ( M-Period >0 ) then 
                        M<=M-Period ;
                        F<=F(F'left-1 downto 0) & '1';
		        else
                     end if;
                  end if;
		end if;
	end process;
	DATAO<=F;
end Simple;