How To Write FSM in Verilog
How To Write FSM in Verilog
Introduction
Basically a FSM consists of combinational, sequential and output logic.
Combinational logic is used to decide the next state of the FSM, sequential
logic is used to store the current state of the FSM. The output logic is a
mixture of both combo and seq logic as shown in the figure below.
http://www.asic-world.com/tidbits/verilog_fsm.html
1/6
10/16/2014
Coding Methods
Now that we have described our state machine clearly, let's look at various
methods of coding a FSM.
We use one-hot encoding, and all the FSMs will have the following code in
common, so it will not be repeated again and again.
http://www.asic-world.com/tidbits/verilog_fsm.html
2/6
10/16/2014
reg [SIZE-1:0]
state
;// Seq part of the FSM
wire [SIZE-1:0]
next_state
;// combo part of FSM
//----------Code startes Here-----------------------assign next_state = fsm_function(state, req_0, req_1);
//----------Function for Combo Logic----------------function [SIZE-1:0] fsm_function;
input [SIZE-1:0] state ;
input
req_0 ;
input
req_1 ;
case(state)
IDLE : if (req_0 == 1'b1) begin
fsm_function = GNT0;
end else if (req_1 == 1'b1) begin
fsm_function= GNT1;
3/6
10/16/2014
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
http://www.asic-world.com/tidbits/verilog_fsm.html
4/6
10/16/2014
gnt_1
<= #1 1'b0;
end
GNT0
: begin
gnt_0
gnt_1
<= #1 1'b1;
<= #1 1'b0;
end
GNT1
: begin
gnt_0
gnt_1
<= #1 1'b0;
<= #1 1'b1;
end
default : begin
gnt_0
gnt_1
<= #1 1'b0;
<= #1 1'b0;
end
endcase
end
end // End Of Block OUTPUT_LOGIC
endmodule // End of Module arbiter
//====================================================
// This is FSM demo program using single always
// for both seq and combo logic
// Design Name : fsm_using_single_always
// File Name : fsm_using_single_always.v
//=====================================================
module fsm_using_single_always (
clock
, // clock
reset
, // Active high, syn reset
req_0
, // Request 0
req_1
, // Request 1
gnt_0
, // Grant 0
gnt_1
);
//=============Input Ports=============================
input clock,reset,req_0,req_1;
//=============Output Ports===========================
output gnt_0,gnt_1;
//=============Input ports Data Type===================
wire
clock,reset,req_0,req_1;
//=============Output Ports Data Type==================
reg
gnt_0,gnt_1;
//=============Internal Constants======================
parameter SIZE = 3
;
parameter IDLE = 3'b001,GNT0 = 3'b010,GNT1 = 3'b100 ;
//=============Internal Variables======================
reg [SIZE-1:0]
state
;// Seq part of the FSM
reg [SIZE-1:0]
next_state
;// combo part of FSM
//==========Code startes Here==========================
always @ (posedge clock)
begin : FSM
if (reset == 1'b1) begin
state <= #1 IDLE;
gnt_0 <= 0;
gnt_1 <= 0;
end else
case(state)
IDLE : if (req_0 == 1'b1) begin
state <= #1 GNT0;
gnt_0 <= 1;
end else if (req_1 == 1'b1) begin
gnt_1 <= 1;
state <= #1 GNT1;
end else begin
state <= #1 IDLE;
end
GNT0 : if (req_0 == 1'b1) begin
state <= #1 GNT0;
end else begin
http://www.asic-world.com/tidbits/verilog_fsm.html
5/6
10/16/2014
gnt_0
state
<= 0;
<= #1 IDLE;
end
: if (req_1 == 1'b1) begin
state <= #1 GNT1;
end else begin
gnt_1 <= 0;
state <= #1 IDLE;
end
default : state <= #1 IDLE;
endcase
end
GNT1
Copyright 1998-2014
Deepak Kumar Tala - All rights reserved
Do you have any Comment? mail me at:[email protected]
http://www.asic-world.com/tidbits/verilog_fsm.html
6/6