vak: (Default)
[personal profile] vak

Идея состоит в построении процедурного Си-подобного языка, который бы однозначным образом компилировался в Верилог.

Язык Си часто называют высокоуровневым ассемблером. В этом есть определенная сермяжная правда: опытный программист хорошо представляет себе, в какие ассемблерные конструкции превращается Си-шный код. Нечто аналогичное хочется проделать с Верилогом.

Отличие разработки на Верилоге от традиционного программирования состоит в существенно более высоком уровне параллелизма. Система создается как некоторое количество конечных автоматов, фукнционирующих одновременно. Каждый из конечных автоматов имеет несколько десятков, реже - сотен состояний. Количество таких автоматов - тысячи и десятки тысяч.

Традиционная же программа представляет собой один конечный автомат, имеющий сотни тысяч и миллионы состояний. Каждое значение регистра адреса команды (PC) есть одно состояние конечного автомата. Иногда программа может состоять из нескольких конечных автоматов, если в ней используются потоки.

Представляется интересным проект языка — надстройки над Верилогом, позволяющего писать программы в процедурном стиле, но оставляющего свободу доступа к низкому уровню для инженера-электроника.

Date: 2007-06-21 18:19 (UTC)
From: [identity profile] thesz.livejournal.com
data RoadLightStates =
        PassAuto
    |   ReadyingStopAuto { time :: Int }
    |   AutoWarned { time :: Int }
    |   PassWalkers { time :: Int }
    |   ReadyingWalkersStop { time :: Int }
    |   ReadyingAutoPass { time :: Int }

data Button = Pressed | NotPressed

data Lights =
    Lights { red :: Bool, yellow :: Bool, green :: Bool, stop :: Bool, walk :: Bool}

defLights = Lights False False False False False

wait3sec samestate nextstate time
    | time > timeout3sec = nextstate
    | otherwise = samestate

blink time = ((time / blinkcount) % 2) /= 0

roadlight PassAuto NotPressed = (PassAuto,defLights { green = True, stop = True })
roadlight PassAuto Pressed = (ReadyingStopAuto {
         autoGreenBlinkCount = Int, time = Int }
        ,defLights { green = True, stop = True })
roadlight (ReadyingStopAuto time} _ =
    (nextState,defLights {green = blinked, stop = True})
    where
        nextState = wait3sec
            (ReadyingStopAuto (time+1))
            (AutoWarned { time = 0 })
            time
        blinked = blink time
roadlight (AutoWarned time) _ =
    (nextState,defLights { yellow = True, stop = True)
    where
         nextState = wait3sec
              (AutoWarned { time = time+1})
              (PassWalkers { time = 0 })
              time
roadlight (PassWalkers time) _ =
    (nextState,defLights { red = True, walk = True })
    where
        nextState
            | time > timeout30sec = ReadyingAutoPass { time = 0}
            | otherwise = PassWalkers { time = time + 1 }
roadlight (ReadyingAutoPass time) _ =
     (nextState,defLights { red = True, yellow = True, walk = blink time})
     where
         nextState
             | time > timeout1sec = PassAuto
             | otherwise = ReadyingAutoPass ({ time = time+1 }

-- Для симуляции: воткнем это в защелку.
roadlightCircuit buttonPresses = loopS (PassAuto) roadlight buttonPresses
Там есть ашипка, но ее легко исправить.

Вот в таком табличном стиле все и пишется. Тут и параллельное вычисление в секции where, и машина состояний с протаскиваемым параметром.

Date: 2007-06-21 20:09 (UTC)
From: [identity profile] thesz.livejournal.com
Всегда пожалуйста. ;)