vak: (Default)
[personal profile] vak
В качестве примера рассмотрим проект светофора для пешеходного перехода. Имеем следующее оборудование:
  • светофор для автомобилей, три сигнала: красный, желтый, зеленый
  • светофор для пешеходов, два сигнала: стойте, идите
  • кнопка запроса на переход для пешехода
  • служебная кнопка сброса светофора в исходное состояние
  • генератор импульсов, задающий время
В обычном состоянии автомобильный светофор должен быть открыт (зеленый), а пешеходный - закрыт (красный). По нажатию пешеходной кнопки светофоры должны переключиться, открыв пешеходный переход, затем вернуться в исходное состояние.

Проектируемый модуль имеет три входа и пять выходов:

          ________
   rst ---|      |--- red
   clk ---|      |--- yellow
	  |      |--- green
	  |      |
button ---|      |--- stop
	  |      |--- walk
	  |______|
Фазы светофора:
  • Зеленый для автомобилей, “стойте” для пешеходов. Обычное состояние при отсутствии пешеходов.
  • Мигает зеленый для автомобилей, горит “стойте” для пешеходов. Включается через некоторое время (не более 30 секунд) после нажатия кнопки запроса. Длится три секунды.
  • Жёлтый для автомобилей, “стойте” для пешеходов. Длится три секунды.
  • Красный для автомобилей, “идите” для пешеходов. Длится десять секунд.
  • Красный для автомобилей, мигает “идите” для пешеходов. Длится три секунды.
  • Жёлтый+красный для автомобилей, “стойте” для пешеходов. Длится одну секунду.

“Примерная” реализация светофора на языке Plog приведена здксь: http://vak.ru/doku.php/proj/verilog/tlight-plog
Спецификация языка еще не готова, пока только образец кода. После компиляции должен получиться примерно такой код на Верилоге: http://vak.ru/doku.php/proj/verilog/tlight-v
Можно видеть, как компилятор создает набор состояний и переходов конечного автомата.

Date: 2007-06-22 20:57 (UTC)
From: [identity profile] thesz.livejournal.com
Так и описание на PLog тоже не самое короткое. ;)

Сравни с моим Хаскельным. И в verilog переводится один в один, и записано короче. И понятней. И проверяемей - я даже могу проверить недостижимые состояния. Более того, гибче - нет явных delay. К тому же у тебя непонятно, что выполняется в один такт, что в несколько. ;)

Date: 2007-06-22 21:47 (UTC)
From: [identity profile] thesz.livejournal.com
where убирай тоже. ;)

Date: 2007-06-22 21:50 (UTC)
From: [identity profile] thesz.livejournal.com
"Синхроны" в верилоге используются дял несинтезируемого, поведенческого кода.

В твоем коде как раз не видно, что сколько времени выполняется. "Синхроны" спрятаны в delay, в котором, похоже, ошибка. ;)

Date: 2007-06-24 20:59 (UTC)
From: [identity profile] thesz.livejournal.com
Такт завершается по <<синхронизации>> или по точке с запятой? ;)

Если по синхронизации, то она в delay стоит вне цикла (ошибка). Если по точке с запятой, то несколько присвоений подряд (а начале цикла) будут выполнятся излишне медленно (ошибка в другом месте, зато в delay все правильно;).

Если не будет функций, возвращающих результат, то это вообще - туши свет. ;)

Date: 2007-06-25 13:40 (UTC)
From: [identity profile] thesz.livejournal.com
"Синхрон придает окраску." Отлично. ;)

На какое расстояние распространяется окраска? Кто и как за этим будет следить?

В функциях есть побочные эффекты. Великолепно. ;)

А что будет, если a() выполняется за N тактов, а b() за M?

x+y за сколько тактов выполняется? А x+y+z? А sum(arr,1,M)? А в большой программе кто ответственен за самый длинный такт (за критическую цепочку)?

Сравни с подходом с функциями с изменением состояний.

Функции чистые. Состояния явные. Побочные эффекты явные. Длительность выполнения всегда один такт. Ясно, кто содержит критическую цепочку.

Выбор за вами. ;)