Tang PrimerでPWMでLチカ

LEDのサンプルを改造して、PWMでホワッと点滅するLチカにしてみました。

秒を基本とした周期にするため、まず24MHz入力クロックを24分周して、1MHz周期のイネーブル信号ckeを生成します。

これで0〜999(time1)までカウントするcount1と、count1の桁上がりのタイミングで0〜499(time2)までカウントするcount2を作ります。

count2が前半の場合には2倍した値を、後半の場合にはtime2から引いた値を2倍した値をduty比較用の値として count1 と比較して、点灯期間の場合には指定のLEDを点灯、消灯期間の場合には全LEDを消灯させます。

/* デバイスは EG4::EG4S20BG256 */ 

module led
	(
		input wire CLK_IN,
		input wire RST_N,
		output wire [2:0]RGB_LED
	);

	parameter time1 =    10'd1000 - 1'd1;
//	parameter time2 =    10'd1000 - 1'd1;	// 1秒周期
	parameter time2 =    10'd500 - 1'd1;	// 0.5秒周期
	
	reg [2:0] rled;
	reg [2:0] rledout;
	reg [9:0] count1;   // PWM DUTY用(1ms周期)
	reg [9:0] count2;   // PWM レベル用(1s周期)
	reg [4:0] ckec;
	reg cke;			// 1us周期イネーブル

	reg [9:0] duty;
	
	initial
	begin
		count1=10'b0;
		count2=10'b0;
		rled=3'b110;
		cke = 1'b1;
		ckec <= 5'b0 ;
	end

	// 1MHz周期のイネーブル信号生成
	always @(posedge CLK_IN)begin
		if(RST_N==0)begin
			cke = 1'b1;
		end
		if(ckec == 5'd23)
		begin
			ckec <= 5'b0 ;
			cke <= 1'b1;
		end
		else begin
			ckec <= ckec + 1'b1;
			cke <= 1'b0;
		end
    end

	always @(posedge CLK_IN)begin
		if(cke == 1'b1 & RST_N==0)begin
			count1 <= 10'b0;
			count2 <= 10'b0;
			rled <= 3'b110;
		end

		// 1usクロックで0〜999(time1)までカウント
		if(cke == 1'b1)
		begin
			if(count1 == time1)
	 		begin 
	 			count1<= 10'd0;
	 		end
	 		else begin
	 			count1 <= count1 + 1'b1;
			end
	 	end

		// count1の1周期で0〜999(time2)までカウント
		if(cke == 1'b1 & count1 == time1)
			begin
				if(count2 == time2)
		 		begin 
		 			count2<= 10'd0;
					rled <= {rled[1:0],rled[2]};
		 		end
		 		else
		 			count2 <= count2 + 1'b1;
		 	end

		// LEDを駆動するPWM信号生成
		if(cke == 1'b1)
		begin
			if(count2 < time2/2)
				duty = count2 * 2;
			else 
				duty = (time2 - count2) * 2;
	
			if(count1 < duty)
				rledout = rled;
			else
				rledout = 3'b111;

		end
	end

	assign RGB_LED = rledout;

endmodule

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)