File tree Expand file tree Collapse file tree 5 files changed +2425
-0
lines changed
Expand file tree Collapse file tree 5 files changed +2425
-0
lines changed Original file line number Diff line number Diff line change 1+
2+ `define WIDTH 32
3+ module fsm (
4+ clk,
5+ reset_,
6+ in_A,
7+ in_B,
8+ fsm_out
9+ );
10+ parameter WIDTH = `WIDTH ;
11+ parameter FSM_WIDTH = 3 ;
12+
13+ parameter S0 = 3'b000 ;
14+ parameter S1 = 3'b001 ;
15+ parameter S2 = 3'b010 ;
16+ parameter S3 = 3'b011 ;
17+ parameter S4 = 3'b100 ;
18+ parameter S5 = 3'b101 ;
19+ parameter S6 = 3'b110 ;
20+ parameter S7 = 3'b111 ;
21+
22+ input clk;
23+ input reset_;
24+ input [WIDTH - 1 : 0 ] in_A;
25+ input [WIDTH - 1 : 0 ] in_B;
26+ output reg [FSM_WIDTH - 1 : 0 ] fsm_out;
27+ reg [FSM_WIDTH - 1 : 0 ] state, next_state;
28+ always_ff @ (posedge clk or negedge reset_) begin
29+ if (! reset_) begin
30+ state <= S0 ;
31+ end else begin
32+ state <= next_state;
33+ end
34+ end
35+ always_comb begin
36+ case (state)
37+ S0 : begin
38+ if (~^ ((in_A || in_B))) begin
39+ next_state = S1 ;
40+ end
41+ else if (((in_A ^ in_B) != 'd1 )) begin
42+ next_state = S2 ;
43+ end
44+ else if (((in_A != 'd1 ) != 'd0 )) begin
45+ next_state = S6 ;
46+ end
47+ else begin
48+ next_state = S7 ;
49+ end
50+ end
51+ S1 : begin
52+ if ((in_A && (in_B || in_A))) begin
53+ next_state = S2 ;
54+ end
55+ else if ((in_B ^ & (in_A))) begin
56+ next_state = S7 ;
57+ end
58+ else begin
59+ next_state = S5 ;
60+ end
61+ end
62+ S2 : begin
63+ next_state = S0 ;
64+ end
65+ S3 : begin
66+ if (((in_B || in_A) && in_B)) begin
67+ next_state = S0 ;
68+ end
69+ else if (((in_A || in_B) == 'd0 )) begin
70+ next_state = S5 ;
71+ end
72+ else begin
73+ next_state = S7 ;
74+ end
75+ end
76+ S4 : begin
77+ if ((in_A && (in_B ^ in_A))) begin
78+ next_state = S3 ;
79+ end
80+ else if (((in_B <= 'd0 ) && (in_A != 'd1 ))) begin
81+ next_state = S6 ;
82+ end
83+ else if (((in_B <= 'd0 ) ^ in_A)) begin
84+ next_state = S7 ;
85+ end
86+ else begin
87+ next_state = S2 ;
88+ end
89+ end
90+ S5 : begin
91+ next_state = S4 ;
92+ end
93+ S6 : begin
94+ if (((in_B == in_A) != 'd1 )) begin
95+ next_state = S1 ;
96+ end
97+ else if ((in_A && in_B)) begin
98+ next_state = S5 ;
99+ end
100+ else begin
101+ next_state = S2 ;
102+ end
103+ end
104+ S7 : begin
105+ if ((in_A != 'd0 )) begin
106+ next_state = S2 ;
107+ end
108+ else begin
109+ next_state = S0 ;
110+ end
111+ end
112+ endcase
113+ end
114+ endmodule
Original file line number Diff line number Diff line change 1+
2+ `define WIDTH 32
3+ module fsm_tb(
4+ clk,
5+ reset_,
6+ in_A,
7+ in_B,
8+ fsm_out
9+ );
10+ parameter WIDTH = `WIDTH;
11+ parameter FSM_WIDTH = 3;
12+
13+ parameter S0 = 3'b000;
14+ parameter S1 = 3'b001;
15+ parameter S2 = 3'b010;
16+ parameter S3 = 3'b011;
17+ parameter S4 = 3'b100;
18+ parameter S5 = 3'b101;
19+ parameter S6 = 3'b110;
20+ parameter S7 = 3'b111;
21+
22+ input clk;
23+ input reset_;
24+ input [WIDTH-1:0] in_A;
25+ input [WIDTH-1:0] in_B;
26+ input reg [FSM_WIDTH-1:0] fsm_out;
27+ wire tb_reset;
28+ assign tb_reset = (reset_ == 1'b0);
29+
30+ endmodule
31+ bind fsm fsm_tb #(
32+ .WIDTH(WIDTH)
33+ ) fsm_tb_inst (.*);
34+
You can’t perform that action at this time.
0 commit comments