ПИ-Гаджет

Сегодня 14-е марта.
Мы будем заниматься созданием странного PI-гаджета. Ведь что такое гаджет? Смотрим Википедию https://ru.wikipedia.org/wiki/Gadget и она говорит следующее:

"Гаджет (англ. gadget — приспособление) — оригинальное, нестандартное техническое приспособление. Сегодня гаджетом можно считать любой цифровой прибор, достаточно небольшой, чтобы надеть на руку или подключить к КПК или смартфонам. Появление и функциональный потенциал гаджетов предсказаны в произведениях киберпанка."

Все очень просто. На самом деле сегодня "Всемирный День Числа ПИ"! Вы знали про такой праздник? Март - это третий месяц в году, а четырнадцать - это первые две цифры в числе ПИ после запятой. Помните со школы: 3,14159... Можно было бы еще добавить, что праздник начинается в 15 часов и девять минут. Время у нас еще есть, так что до начала праздника мы должны успеть сделать новый проект.
Что будет делать наш гаджет? В принципе ничего особенно полезного. Ну и что? Мало ли на свете малополезных гаджетов? Наше устройство будет на дисплейчике отображать по очереди первые 512 цифр бесконечного числа ПИ.
Я даже думаю такой гаджет можно кому нибудь подарить в качестве сувенира.
Ну или если Вы когда нибудь полетите в космос к Марсу, то знание точного числа ПИ поможет точнее вычислить орбиты, не забудьте взять с собой наш гаджет.
Что нам понадобится? Конечно плата Марсоход, батарейка к нему и какой нибудь 7-ми сегментный индикатор для отображния десятичных цифр. Я нашел индикатор от очень древнего компьютера, которые еще отображали частоту процессора на панели системного блока. Вот такой:
indicator
Конечно нам нужно изучить теорию числа ПИ.
Начнем пожалуй с нашей любимой Википедии: https://ru.wikipedia.org/wiki/Pi
Если диаметр окружности принять равным единице, то длина окружности окажется равной этому странному числу ПИ. Вот рассмотрите эту картинку подробнее (признаюсь бессовестно взял ее с Википедии):
Pi-unrolled-720

Люди с древности пытались понять или вычислить число ПИ. Почти за 2 тысячи лет до нашей эры в Вавилоне считали, что число ПИ это 25/8, а в Египте - 256/81. На самом деле сейчас каждый школьник знает, что число ПИ бесконечное, и в нем нет повторяющихся последовательностей цифр. Говорят, что последовательность знаков в числе ПИ подчиняется теории хаоса.
Вообще, если Вы поищите в интернете, Вы удивитесь, как много статей посвящено числу ПИ. Ну вот например:

И еще 2 миллиона страниц посвящено числу ПИ в Интернете.

Итак приступим к изготовлению нашего устройства PI-Gadget.
В микросхеме EPM240T100C5 установленной на плате Марсоход есть встроенная флеш память. Ее там совсем не много - всего 512 шестнадцатибитных слов. Я думаю мы просто запишем в эту память длинное число ПИ, состоящее из 512 цифр. Мы будем их последовательно считывать из памяти и показывать на дисплейчике.
Первый вопрос - где мы возьмем эти 512 первых цифр? Самое простое - это найти в интернете. Но это не интересно. Мы легких путей не ищем.
Мы воспользуемся программой, написанной на языке "Си" Диком Т. Винтером (Dik T. Winter at CWI) всего 160-ю символами, но вычисляющая 800 знаков Пи!
Вот эта программа:

int a=10000,b,c=2800,d,e,f[2801],g;main(){for(;b-c;)f[b++]=a/5;
for(;d=0,g=c*2;c-=14,printf("%.4d",e+d/a),e=d%a)for(b=c;d+=f[b]*a, f[b]=d%--g,d/=g--,--b;d*=b);}

Скажу честно. Я вроде бы думаю, что умею программировать на Си, но мне кажется что это какая-то белиберда, а не программа. Ну посмотрим, что она может. Запускаем Microsoft VisualStudio и пытаемся сделать программу из этого кода, откомпилировать и запустить. Вот что получается:
prog314159
Действительно похоже на число ПИ!
Дальше будет немного скучно. Если вы устали - идите сразу в конец статьи и посмотрите как работает наш дейвайс. К сожалению в таком виде мы использовать эту программу из 160 знаков не можем. Нам нужен текстовый файл в специальном формате, который понимает программа QuartusII компании Altera. Поэтому мы перепишем эту малюсенькую программу в более понятный нам вид, а заодно и сделаем так, что выходные данные будут печататься в шестнадцатеричном виде в формате файла MIF Альтеры (MIF - Memory Initialization File). Вот так:

