Article #42

既に発行済みのブログであっても適宜修正・追加することがあります。
Even in the already published blog, we may modify and add appropriately.

Lチカの実装(3)

posted by sakurai on May 21, 2018

RTL

以下にRTLを掲載します。元の要求を3分割し、アーキテクチャ設計として3つのエレメントの直列系により、目標となる要件を満足することができました。仕様を満たす動作をするかどうかはシミュレーションにより確認することができます。ただし、長いカウンタはシミュレーションを工夫しなければ、シミュレーション時間が非常に長時間になってしまいます。従って、任意の値をロードするようなテスト回路を挿入する工夫が必要となります。まずは基本の記述を掲載します。

Blinkモジュール

blinkモジュールは以下に示す、25bitカウンタ、14進カウンタ、LEDデコーダの3つのモジュールを含みます。

//
// LED blinking
//
module blink (
input CLK,
input XRST,
output [7:0] LED
);

wire CE;
wire [3:0] C14;

count25 count25(
.CLK(CLK),
.XRST(XRST),
.CE(CE)
);

count14 count14(
.CLK(CLK),
.XRST(XRST),
.CE(CE),
.C14(C14)
);

decoder decoder(
.C14(C14),
.LED(LED)
);

endmodule

25bitカウンタ

/* system clock division */
module count25 (
input CLK,
input XRST,
output CE
);

reg [24:0] count25;
always @(posedge CLK) begin
if (~XRST)
count25 <= 25'h0;
else
count25 <= count25 + 1'h1;
end

assign CE = (count25 == 25'h1ffffff);

endmodule

14進カウンタ

/* 14 advance counter for LED */
module count14 (
input CLK,
input XRST,
input CE,
output [3:0] C14
);

reg [3:0] count14;
always @(posedge CLK) begin
if (~XRST)
count14 <= 14'h0;
else if (CE)
if (count14 == 13)
count14 <= 0;
else
count14 <= count14 + 1'h1;

end
assign C14 = count14;

endmodule

LEDデコーダ

/* LED Decoder */
module decoder (
input [3:0] C14,
output reg [7:0] LED
);

always @* begin
case (C14)
0: LED = 8'b00000001;
1: LED = 8'b00000010;
2: LED = 8'b00000100;
3: LED = 8'b00001000;
4: LED = 8'b00010000;
5: LED = 8'b00100000;
6: LED = 8'b01000000;
7: LED = 8'b10000000;
8: LED = 8'b01000000;
9: LED = 8'b00100000;
10: LED = 8'b00010000;
11: LED = 8'b00001000;
12: LED = 8'b00000100;
13: LED = 8'b00000010;
endcase
end
endmodule


左矢前のブログ 次のブログ右矢

Leave a Comment

Your email address will not be published.

You may use Markdown syntax.

Please enter the letters as they are shown in the image above.
Letters are not case-sensitive.