Back to posts Edit this post
Copy content

12 Jun 12:19

//------------------------------------------------------------------------------- // top.v //------------------------------------------------------------------------------- module top ( input wire CLK_PCB, input wire nRST_PCB, input wire ROAD_DET, output wire ROAD_RED, output wire ROAD_YELLOW, output wire ROAD_GREEN, input wire PED_BUTT, output wire PED_RED, output wire PED_GREEN, output wire [3:0] LED ); parameter SIM = "FALSE"; wire CLK = CLK_PCB; wire RST_PCB = ~nRST_PCB; wire RST_async, RST_sync, RST; assign RST_async = RST_PCB; rst_synch_bridge my_rst_synch_bridge( .I_RST(RST_async), .CLK(CLK), .O_RST(RST_sync) ); assign RST = RST_sync; // heartbeat / demo signals reg [31:0] heartbeat_clk; always @(posedge CLK or posedge RST) begin if (RST) heartbeat_clk <= 0; else heartbeat_clk <= heartbeat_clk + 1; end assign LED = ~{ROAD_DET, PED_BUTT, RST, heartbeat_clk[27]}; assign {ROAD_RED, ROAD_YELLOW, ROAD_GREEN, PED_RED, PED_GREEN} = heartbeat_clk[26:22]; endmodule //------------------------------------------------------------------------------- // automat.v //------------------------------------------------------------------------------- module automat #( parameter TICK_LENGTH = 50000 - 1 // licznik sub-sekundowy )( input wire RST, // asynchroniczny reset input wire CLK, // taktowanie input wire P_P, // przycisk pieszy (niewykorzystane w tym przykładzie) input wire CAR, // wykrycie pojazdu (niewykorzystane w tym przykładzie) output wire CR, // czerwone światło dla samochodów output wire CY, // żółte światło dla samochodów output wire CG, // zielone światło dla samochodów output wire PR, // czerwone światło dla pieszych output wire PG, // zielone światło dla pieszych output wire BUZZ // brzęczyk ); // zegar drugowy i sub-sekundowy reg [31:0] COUNT; reg [31:0] COUNT_SEC; // stan maszyny reg [2:0] NEXT_STATE; // Standardowa, synchroniczna logika z asynchronicznym resetem always @(posedge CLK or posedge RST) begin if (RST) begin // inicjalizacja po resecie COUNT_SEC <= TICK_LENGTH; COUNT <= 8; NEXT_STATE <= 0; end else begin // dekrementuj sub-sekundowy licznik if (COUNT_SEC == 0) begin COUNT_SEC <= TICK_LENGTH; // gdy sub-licznik przewinął się do zera, dekrementuj COUNT if (COUNT == 0) begin // przewinięcie całej sekundy — reset i zmiana stanu COUNT <= 8; NEXT_STATE <= NEXT_STATE + 1; end else begin COUNT <= COUNT - 1; end end else begin COUNT_SEC <= COUNT_SEC - 1; end end end // aktualny stan to NEXT_STATE wire [2:0] STATE = NEXT_STATE; // instancja translacji stanu na diody i buzzer stan2LED s2l ( .STATE(STATE), .CR(CR), .CY(CY), .CG(CG), .PR(PR), .PG(PG), .BUZZ(BUZZ) ); endmodule //------------------------------------------------------------------------------- // stan2LED.v //------------------------------------------------------------------------------- module stan2LED ( input wire [2:0] STATE, output reg CR, output reg CY, output reg CG, output reg PR, output reg PG, output reg BUZZ ); always @(*) begin // domyślnie wszystko wyłączone CR = 0; CY = 0; CG = 0; PR = 0; PG = 0; BUZZ = 0; case (STATE) 0: begin // tryb idle, brak świateł BUZZ = 0; end 1: begin // czerwone auta + czerwone piesi CR = 1; PR = 1; end 2: begin // czerwone auta + żółte piesi (przygotowanie) CR = 1; CY = 1; PR = 1; end 3: begin // zielone auta + czerwone piesi CG = 1; PR = 1; end 4: begin // żółte auta + czerwone piesi CY = 1; PR = 1; end 5: begin // ponownie czerwone auta + czerwone piesi CR = 1; PR = 1; end 6: begin // czerwone auta + zielone piesi CR = 1; PG = 1; end 7: begin // czerwone auta, piesi czekają + buzzer CR = 1; BUZZ = 1; end endcase end endmodule

No files