====== Проект пешеходного светофора ====== Рассмотрим проект контроллера светофора для пешеходного перехода. Имеем следующее оборудование: * светофор для автомобилей, три сигнала: красный, желтый, зеленый * светофор для пешеходов, два сигнала: красный, зеленый * кнопка переключения * генератор импульсов, задающий время В обычном состоянии автомобильный светофор должен быть открыт (зеленый), а пешеходный - закрыт (красный). По нажатию кнопки светофоры должны переключиться, открыв пешеходный переход, затем вернуться в исходное состояние. Для реального светофора время каждого состояния должно задаваться отдельно, но это оставим на потом. ====== Реализация на языке Verilog ====== Классическая реализация конечного автомата. // // Simple traffic light controller. // Implemented using Verilog. // There are two traffic lights: one for cars and another for pedestrians. // Usually car light is green and pedestrian light is red. // Pressing button requests opening the way for pedestrians. // module traffic_light ( input wire clock, input wire button, output wire car_red, output wire car_yellow, output wire car_green, output wire ped_red, output wire ped_green); // Four states: // 0) yellow for cars, red for pedestrians // 1) red for cars, green for pedestrians // 2) red+yellow for cars, red for pedestrians // 3) green for cars, red for pedestrians parameter [1:0] YELLOW = 0; parameter [1:0] RED = 1; parameter [1:0] RED_YELLOW = 2; parameter [1:0] GREEN = 3; reg [1:0] state, next_state; // Pressing button forces state 0. Then states // are changed every clock cycle 0->1->2->3. // State 3 is kept until pressing req. always @ (state or button) begin next_state = GREEN; case (state) YELLOW: next_state = RED; RED: next_state = RED_YELLOW; RED_YELLOW: next_state = GREEN; GREEN: if (button == 1) begin next_state = YELLOW; end else begin next_state = GREEN; end default: next_state = GREEN; endcase end always @ (posedge clock) begin state <= next_state; case (next_state) YELLOW: begin car_red <= 0; car_yellow <= 1; car_green <= 0; ped_red <= 1; ped_green <= 0; end RED: begin car_red <= 1; car_yellow <= 0; car_green <= 0; ped_red <= 0; ped_green <= 1; end RED_YELLOW: begin car_red <= 1; car_yellow <= 1; car_green <= 0; ped_red <= 1; ped_green <= 0; end GREEN: begin car_red <= 0; car_yellow <= 0; car_green <= 1; ped_red <= 1; ped_green <= 0; end endcase end endmodule ====== Реализация на языке Plog ====== Цикл с четырьмя состояниями. Код можно было бы еще упростить, убрав избыточные присваивания. Оператор-метка <