mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +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
 |