Трансляция в Verilog

В файле 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
 
proj/verilog/tlight-v.txt · Последние изменения: 2007/06/22 13:59 vak
 
Copyright (C) 1996-2013 Serge Vakulenko
serge@vak.ru