В качестве примера рассмотрим проект светофора для пешеходного перехода. Имеем следующее оборудование:
- светофор для автомобилей, три сигнала: красный, желтый, зеленый
- светофор для пешеходов, два сигнала: стойте, идите
- кнопка запроса на переход для пешехода
- служебная кнопка сброса светофора в исходное состояние
- генератор импульсов, задающий время
Проектируемый модуль имеет три входа и пять выходов:
________ 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
Можно видеть, как компилятор создает набор состояний и переходов конечного автомата.

no subject
Date: 2007-06-22 20:27 (UTC)no subject
Date: 2007-06-22 20:38 (UTC)Мелочи всё это. Мне сейчас надо саму концепцию застолбить. И проверить на вшивость.
no subject
Date: 2007-06-22 20:43 (UTC)no subject
Date: 2007-06-22 21:14 (UTC)Интересная ссылочка, спасибо. Но всё же прав Столлман, гнать надо все эти софтовые патенты. Слава богу, Европе хватило ума их запретить.
no subject
Date: 2007-06-22 23:18 (UTC)no subject
Date: 2007-06-22 23:40 (UTC)no subject
Date: 2007-06-23 00:21 (UTC)no subject
Date: 2007-06-24 21:22 (UTC)За книжки действительно премного благодарен, юзаю и наслаждаюсь. Паттерсон и Хеннеси - просто прелесть.
Ну, ты себя так сильно не укоряй, этот вирус я не от тебя подхватил. Насчет инфернальности не знаю, Ефремова ниасилил, слишком много букаф. :)
Но есть какая-то такая фишка, которая передается от человека к человеку, помимо слов и идей. Мистическое шило в заднице. :)
no subject
Date: 2007-06-22 20:57 (UTC)Сравни с моим Хаскельным. И в verilog переводится один в один, и записано короче. И понятней. И проверяемей - я даже могу проверить недостижимые состояния. Более того, гибче - нет явных delay. К тому же у тебя непонятно, что выполняется в один такт, что в несколько. ;)
no subject
Date: 2007-06-22 21:30 (UTC)Врубился в код, но никак мне не кажется твой вариант более понятным. Не то полушарие работает? :)
no subject
Date: 2007-06-22 21:47 (UTC)no subject
Date: 2007-06-22 21:41 (UTC)no subject
Date: 2007-06-22 21:50 (UTC)В твоем коде как раз не видно, что сколько времени выполняется. "Синхроны" спрятаны в delay, в котором, похоже, ошибка. ;)
no subject
Date: 2007-06-24 20:50 (UTC)И ошибку в delay() не вижу. Вроде всё как задумано.
Чтобы понимать время выполнения, надо для каждой процедуры держать в голове количество тактов. Вызов процедур фактически выполняется как макроподстановка. Надо еще подумать, нужны ли функции, возвращающие результат.
no subject
Date: 2007-06-24 20:59 (UTC)Если по синхронизации, то она в delay стоит вне цикла (ошибка). Если по точке с запятой, то несколько присвоений подряд (а начале цикла) будут выполнятся излишне медленно (ошибка в другом месте, зато в delay все правильно;).
Если не будет функций, возвращающих результат, то это вообще - туши свет. ;)
no subject
Date: 2007-06-25 13:28 (UTC)С функциями возникает интересный вопрос. Предположим, имеется пара функций a() и b(), каждая из которых вычисляется за несколько тактов. При выполнении c := a() + b() обе функции можно было бы вычислять одновременно. Что делать с побочными эффектами функций, типа изменения внешних сигналов? Или забить, пусть юзер сам решает?
Потом, если можно функции выполнять одновременно, надо бы и для процедур такое разрешить.
no subject
Date: 2007-06-25 13:40 (UTC)На какое расстояние распространяется окраска? Кто и как за этим будет следить?
В функциях есть побочные эффекты. Великолепно. ;)
А что будет, если a() выполняется за N тактов, а b() за M?
x+y за сколько тактов выполняется? А x+y+z? А sum(arr,1,M)? А в большой программе кто ответственен за самый длинный такт (за критическую цепочку)?
Сравни с подходом с функциями с изменением состояний.
Функции чистые. Состояния явные. Побочные эффекты явные. Длительность выполнения всегда один такт. Ясно, кто содержит критическую цепочку.
Выбор за вами. ;)
no subject
Date: 2007-06-25 15:54 (UTC)Если функции в одном выражении выполняются за разное количество тактов, придется хранить более ранний результат в промежуточном регистре.
Функциональный подход мне нравится. Но я лично не рискну двигаться в эту сторону, не моё это болото... :/
no subject
Date: 2007-06-22 23:46 (UTC)no subject
Date: 2007-06-24 21:08 (UTC)a <= @(posedge clk) b. И написал для этого специальный препроцессор VITO. Но это полумера всё-же. Макроассемблеры тоже были полезны в своё время, но вымерли как динозавры.no subject
Date: 2007-06-25 03:00 (UTC)Оператор
a <= @(posedge clk) bпридумывать не надо - он в стандартном языке легален.no subject
Date: 2007-06-25 13:38 (UTC)