===== Трансляция в Verilog ===== [[tlight-plog | В файле tligt-plog]] приведена "примерная" реализация светофора на языке Plog. После компиляции должен получиться код на Верилоге примерно следующего вида: // // Ручная трансляция с Plog в Verilog. // module traffic_light_controller ( input rst, // Сброс в исходное состояние input clk, // Синхросигнал, 10 импульсов в секунду input button, // Кнопка запроса на переход output reg red, // Красный output reg yellow, // Желтый output reg green, // Зелёный output reg stop, // "Стойте" output reg walk); // "Идите" // Запомненный запрос на переход reg button_request; // Состояние reg [4:0] _state; `define _STATE_delay_1 0 `define _STATE_delay_2 1 `define _STATE_delay_3 3 `define _STATE_wait_request 4 `define _STATE_delay_4 5 `define _STATE_delay_5 6 `define _STATE_delay_6 7 `define _STATE_delay_7 8 `define _STATE_delay_8 9 `define _STATE_delay_9 10 `define _STATE_delay_10 11 `define _STATE_delay_11 12 `define _STATE_delay_12 13 `define _STATE_delay_13 14 `define _STATE_delay_14 15 `define _STATE_delay_15 16 `define _STATE_delay_16 17 `define _STATE_delay_17 18 // Параметр процедуры delay() reg [7:0] _delay_n; // Оператор "start (rst, clk)" превращается в "always". always @(posedge clk) begin if (rst) begin // Исходное состояние: красный, "стойте". red <= 1; yellow <= 0; green <= 0; stop <= 1; walk <= 0; button_request <= 0; // Задержим исходное состояние на одну секунду. // Вызов delay (10). _delay_n <= 10; _state <= _STATE_delay_1; end else begin // Работа светофора. case (_state) _STATE_delay_1: begin if (_delay_n > 0) begin _delay_n <= _delay_n - 1; end else begin // Жёлтый+красный для автомобилей, // “стойте” для пешеходов. Длится одну секунду. yellow <= 1; stop <= 1; walk <= 0; // Вызов delay (10). _delay_n <= 10; _state <= _STATE_delay_2; end end _STATE_delay_2: begin if (_delay_n > 0) begin _delay_n <= _delay_n - 1; end else begin // Зеленый для автомобилей, “стойте” для пешеходов. // Обычное состояние при отсутствии пешеходов. red <= 0; yellow <= 0; green <= 1; // Вызов delay (250). _delay_n <= 250; _state <= _STATE_delay_3; end end _STATE_delay_3: begin if (_delay_n > 0) begin _delay_n <= _delay_n - 1; end else begin // Ждём нажатия кнопки пешеходом. _state <= _STATE_wait_request; end end _STATE_wait_request: begin if (button_repeat == 0) begin // Пустой цикл. end else begin button_request <= 0; // Мигает зеленый для автомобилей, // горит “стойте” для пешеходов. // Включается через некоторое время (не более // 25 секунд) после нажатия кнопки запроса. // Длится три секунды. green <= 0; // Вызов delay (5). _delay_n <= 5; _state <= _STATE_delay_4; end end _STATE_delay_4: begin if (_delay_n > 0) begin _delay_n <= _delay_n - 1; end else begin green <= 1; // Вызов delay (5). _delay_n <= 5; _state <= _STATE_delay_5; end end _STATE_delay_5: begin if (_delay_n > 0) begin _delay_n <= _delay_n - 1; end else begin green <= 0; // Вызов delay (5). _delay_n <= 5; _state <= _STATE_delay_6; end end _STATE_delay_6: begin if (_delay_n > 0) begin _delay_n <= _delay_n - 1; end else begin green <= 1; // Вызов delay (5). _delay_n <= 5; _state <= _STATE_delay_7; end end _STATE_delay_7: begin if (_delay_n > 0) begin _delay_n <= _delay_n - 1; end else begin green <= 0; // Вызов delay (5). _delay_n <= 5; _state <= _STATE_delay_8; end end _STATE_delay_8: begin if (_delay_n > 0) begin _delay_n <= _delay_n - 1; end else begin green <= 1; // Вызов delay (5). _delay_n <= 5; _state <= _STATE_delay_9; end end _STATE_delay_9: begin if (_delay_n > 0) begin _delay_n <= _delay_n - 1; end else begin // Жёлтый для автомобилей, “стойте” для пешеходов. // Длится три секунды. yellow <= 1; green <= 0; // Вызов delay (30). _delay_n <= 30; _state <= _STATE_delay_10; end end _STATE_delay_10: begin if (_delay_n > 0) begin _delay_n <= _delay_n - 1; end else begin // Красный для автомобилей, “идите” для пешеходов. // Длится десять секунд. red <= 1; yellow <= 0; stop <= 0; walk <= 1; // Вызов delay (100). _delay_n <= 100; _state <= _STATE_delay_11; end end _STATE_delay_11: begin if (_delay_n > 0) begin _delay_n <= _delay_n - 1; end else begin walk <= 0; // Вызов delay (5). _delay_n <= 5; _state <= _STATE_delay_12; end end _STATE_delay_12: begin if (_delay_n > 0) begin _delay_n <= _delay_n - 1; end else begin walk <= 1; // Вызов delay (5). _delay_n <= 5; _state <= _STATE_delay_13; end end _STATE_delay_13: begin if (_delay_n > 0) begin _delay_n <= _delay_n - 1; end else begin walk <= 0; // Вызов delay (5). _delay_n <= 5; _state <= _STATE_delay_14; end end _STATE_delay_14: begin if (_delay_n > 0) begin _delay_n <= _delay_n - 1; end else begin walk <= 1; // Вызов delay (5). _delay_n <= 5; _state <= _STATE_delay_15; end end _STATE_delay_15: begin if (_delay_n > 0) begin _delay_n <= _delay_n - 1; end else begin walk <= 0; // Вызов delay (5). _delay_n <= 5; _state <= _STATE_delay_16; end end _STATE_delay_16: begin if (_delay_n > 0) begin _delay_n <= _delay_n - 1; end else begin walk <= 1; // Вызов delay (5). _delay_n <= 5; _state <= _STATE_delay_17; end end _STATE_delay_17: begin if (_delay_n > 0) begin _delay_n <= _delay_n - 1; end else begin // Жёлтый+красный для автомобилей, // “стойте” для пешеходов. Длится одну секунду. yellow <= 1; stop <= 1; walk <= 0; // Вызов delay (10). _delay_n <= 10; _state <= _STATE_delay_2; end end endcase // Если нажата кнопка, запоминаем запрос. if (button != 0) button_request <= 1; end end