mirror of
https://github.com/KevinMidboe/linguist.git
synced 2025-10-29 09:40:21 +00:00
168 lines
6.0 KiB
Plaintext
168 lines
6.0 KiB
Plaintext
package TL;
|
|
|
|
interface TL;
|
|
method Action ped_button_push();
|
|
|
|
(* always_enabled *)
|
|
method Action set_car_state_N(Bool x);
|
|
(* always_enabled *)
|
|
method Action set_car_state_S(Bool x);
|
|
(* always_enabled *)
|
|
method Action set_car_state_E(Bool x);
|
|
(* always_enabled *)
|
|
method Action set_car_state_W(Bool x);
|
|
|
|
method Bool lampRedNS();
|
|
method Bool lampAmberNS();
|
|
method Bool lampGreenNS();
|
|
|
|
method Bool lampRedE();
|
|
method Bool lampAmberE();
|
|
method Bool lampGreenE();
|
|
|
|
method Bool lampRedW();
|
|
method Bool lampAmberW();
|
|
method Bool lampGreenW();
|
|
|
|
method Bool lampRedPed();
|
|
method Bool lampAmberPed();
|
|
method Bool lampGreenPed();
|
|
endinterface: TL
|
|
|
|
typedef enum {
|
|
AllRed,
|
|
GreenNS, AmberNS,
|
|
GreenE, AmberE,
|
|
GreenW, AmberW,
|
|
GreenPed, AmberPed} TLstates deriving (Eq, Bits);
|
|
|
|
typedef UInt#(5) Time32;
|
|
typedef UInt#(20) CtrSize;
|
|
|
|
(* synthesize *)
|
|
module sysTL(TL);
|
|
Time32 allRedDelay = 2;
|
|
Time32 amberDelay = 4;
|
|
Time32 nsGreenDelay = 20;
|
|
Time32 ewGreenDelay = 10;
|
|
Time32 pedGreenDelay = 10;
|
|
Time32 pedAmberDelay = 6;
|
|
|
|
CtrSize clocks_per_sec = 100;
|
|
|
|
Reg#(TLstates) state <- mkReg(AllRed);
|
|
Reg#(TLstates) next_green <- mkReg(GreenNS);
|
|
Reg#(Time32) secs <- mkReg(0);
|
|
Reg#(Bool) ped_button_pushed <- mkReg(False);
|
|
Reg#(Bool) car_present_N <- mkReg(True);
|
|
Reg#(Bool) car_present_S <- mkReg(True);
|
|
Reg#(Bool) car_present_E <- mkReg(True);
|
|
Reg#(Bool) car_present_W <- mkReg(True);
|
|
Bool car_present_NS = car_present_N || car_present_S;
|
|
Reg#(CtrSize) cycle_ctr <- mkReg(0);
|
|
|
|
rule dec_cycle_ctr (cycle_ctr != 0);
|
|
cycle_ctr <= cycle_ctr - 1;
|
|
endrule
|
|
|
|
Rules low_priority_rule = (rules
|
|
rule inc_sec (cycle_ctr == 0);
|
|
secs <= secs + 1;
|
|
cycle_ctr <= clocks_per_sec;
|
|
endrule endrules);
|
|
|
|
function Action next_state(TLstates ns);
|
|
action
|
|
state <= ns;
|
|
secs <= 0;
|
|
endaction
|
|
endfunction: next_state
|
|
|
|
function TLstates green_seq(TLstates x);
|
|
case (x)
|
|
GreenNS: return (GreenE);
|
|
GreenE: return (GreenW);
|
|
GreenW: return (GreenNS);
|
|
endcase
|
|
endfunction
|
|
|
|
function Bool car_present(TLstates x);
|
|
case (x)
|
|
GreenNS: return (car_present_NS);
|
|
GreenE: return (car_present_E);
|
|
GreenW: return (car_present_W);
|
|
endcase
|
|
endfunction
|
|
|
|
function Rules make_from_green_rule(TLstates green_state, Time32 delay, Bool car_is_present, TLstates ns);
|
|
return (rules
|
|
rule from_green (state == green_state && (secs >= delay || !car_is_present));
|
|
next_state(ns);
|
|
endrule endrules);
|
|
endfunction: make_from_green_rule
|
|
|
|
function Rules make_from_amber_rule(TLstates amber_state, TLstates ng);
|
|
return (rules
|
|
rule from_amber (state == amber_state && secs >= amberDelay);
|
|
next_state(AllRed);
|
|
next_green <= ng;
|
|
endrule endrules);
|
|
endfunction: make_from_amber_rule
|
|
|
|
Rules hprs[7];
|
|
|
|
hprs[1] = make_from_green_rule(GreenNS, nsGreenDelay, car_present_NS, AmberNS);
|
|
hprs[2] = make_from_amber_rule(AmberNS, GreenE);
|
|
hprs[3] = make_from_green_rule(GreenE, ewGreenDelay, car_present_E, AmberE);
|
|
hprs[4] = make_from_amber_rule(AmberE, GreenW);
|
|
hprs[5] = make_from_green_rule(GreenW, ewGreenDelay, car_present_W, AmberW);
|
|
hprs[6] = make_from_amber_rule(AmberW, GreenNS);
|
|
|
|
hprs[0] = (rules
|
|
rule fromAllRed (state == AllRed && secs >= allRedDelay);
|
|
if (ped_button_pushed) action
|
|
ped_button_pushed <= False;
|
|
next_state(GreenPed);
|
|
endaction else if (car_present(next_green))
|
|
next_state(next_green);
|
|
else if (car_present(green_seq(next_green)))
|
|
next_state(green_seq(next_green));
|
|
else if (car_present(green_seq(green_seq(next_green))))
|
|
next_state(green_seq(green_seq(next_green)));
|
|
else
|
|
noAction;
|
|
endrule: fromAllRed endrules);
|
|
|
|
Rules high_priority_rules = hprs[0];
|
|
for (Integer i = 1; i<7; i=i+1)
|
|
high_priority_rules = rJoin(hprs[i], high_priority_rules);
|
|
|
|
addRules(preempts(high_priority_rules, low_priority_rule));
|
|
|
|
method Action ped_button_push();
|
|
ped_button_pushed <= True;
|
|
endmethod: ped_button_push
|
|
|
|
method Action set_car_state_N(b) ; car_present_N <= b; endmethod
|
|
method Action set_car_state_S(b) ; car_present_S <= b; endmethod
|
|
method Action set_car_state_E(b) ; car_present_E <= b; endmethod
|
|
method Action set_car_state_W(b) ; car_present_W <= b; endmethod
|
|
|
|
method lampRedNS() = (!(state == GreenNS || state == AmberNS));
|
|
method lampAmberNS() = (state == AmberNS);
|
|
method lampGreenNS() = (state == GreenNS);
|
|
method lampRedE() = (!(state == GreenE || state == AmberE));
|
|
method lampAmberE() = (state == AmberE);
|
|
method lampGreenE() = (state == GreenE);
|
|
method lampRedW() = (!(state == GreenW || state == AmberW));
|
|
method lampAmberW() = (state == AmberW);
|
|
method lampGreenW() = (state == GreenW);
|
|
|
|
method lampRedPed() = (!(state == GreenPed || state == AmberPed));
|
|
method lampAmberPed() = (state == AmberPed);
|
|
method lampGreenPed() = (state == GreenPed);
|
|
|
|
endmodule: sysTL
|
|
|
|
endpackage: TL
|