『FPGAボードで学ぶVerilog HDL』 (10) 第4章「180秒タイマを作る」(前編)

『FPGAボードで学ぶVerilog HDL』(CQ出版)の4章の
「180秒タイマを作る」を合成し、付属の FPGAボードで動かしてみた。
また、Verilog HDL を自分なりに書き換え、付属の FPGAボードで動作を確認した。

動作環境

  • Windows XP
  • ザイリンクス ISE WebPACK 9.1i
  • 『FPGAボードで学ぶVerilog HDL』付属FPGAボード
  • RS-232C ケーブル(ストレート全結線) オス、メスタイプ
  • 5.1V 400mAのACアダプター(KENWOOD ポータブルCDプレーヤー付属)


Verilog HDL 記述の動作確認


本の通りにソースコードの雛形を作成した後、Verilog のコードを付属 DVD に含まれていた
「\DATA\4\TIM180.v」に差し替えた。

本に書いてある通りにデフォルトのピン配置の制約ファイルを生成した後、
DVD に含まれていた「\DATA\4\TIM180.ucf」に差し替えた。

FPGA へのダウンロードに成功し、タイマ動作を確認できた。

リセットで180秒がセットされる
画像


スタート
画像


0秒
画像


タイマ終了
画像


Verilog HDL 記述の書き換え


いくつか気に食わない点があったので、Verilog HDL を自分なりに書き換えてみた。

書き換えた点
  • 前章までの説明にあったモジュール化がされていなかったので、モジュール化
  • FSM が分離されていなかったので、FSM をモジュール化
  • ダウンカウンターの3桁分の記述がべたに書かれていたので、モジュール化
  • SEG_O の最下位ビットを 1 から 0 に変更


fsm.v

module fsm(
clk,
reset,
start_i,
tim_zero,
start_o,
timeout
);

input clk;
input reset;
input start_i;
input tim_zero;
output reg start_o;
output reg timeout;

always @( posedge clk )
begin
if (reset == 1'b1) begin
start_o <= 1'b0;
timeout <= 1'b0;
end else begin
if (start_i == 1'b1) begin
start_o <= 1'b1;
end else begin
if (tim_zero == 1'b1) begin
timeout <= 1'b1;
end
end
end
end

endmodule


pulse1sec.v

module pulse1sec(
clk,
reset,
start,
sec1,
sec1_counter
);

input clk;
input reset;
input start;
output reg sec1;
output reg [31:0] sec1_counter;

parameter [31:0] param_1second = 32'h01F78A40;

always @(posedge clk)
begin
if (reset) begin
sec1_counter <= 32'b0;
sec1 <= 1'b0;
end else begin
if (start) begin
if (sec1_counter == param_1second) begin
sec1_counter <= 32'b0;
sec1 <= 1'b1;
end else begin
sec1_counter <= sec1_counter + 1;
sec1 <= 1'b0;
end
end
end
end

endmodule


down_counter.v

module down_counter(
clk,
reset,
enable1,
enable2,
timeout,
out,
borrow
);

parameter init = 0;
input clk;
input reset;
input enable1, enable2;
input timeout;
output reg [3:0] out;
output borrow;

always @(posedge clk) begin
if (reset == 1'b1) begin
out <= init;
end else begin
if (enable2 == 1'b1) begin
if (timeout == 1'b1) begin
out <= 4'b1111;
end else begin
if (enable1 == 1'b1) begin
if (out == 0) begin
out <= 9;
end else begin
out <= out - 1;
end
end
end
end
end
end

assign borrow = (enable1 == 1'b1) && (out == 0);

endmodule


oe_gen.v

module oe_gen(
clk,
OE_DIGIT
);

input clk;
output [1:0] OE_DIGIT;

reg [19:0] OEN_counter;

always @(posedge clk)
begin
OEN_counter <= OEN_counter + 1;
end

//assign OE_DIGIT = OEN_counter[19:18];
assign OE_DIGIT = OEN_counter[17:16];

endmodule


seg7enc.v(追記: 最上位ビットは全て 0 とするのが正しい 2009-04-17 Fri)

module seg7enc(
hex4_in,
seg7_out
);

input [3:0] hex4_in;
output reg [7:0] seg7_out;

always @*
begin
case (hex4_in)
4'b0000 : seg7_out <= 8'b10111111;
4'b0001 : seg7_out <= 8'b00000110;
4'b0010 : seg7_out <= 8'b11011011;
4'b0011 : seg7_out <= 8'b01001111;
4'b0100 : seg7_out <= 8'b11100110;
4'b0101 : seg7_out <= 8'b01101101;
4'b0110 : seg7_out <= 8'b11111101;
4'b0111 : seg7_out <= 8'b00100111;
4'b1000 : seg7_out <= 8'b11111111;
4'b1001 : seg7_out <= 8'b01101111;
default : seg7_out <= 8'b01000000;
endcase
end

endmodule

書くスペースがなくなったので、
「『FPGAボードで学ぶVerilog HDL』 (10) 第4章「180秒タイマを作る」(後編)」に続く

"『FPGAボードで学ぶVerilog HDL』 (10) 第4章「180秒タイマを作る」(前編)" へのコメントを書く

お名前
メールアドレス
ホームページアドレス
コメント