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