vak: (Default)
Serge Vakulenko ([personal profile] vak) wrote2007-06-22 11:49 pm

Язык Plog: проект пешеходного светофора

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

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

          ________
   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
Можно видеть, как компилятор создает набор состояний и переходов конечного автомата.

spamsink: (Default)

[personal profile] spamsink 2007-06-22 08:27 pm (UTC)(link)
Ну вот, а настоящий человек бы сделал всего одно состояние для мигания и в нем замуксил бы управление зеленым на младший бит счетчика миганий.

[identity profile] panchul.livejournal.com 2007-06-22 11:18 pm (UTC)(link)
Кстати, это я dubolom-у коварную жизненную диверсию учинил - разжег интерес, даже книжек по верилогу прислал. Теперь он будет C -> Verilog писать - вместо того, чтобы ходить по лесам, читать интересные книжки, ростить детей, ходить в музеи.
spamsink: (Default)

[personal profile] spamsink 2007-06-22 11:40 pm (UTC)(link)
Ставлю тебе за это на вид! :)

[identity profile] panchul.livejournal.com 2007-06-23 12:21 am (UTC)(link)
Знаю, знаю. Советский фантаст Ефремов назвал бы меня "проводником инфернальности" (см. "Час Быка").

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Выбор за вами. ;)
spamsink: (Default)

[personal profile] spamsink 2007-06-22 11:46 pm (UTC)(link)
Ах, да. Если ты еще не знал, существуют компиляторы, умеющие синтезировать верилоговские implicit state machines; например, конструкция repeat (5) @(posedge clk) или if (cond) @(posedge clk) не составляет проблемы.
spamsink: (Default)

[personal profile] spamsink 2007-06-25 03:00 am (UTC)(link)
Синтезируемое подмножество Верилога выросло, насколько я понимаю, из синописовского (или кому он первоначально принадлежал) Design Compiler. Из-за того, что им было лень думать, как реализовать неявные конечные автоматы, вовсе не следует, что их в синтезируемом подмножестве не будет никогда. И вместо того, чтобы городить доморощенные язычки, как раз и нужно писать подобные препроцессоры из стандартного языка в стандартный язык, чтобы побуждать вендоров расширять синтезируемое подмножество.

Оператор a <= @(posedge clk) b придумывать не надо - он в стандартном языке легален.