21 |
Lチカの実装 (3) |
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