vak: (Улыбка)
Serge Vakulenko ([personal profile] vak) wrote2016-11-09 11:32 am

Асинхронность, которую мы потеряли

В микро-БЭСМ в качестве программируемого таймера использовалась микросхема к580ви53. Ну не вопрос, подумал я, это ведь классический Intel 8253. Для него в интернете есть куча исходников на Верилоге, сейчас быстренько привинчу. Не тут-то было. Нашёл три разные реализации i8253 - все оказались кривоватые и не соответствующие реальному чипу. И неспроста: проблема оказалась глубже. Дело в том, что этот чип представляет собой классический пример асинхронного дизайна, забытого в наше время. В микросхеме отсутствует опорный синхросигнал.



Интерфейс к управляющему процессору состоит из сигналов адреса, данных, /CS, /RD, /WR. Здесь не участвуют сигналы CLK. Они влияют только на декремент счётчиков времени, но не на логику внешнго интерфейса. Хитрая задача абитража между осинхронными запросами от процессора и событиями от синхросигналов решается схемотехникой, что нетривиально. Современные средства Verilog-синтеза такое не могут. Приходится признать, что с развитием технологий разработки цифровых микросхем мы кое-что утеряли, а именно способность проектировать асинхронные схемы.

Чтобы сделать i8253 "понятным" для современных Verilog-синтезаторов, достаточно сделать его синхронным, то есть ввести глобальный высокоскоростной сигнал CLK со стороны процессора, и тактировать все остальные события по нему. Хотя это будет уже не совсем i8253, но для проектов типа микро-БЭСМ вполне годится.

[identity profile] spamsink.livejournal.com 2016-11-10 02:31 am (UTC)(link)
Смоделировать, конечно, можно, и в симуляторе даже работать будет, но синтезироваться это может неправильно (комбинационный цикл может быть разорван не в том месте, где надо), а даже если правильно, то в FPGA может не так работать, потому что времянки будут не те, что надо.

[identity profile] ledernierheros.livejournal.com 2016-11-10 12:08 pm (UTC)(link)
А аналоговые схемы в чем проектируют?

[identity profile] spamsink.livejournal.com 2016-11-10 04:01 pm (UTC)(link)
В Verilog-AMS (Analog-Mixed Signal, позволяет смешивать код с обычным верилогом) или в Verilog-A (чисто аналоговый). Вот, например, мемристор (http://sensors.kaust.edu.sa/tools/memristor-model) (оцените, откуда):

module memristor (p, n) ;

inout p, n ;
electrical p, n ;

parameter real uv = 10f;
parameter real d = 10n;
parameter real ron = 100;
parameter real roff = 38k;
parameter real rin = 5k;

real k, r1, r2, R;

analog begin
k = 2 * uv * ron * (roff - ron) / pow(d,2);
r1 = pow(rin,2) + k * idt( V(p,n), 0 );
r2 = min( pow(roff,2) , max(r1,pow(ron,2) ) );
R = sqrt(r2);
V(p,n) <+ R * I(p,n) ;
end
endmodule

[identity profile] gouriev.livejournal.com 2016-11-11 02:40 pm (UTC)(link)
а "синтезировать" вручную нельзя?
или это ограничение именно FPGA?

[identity profile] spamsink.livejournal.com 2016-11-11 05:23 pm (UTC)(link)
Можно вручную, хотя если конкретный дизайн требует определеных соотношений задержек некоторых сигналов), то может понадобиться вручную писать и некоторые атрибуты для размещения, типа "эти два элемента должны попасть в один логический блок, а эти два - в другой логический блок". При этом будет гарантировано, что внутри блока задержка будет меньше, чем между блоками.