-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrouter_fsm.sv
109 lines (91 loc) · 3.09 KB
/
router_fsm.sv
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
module router_fsm(clock, resetn, pkt_valid, data_in, fifo_full, empty_0, empty_1, empty_2, soft_reset_0, soft_reset_1, soft_reset_2, parity_done,
low_packet_valid, write_enb_reg, detect_add, ld_state, laf_state, lfd_state, full_state, rst_int_reg, busy);
input clock, resetn, pkt_valid, fifo_full, empty_0, empty_1, empty_2, soft_reset_0, soft_reset_1, soft_reset_2, parity_done, low_packet_valid;
input [1:0] data_in;
output write_enb_reg, detect_add, ld_state, laf_state, lfd_state, full_state, rst_int_reg, busy;
parameter DECODE_ADDRESS = 3'b000;
parameter LOAD_FIRST_DATA = 3'b001;
parameter LOAD_DATA = 3'b010;
parameter FIFO_FULL_STATE = 3'b011;
parameter LOAD_AFTER_FULL = 3'b100;
parameter LOAD_PARITY = 3'b101;
parameter CHECK_PARITY_ERROR = 3'b110;
parameter WAIT_TILL_EMPTY = 3'b111;
reg [2:0] NS, PS;
// Present State Logic
always@(posedge clock)
begin
if(!resetn)
PS <= DECODE_ADDRESS;
else if (soft_reset_0 || soft_reset_1 || soft_reset_2)
PS <= DECODE_ADDRESS;
else
PS <= NS;
end
// Next State Logic
always@(*)
begin
case(PS)
DECODE_ADDRESS :
begin
if((pkt_valid && (data_in[1:0] == 2'b00) && empty_0)||(pkt_valid && (data_in[1:0] == 2'b01) && empty_1)||(pkt_valid && (data_in[1:0] == 2'b10) && empty_2))
NS = LOAD_FIRST_DATA;
else if((pkt_valid && (data_in[1:0] == 2'b00) && !empty_0)||(pkt_valid && (data_in[1:0] == 2'b01) && !empty_1)||(pkt_valid && (data_in[1:0] == 2'b10) && !empty_2))
NS = WAIT_TILL_EMPTY;
else
NS = DECODE_ADDRESS;
end
LOAD_FIRST_DATA : NS = LOAD_DATA;
LOAD_DATA :
begin
if(fifo_full)
NS = FIFO_FULL_STATE;
else if(!pkt_valid && !fifo_full)
NS = LOAD_PARITY;
else
NS = LOAD_DATA;
end
FIFO_FULL_STATE :
begin
if(!fifo_full)
NS = LOAD_AFTER_FULL;
else if(fifo_full)
NS = FIFO_FULL_STATE;
end
LOAD_AFTER_FULL :
begin
if(!parity_done && low_packet_valid)
NS = LOAD_PARITY;
else if(!parity_done && !low_packet_valid)
NS = LOAD_DATA;
else if(parity_done)
NS = DECODE_ADDRESS;
end
LOAD_PARITY : NS = CHECK_PARITY_ERROR;
CHECK_PARITY_ERROR :
begin
if(!fifo_full)
NS = DECODE_ADDRESS;
else
NS = FIFO_FULL_STATE;
end
WAIT_TILL_EMPTY :
begin
if((empty_0&&(data_in[1:0] == 2'b00)) || (empty_1&&(data_in[1:0] == 2'b01)) || (empty_2&&(data_in[1:0] == 2'b10)))
NS = LOAD_FIRST_DATA;
else
NS = WAIT_TILL_EMPTY;
end
default : NS = DECODE_ADDRESS;
endcase
end
// Output Logic
assign write_enb_reg = ((PS == LOAD_DATA)||(PS == LOAD_AFTER_FULL)||(PS == LOAD_PARITY))?1'b1:1'b0;
assign detect_add = (PS == DECODE_ADDRESS)?1'b1:1'b0;
assign ld_state = (PS == LOAD_DATA)?1'b1:1'b0;
assign laf_state = (PS == LOAD_AFTER_FULL)?1'b1:1'b0;
assign lfd_state = (PS == LOAD_FIRST_DATA)?1'b1:1'b0;
assign full_state = (PS == FIFO_FULL_STATE)?1'b1:1'b0;
assign rst_int_reg = (PS == CHECK_PARITY_ERROR)?1'b1:1'b0;
assign busy = (PS == DECODE_ADDRESS || PS == LOAD_DATA)?1'b0:1'b1;
endmodule