Back to posts Edit this post
Copy content

12 Jun 12:54

//------------------------------------------------------------------------------- // 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 ); wire CLK = CLK_PCB; wire RST = ~nRST_PCB; // heartbeat dla LED 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] }; wire buzz_unused; automat #( .TICK_LENGTH(50000-1) ) u_automat ( .RST (RST), .CLK (CLK), .P_P (PED_BUTT), .CAR (ROAD_DET), .CR (ROAD_RED), .CY (ROAD_YELLOW), .CG (ROAD_GREEN), .PR (PED_RED), .PG (PED_GREEN), .BUZZ (buzz_unused) ); endmodule //------------------------------------------------------------------------------- // automat.v //------------------------------------------------------------------------------- module automat #( parameter TICK_LENGTH = 50000-1 // liczba taktów na 1 sekundę )( input wire RST, input wire CLK, input wire P_P, input wire CAR, output wire CR, output wire CY, output wire CG, output wire PR, output wire PG, output wire BUZZ ); reg [31:0] COUNT_SEC; reg [31:0] COUNT; reg [2:0] NEXT_STATE; always @(posedge CLK or posedge RST) begin if (RST) begin COUNT_SEC <= TICK_LENGTH; COUNT <= 5; NEXT_STATE <= 1; end else begin if (COUNT_SEC == 0) begin COUNT_SEC <= TICK_LENGTH; if (COUNT == 0) begin COUNT <= 5; NEXT_STATE <= (NEXT_STATE == 7) ? 1 : NEXT_STATE + 1; end else begin COUNT <= COUNT - 1; end end else begin COUNT_SEC <= COUNT_SEC - 1; end end end wire [2:0] STATE = NEXT_STATE; // Przekazujemy COUNT i COUNT_SEC dalej, żeby można było miganie stan2LED #(.TICK_LENGTH(TICK_LENGTH)) s2l ( .STATE (STATE), .COUNT (COUNT), .COUNT_SEC (COUNT_SEC), .CR (CR), .CY (CY), .CG (CG), .PR (PR), .PG (PG), .BUZZ (BUZZ) ); endmodule //------------------------------------------------------------------------------- // stan2LED.v //------------------------------------------------------------------------------- module stan2LED #( parameter TICK_LENGTH = 50000-1 )( input wire [2:0] STATE, input wire [31:0] COUNT, input wire [31:0] COUNT_SEC, output reg CR, output reg CY, output reg CG, output reg PR, output reg PG, output reg BUZZ ); // połowa sub-sekundy dla migania localparam HALF_TICK = (TICK_LENGTH >> 1); always @(*) begin CR = 0; CY = 0; CG = 0; PR = 0; PG = 0; BUZZ = 0; case (STATE) 1: begin CR = 1; PR = 1; end 2: begin CR = 1; CY = 1; PR = 1; end 3: begin CG = 1; PR = 1; end 4: begin CY = 1; PR = 1; end 5: begin CR = 1; PR = 1; end 6: begin // stan „piesi zielone”: CR = 1; if (COUNT > 1) begin // zwykłe zielone PG = 1; end else begin // ostatnia sekunda – miganie 0.5s ON/OFF PG = (COUNT_SEC > HALF_TICK) ? 1 : 0; end end 7: begin CR = 1; BUZZ = 1; end default: begin // (STATE==0) – nic się nie świeci end endcase end endmodule

No files