10. 10
状態遷移図から
Verilog-HDL (4)
• リセット後のレジスタの
初期値を記述
00 01 10
module DE0_TOP(CLOCK_50,
SW, BUTTON, LEDG );
input CLOCK_50;
input [9:0]SW;
input [2:0]BUTTON;
output [9:0]LEDG;
(途中テンプレート省略)
reg [1:0]LEDG;
reg [1:0]state;
always@( posedge CLOCK_50
or negedge SW[0]) begin
if( SW[0] == 1'b0)begin
LEDG <= 2'b00;
state <= 2'b00;
end else begin
end
end
endmodule
SW[0]==1
LEDG=2'b01
SW[0]==1
LEDG=2'b10
Reset
LEDG=2'b00
SW[0]==1
LEDG=2'b00
SW[0]==0
LEDG=2'b00
SW[0]==0
LEDG=2'b01
SW[0]==0
LEDG=2'b10
11. 11
状態遷移図から
Verilog-HDL (5)
• case文を使って状態を記述
defaultを忘れずに!
00 01 10
module DE0_TOP(CLOCK_50,
SW, BUTTON, LEDG );
input CLOCK_50;
input [9:0]SW;
input [2:0]BUTTON;
output [9:0]LEDG;
(途中テンプレート省略)
reg [1:0]LEDG;
reg [1:0]state;
always@( posedge CLOCK_50
or negedge SW[0]) begin
if( SW[0] == 1'b0)begin
LEDG <= 2'b00;
state <= 2'b00;
end else begin
case( state)
2'b00: begin
end
2'b01: begin
end
2'b10: begin
end
default: begin
end
endcase
end
end
endmodule
SW[0]==1
LEDG=2'b01
SW[0]==1
LEDG=2'b10
Reset
LEDG=2'b00
SW[0]==1
LEDG=2'b00
SW[0]==0
LEDG=2'b00
SW[0]==0
LEDG=2'b01
SW[0]==0
LEDG=2'b10
12. 12
状態遷移図から
Verilog-HDL (6)
• if文を使って状態遷移を記述
00 01 10
module DE0_TOP(CLOCK_50,
SW, BUTTON, LEDG );
input CLOCK_50;
input [9:0]SW;
input [2:0]BUTTON;
output [9:0]LEDG;
(途中テンプレート省略)
reg [1:0]LEDG;
reg [1:0]state;
always@( posedge CLOCK_50
or negedge SW[0]) begin
if( SW[0] == 1'b0)begin
LEDG <= 2'b00;
state <= 2'b00;
end else begin
case( state)
2'b00: begin
if( SW[0] == 1'b1)begin
state <= 2'b01;
end else begin
state <= state;
end
end
2'b01: begin
if( SW[0] == 1'b1)begin
state <= 2'b10;
end else begin
state <= state;
end
end
2'b10: begin
if( SW[0] == 1'b1)begin
state <= 2'b00;
end else begin
state <= state;
end
end
default: begin
state <= 2'b00;
end
endcase
end
end
endmodule
SW[0]==1
LEDG=2'b00
SW[0]==0
LEDG=2'b00
SW[0]==0
LEDG=2'b01
SW[0]==0
LEDG=2'b10
SW[0]==1
LEDG=2'b01
SW[0]==1
LEDG=2'b10
Reset
LEDG=2'b00
13. 13
状態遷移図から
Verilog-HDL (7)
• 状態遷移時の出力を記述
00 01 10
module DE0_TOP(CLOCK_50,
SW, BUTTON, LEDG );
input CLOCK_50;
input [9:0]SW;
input [2:0]BUTTON;
output [9:0]LEDG;
(途中テンプレート省略)
reg [1:0]LEDG;
reg [1:0]state;
always@( posedge CLOCK_50
or negedge SW[0]) begin
if( SW[0] == 1'b0)begin
LEDG <= 2'b00;
state <= 2'b00;
end else begin
if( SW[0] == 1'b1)begin
state <= 2'b01;
LEDG <= 2'b01;
end else begin
state <= state;
LEDG <= 2'b00;
end
end
2'b01: begin
if( SW[0] == 1'b1)begin
state <= 2'b10;
LEDG <= 2'b10;
end else begin
state <= state;
LEDG <= 2'b01;
end
end
2'b10: begin
if( SW[0] == 1'b1)begin
state <= 2'b00;
LEDG <= 2'b00;
end else begin
state <= state;
LEDG <= 2'b10;
end
end
default: begin
state <= 2'b00;
LEDG <= 2'b00;
end
endcase
end
end
endmodule
SW[0]==1
LEDG=2'b01
SW[0]==1
LEDG=2'b10
Reset
LEDG=2'b00
SW[0]==1
LEDG=2'b00
SW[0]==0
LEDG=2'b00
SW[0]==0
LEDG=2'b01
SW[0]==0
LEDG=2'b10