module pwm_led ( input clk_50, // 50 MHz clock op MAX II board output reg max_led, // led op MAX II board actief low input encoder_A, // rotary encoder A kanaal input encoder_B // rotary encoder B kanaal ); reg [7:0] prescaler; // 50 MHz mag gerust gedeeld worden reg [7:0] pwm_teller; // 8 bit pwm teller reg [7:0] pwm_waarde; // 8 bit pwm teller reg [2:0] encoder_A_reg; // synchronisatie A kanaal reg [2:0] encoder_B_reg; // synchronisatie B kanaal reg enc_ena; // actief bij een flankwissel van A of B reg richting2; // draairichting encoder assign pwm_clk = prescaler[7]; // prescaler is 8 bit voor deze pwm_clk always @ (posedge clk_50) // delen de clock door 65536 begin prescaler <= prescaler + 1; end always @(posedge pwm_clk) begin encoder_A_reg <= {encoder_A_reg[1:0], encoder_A}; // rotary encoder_A doorschuiven encoder_B_reg <= {encoder_B_reg[1:0], encoder_B}; // rotary encoder_B doorschuiven enc_ena <= encoder_A_reg[1] ^ encoder_A_reg[2] ^ encoder_B_reg[1] ^ encoder_B_reg[2]; richting2 <= encoder_A_reg[1] ^ encoder_B_reg[2]; if(enc_ena) begin if (richting2) begin if(pwm_waarde < 255) pwm_waarde <= pwm_waarde +1; // increment tot max 255 end else begin if (pwm_waarde > 0) pwm_waarde <= pwm_waarde -1; // decrement begrenzen tot 0 end end end // 8 bit pwm teller en pwm comparator output. always @(posedge pwm_clk) begin pwm_teller <= pwm_teller +1; if ((pwm_teller == 0) & (pwm_waarde > 0))max_led <= 0; // actief low, dus 0 sturen if (pwm_teller == pwm_waarde) max_led <= 1; // 1 sturen = afleggen end endmodule