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

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

画像


Verilog HDL 記述の書き換え(続き)


seg7out.v

module seg7out(
OE_DIGIT,
TIM_1,
TIM_2,
TIM_3,
SEG_O
);

input [1:0] OE_DIGIT;
input [3:0] TIM_1, TIM_2, TIM_3;
output [7:0] SEG_O;

reg [3:0] data;
wire [7:0] seg7out;

//always @(OE_DIGIT)
always @*
begin
case (OE_DIGIT)
2'b00 : data <= TIM_1;
2'b01 : data <= TIM_2;
2'b10 : data <= TIM_3;
default : data <= 4'b1111;
endcase
end

seg7enc I_seg7enc(
.hex4_in(data),
.seg7_out(seg7out)
);

assign SEG_O = ~seg7out;

endmodule


seg7en.v(function 文で書ける?)

module seg7en(
OE_DIGIT,
SEGEN_O
);

input [1:0] OE_DIGIT;
output [3:0] SEGEN_O;

reg [3:0] SEGEN;

always @(OE_DIGIT)
begin
case (OE_DIGIT)
2'b00 : SEGEN <= 4'b0001;
2'b01 : SEGEN <= 4'b0010;
2'b10 : SEGEN <= 4'b0100;
default : SEGEN <= 4'b1000;
endcase
end

assign SEGEN_O = ~SEGEN;

endmodule


トップモジュール TIM180.v

module TIM180(
CLK_I,
SW_START_I,
SW_RESET_I,

SEG_O,

DPOEN_O,

LED1_O,
LED2_O,
LED3_O,
LED4_O
);

input CLK_I;
input SW_START_I;
input SW_RESET_I;

output [7:0] SEG_O;

output [3:0] DPOEN_O;

output LED1_O;
output LED2_O;
output LED3_O;
output LED4_O;

wire [31:0] sec1_counter;
wire [3:0] TIM_3, TIM_2, TIM_1;
wire TIM_ZERO;
wire pulse_1sec;
wire [1:0] OE_DIGIT;
wire TIM_START, TIMEOUT;
wire borrow_1, borrow_2, borrow_3;

fsm I_fsm(
.clk(CLK_I),
.reset(SW_RESET_I),
.start_i(SW_START_I),
.tim_zero(TIM_ZERO),
.start_o(TIM_START),
.timeout(TIMEOUT)
);

assign TIM_ZERO = (TIM_1 == 0) && (TIM_2 == 0) && (TIM_3 == 0);

pulse1sec I_pulse1sec(
.clk(CLK_I),
.reset(SW_RESET_I),
.start(TIM_START),
.sec1(pulse_1sec),
.sec1_counter(sec1_counter)
);

down_counter #0 I_digit1(
.clk(CLK_I),
.reset(SW_RESET_I),
.enable1(1'b1),
.enable2(pulse_1sec),
.timeout(TIMEOUT),
.out(TIM_1),
.borrow(borrow_1)
);

down_counter #8 I_digit10(
.clk(CLK_I),
.reset(SW_RESET_I),
.enable1(borrow_1),
.enable2(pulse_1sec),
.timeout(TIMEOUT),
.out(TIM_2),
.borrow(borrow_2)
);

down_counter #1 I_digit100(
.clk(CLK_I),
.reset(SW_RESET_I),
.enable1(borrow_2),
.enable2(pulse_1sec),
.timeout(TIMEOUT),
.out(TIM_3),
.borrow(borrow_3)
);

oe_gen I_oe_gen(
.clk(CLK_I),
.OE_DIGIT(OE_DIGIT)
);

seg7out I_seg7out(
.OE_DIGIT(OE_DIGIT),
.TIM_1(TIM_1),
.TIM_2(TIM_2),
.TIM_3(TIM_3),
.SEG_O(SEG_O)
);

seg7en I_seg7en(
.OE_DIGIT(OE_DIGIT),
.SEGEN_O(DPOEN_O)
);

assign LED1_O = (TIMEOUT == 1'b0) ? sec1_counter[21] : sec1_counter[24];
assign LED2_O = (TIMEOUT == 1'b0) ? sec1_counter[22] : sec1_counter[24];
assign LED3_O = (TIMEOUT == 1'b0) ? sec1_counter[23] : sec1_counter[24];
assign LED4_O = (TIMEOUT == 1'b0) ? sec1_counter[24] : sec1_counter[24];

endmodule


制約ファイル
NET "CLK_I" LOC = "P63" ;

NET "LED1_O" LOC = "P17" ;
NET "LED2_O" LOC = "P18" ;
NET "LED3_O" LOC = "P22" ;
NET "LED4_O" LOC = "P23" ;

NET "SW_RESET_I" LOC = "P30" ;
NET "SW_START_I" LOC = "P27" ;

NET "DPOEN_O<0>" LOC = "P86";
NET "DPOEN_O<1>" LOC = "P85";
NET "DPOEN_O<2>" LOC = "P3";
NET "DPOEN_O<3>" LOC = "P2";

NET "SEG_O<0>" LOC = "P94";
NET "SEG_O<1>" LOC = "P92";
NET "SEG_O<2>" LOC = "P98";
NET "SEG_O<3>" LOC = "P71";
NET "SEG_O<4>" LOC = "P70";
NET "SEG_O<5>" LOC = "P90";
NET "SEG_O<6>" LOC = "P91";
NET "SEG_O<7>" LOC = "P95";


合成回路の違い


どこで違いが出ているのか分からないが、合成回路量に多少違いがあった。

元の Verilog HDL を合成したもの
画像


書き換えた Verilog HDL を合成したもの
画像

まとめ

  • 『FPGAボードで学ぶVerilog HDL』(CQ出版)の第4章「180秒タイマを作る」を合成し、付属の FPGAボードでタイマ動作を確認した。
  • いくつか気に食わない点があったので、Verilog HDL を自分なりに書き換え、同様に動作を確認した。

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

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