source: vis_dev/vis-2.1/examples/crd/crd.v @ 15

Last change on this file since 15 was 11, checked in by cecile, 13 years ago

Add vis

File size: 3.9 KB
RevLine 
[11]1// The crossroads
2// Originally written by R. P. Kurshan
3// Translated by Rajeev K. Ranjan
4
5typedef enum {no_cars, car_waiting, cars_passing} traffic_status;
6typedef enum {stop, go, slow} traffic_signal;
7typedef enum {go_slow, go_A, go_B} police_signal;
8typedef enum {STOPPED_init, STOPPED, GO_init, GO}       car_status;
9typedef enum {go_A_init, go_A_state, go_B_init, go_B_state} police_state;
10
11
12module environment(clk, status_A, test);
13input clk;
14output status_A;
15output test;
16
17traffic_signal wire signal_A, signal_B;
18traffic_status wire status_A, status_B;
19police_signal wire signal;
20wire test;
21
22POLICEMAN police (clk, status_A, status_B, signal);
23
24assign signal_A = (signal == go_A) ? go : (signal == go_slow) ? slow : stop;
25assign signal_B = (signal == go_B) ? go : (signal == go_slow) ? slow : stop;
26
27
28ROAD road_A (clk, signal_A, status_A);
29ROAD road_B (clk, signal_B, status_B);
30assign test = ((status_A == cars_passing) && (status_B == cars_passing)) ? 0 :1;
31
32collision col(clk, status_A, status_B);
33starvation starv(clk,status_A);
34
35endmodule
36
37
38module POLICEMAN(clk, status_A, status_B, signal);
39input clk;
40input status_A, status_B;
41output signal;
42traffic_status wire status_A, status_B;
43police_signal wire signal;
44police_state reg state;
45wire r_state, ri_state;
46
47assign  ri_state = $ND(0,1);
48        initial
49                begin
50                case(ri_state)
51                0:state = go_A_init;
52                1:state = go_B_init;
53                endcase
54        end
55
56        assign signal = ((state == go_A_init) || (state == go_B_init)) ? go_slow : 
57                                        (state == go_A_state) ? go_A : go_B;
58        assign r_state = $ND(0,1);
59        always @(posedge clk) begin
60                case(state)
61                        go_A_init: begin
62                                        case(r_state)
63                                        0:state = go_A_init;
64                                        1:state = go_A_state;
65                                        endcase
66                                   end 
67                        go_B_init: begin
68                                        case(r_state)
69                                        0:state = go_B_init;
70                                        1:state = go_B_state;
71                                        endcase
72                                   end 
73                //      go_A_state:
74                //                 if (status_B == car_waiting)
75                //                      state = go_B_init;
76                //      go_B_state:
77                //                 if (status_A == car_waiting)
78                //                      state = go_A_init;
79
80           default:
81                                begin
82                                if ((signal == go_A) && (status_B == car_waiting))
83                                        state = go_B_init;
84                                else
85                                if ((signal == go_B) && (status_A == car_waiting))
86                                        state = go_A_init;
87                                end
88                endcase
89        end
90endmodule
91                       
92
93module ROAD(clk, signal, status);
94input clk;
95input signal;
96output status;
97traffic_signal wire signal;
98traffic_status  wire status;
99car_status reg state;
100wire r_state;
101
102        initial state = STOPPED_init;
103       
104        assign status = (state == STOPPED_init) ? no_cars:
105                         (state == STOPPED) ? car_waiting :
106                         (state == GO_init) ? cars_passing:
107                         (state == GO) ? no_cars: no_cars;
108        assign r_state = $ND(0,1);
109
110        always @(posedge clk) begin
111                case(state)
112                        STOPPED_init:
113                                begin
114                                        case(r_state)
115                                        0:state = STOPPED_init;
116                                        1:state = STOPPED;
117                                        endcase
118                                end
119
120                        STOPPED:
121                                begin
122                                        if (signal == go)
123                                        state = GO_init;
124                                end
125                        GO_init:
126                                begin
127                                        if (signal == stop)
128                                           state = STOPPED_init;
129                                        else
130                                           begin
131                                                case(r_state)
132                                                0:state = GO_init;
133                                                1:state = GO;
134                                                endcase
135                                           end
136                                end
137                        GO:
138                                state = STOPPED_init;
139                        default: ;
140                endcase
141        end
142endmodule
143
144typedef enum {GOOD, BAD} status;
145
146module collision(clk, status_A, status_B);
147input clk, status_A, status_B;
148traffic_status wire status_A, status_B;
149status reg state;
150
151       initial state = GOOD;
152       always @(posedge clk) begin
153              case(state)
154                GOOD: 
155                      if ((status_A == cars_passing) && (status_B == cars_passing))
156                             state = BAD;
157               endcase
158        end
159endmodule
160
161                       
162typedef enum {OK, NOT_OK} prop1_status;
163
164module starvation(clk, stat);
165input clk, stat;
166traffic_status wire stat;
167prop1_status reg state;
168
169initial state = OK;
170always @(posedge clk) begin
171       case(state)
172                OK:
173                    begin 
174                    if (stat == car_waiting)
175                       state = NOT_OK;
176                    end
177                NOT_OK:
178                    begin
179                    if (stat == cars_passing)
180                       state = OK;
181                    end
182                default:;
183
184        endcase
185end
186endmodule
187                       
Note: See TracBrowser for help on using the repository browser.