int a=10000;
int b=0;
int c=2800;
int d=0;
int e=0;
int f[2801];
int g=0;
int addr = 0;

int main(int argc, char* argv[])
{
printf("-- PI-Gadget project\n\n");
printf("WIDTH = 16;\n");
printf("DEPTH = 512;\n\n");

printf("ADDRESS_RADIX = HEX;\n");
printf("DATA_RADIX = HEX;\n");

printf("CONTENT BEGIN\n");

for(;b-c;)
f[b++]=a/5;

while(1)
{
d=0;
g=c*2;
if(g==0)
break;

b=c;
while(1)
{
g--;
d+=f[b]*a;
f[b]=d%g;
d=d/g;
g--;
b--;
if(b==0)
break;
d*=b;
}

c-=14;

char str[8];
sprintf(str,"%.4d\n",e+d/a);
printf("\t%04X : 000%c;\n",addr++,str[0]);
printf("\t%04X : 000%c;\n",addr++,str[1]);
printf("\t%04X : 000%c;\n",addr++,str[2]);
printf("\t%04X : 000%c;\n",addr++,str[3]);
e=d%a;

if(addr==512)
break;
}
printf("END\n");

return 0;
}

Вот то, что эта наша программа напечатает и будет MIF файл.
За основу нашего нового проекта возьмем "Почти пустой проект". Там уже есть счетчик, тактовый генератор и компонент флеш памяти UFM (User Flash Memory).

ufm_internals

В свойствах компонента UFM укажем, какой MIF файл использовать при прошивке микросхемы. Теперь самое сложное - нам нужно считывать из этой UFM слова по очереди и это не очень просто.
Сперва нужно установить адрес флеш памяти. Это можно сделать поочереди задвигая побитно девятибитный адрес (старшим битом вперед). Вход ARDIN - задвигаемый бит адреса. Вход ARCLK - фронт этого сигнала сдвигает адрес на один бит. Входной сигнал ARSHIFT определяет задвигать ли очередной бит адреса или просто увеличить весь адрес на единицу. При сигнале единица происходит сдвиг, а при нуле - увеличение адреса на единицу.

ufm_addr
Примерно так же работает и регистр данных (с небольшими отличиями).
DRDIN - задвигаемый бит данных для записи.
DRDOUT - выдвигаемый бит данных, прочинанный из флеш памяти.
DRSHIFT - определяет сдвигать ли данные или переместить из флеш в сдвиговый регистр.
DRCLK - сигнал синхронизации выдвижения или защелкивания данных.
ufm_data
Чтобы не морочить Вам больше голову скажу, что мы сделали специальный модуль, написанный на Verilog, который позволяет читать из UFM микросхемы MAX-II установленной на плате Марсоход.

Последнее, что нам остается - разобраться с семисегментным индикатором. Это как бы 7 продолговатых светодиодиков установленных специальным образом. Зажигая некоторые из них мы сможем показывать цифры.

indicator3

Например, чтобы показать цифру "три" нам нужно зажечь только нулевой, первый, второй, третий и шестой свтодиодики. Чтобы показать цифру "один" нужно зажечь только светодиоды под номером один и два. И так далее. Для декодирования мы так же сделали специальный модуль на Verilog: decimal_indicator.

Весь проект можно взять здесь:

ПИ-гаджет ( 82499 bytes )

Теперь, когда проект готов, компилируем, зашиваем его и проверяем. Нужно собрать всю схему. Мы будем использовать сигналы F0,F1,F2,F3,F4,F5 и дополнительно pt_right чтобы подключить семисегментный индикатор. Найти нужные сигналы из "ежика" на индикаторе поможет прибор или просто батареечка.

connection1connection2

Ну и вот запускаем:

Осталось только сделать презентабельную коробочку для нашего устройства, но это я оставлю Вам.

Не расстраивайтесь, что наш гаджет делает не много. Зато мы познакомились с числом ПИ и с устройством флеш памяти в микросхеме MAX-II. А она нам еще пригодится в других проектах.


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