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

「『FPGAボードで学ぶVerilog HDL』 (11) 第4章「180秒タイマを作る」2」(前編)(後編)を秒数ではなく「分」と「秒」で表示するよう書き換えてみた。

画像


動作環境

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


Verilog HDL 記述の書き換え


以下のように書き換えた。

fsm.v

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

input clk;
input reset;
input start_i;
input tim_zero;
input pulse_1sec;
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 && pulse_1sec == 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_time.v

module down_time(
clk,
reset,
enable,
out
);

parameter init = 180;
input clk;
input reset;
input enable;
output reg [7:0] out;

always @(posedge clk) begin
if (reset == 1'b1) begin
out <= init;
end else begin
if (enable == 1'b1) begin
out <= out - 1;
end
end
end

endmodule


bin2dec3.v

module bin2dec3(
TIME,
timeout,
out,
remainder
);

input [7:0] TIME;
input timeout;
output [3:0] out;
output [7:0] remainder;

function [3:0] div60;
input [7:0] TIME;

if (TIME >= 180) div60 = 3;
else if (TIME >= 120) div60 = 2;
else if (TIME >= 60) div60 = 1;
else div60 = 0;
endfunction

function [7:0] mod60;
input [7:0] TIME;

if (TIME >= 180) mod60 = TIME - 180;
else if (TIME >= 120) mod60 = TIME - 120;
else if (TIME >= 60) mod60 = TIME - 60;
else mod60 = TIME;
endfunction

assign out = timeout ? 4'b1111 : div60(TIME);
assign remainder = mod60(TIME);

endmodule


bin2dec2.v

module bin2dec2(
TIME,
timeout,
out,
remainder
);

input [7:0] TIME;
input timeout;
output [3:0] out;
output [3:0] remainder;

function [3:0] div10;
input [7:0] TIME;

if (TIME >= 60) div10 = 6;
else if (TIME >= 50) div10 = 5;
else if (TIME >= 40) div10 = 4;
else if (TIME >= 30) div10 = 3;
else if (TIME >= 20) div10 = 2;
else if (TIME >= 10) div10 = 1;
else div10 = 0;
endfunction

function [3:0] mod10;
input [7:0] TIME;

if (TIME >= 60) mod10 = TIME - 60;
else if (TIME >= 50) mod10 = TIME - 50;
else if (TIME >= 40) mod10 = TIME - 40;
else if (TIME >= 30) mod10 = TIME - 30;
else if (TIME >= 20) mod10 = TIME - 20;
else if (TIME >= 10) mod10 = TIME - 10;
else mod10 = TIME;
endfunction

assign out = timeout ? 4'b1111 : div10(TIME);
assign remainder = mod10(TIME);

endmodule


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

この記事へのコメント

この記事へのトラックバック