371f27c4b97c61ec98e45142c98041ebbde989e7
[fleet.git] / src / edu / berkeley / fleet / fpga / main.v
1
2 module main
3  (sys_clk_pin,   /* I think this is 100Mhz */
4   sys_rst_pin,
5   fpga_0_RS232_Uart_1_ctsN_pin,
6   fpga_0_RS232_Uart_1_rtsN_pin,
7   fpga_0_RS232_Uart_1_sin_pin,
8   fpga_0_RS232_Uart_1_sout_pin
9  );
10
11   input  sys_clk_pin;
12   input  sys_rst_pin;
13   input  fpga_0_RS232_Uart_1_ctsN_pin;
14   output fpga_0_RS232_Uart_1_rtsN_pin;
15   input  fpga_0_RS232_Uart_1_sin_pin;
16   output fpga_0_RS232_Uart_1_sout_pin;
17
18   wire clk;
19   assign clk = sys_clk_pin;
20   wire break_o;
21   wire break;
22   reg break_last;
23   reg send_k;                initial send_k = 0;
24   wire rst;
25   assign rst = sys_rst_pin;
26
27   wire       data_to_host_full;
28   wire       data_to_host_write_enable;
29   wire [7:0] data_to_host;
30
31   wire       data_to_fleet_empty;
32   wire       data_to_fleet_read_enable;
33   wire [7:0] data_to_fleet;
34
35   reg we;
36   reg re;
37   reg [7:0] data_to_host_r;
38   assign data_to_host = data_to_host_r;
39
40   wire ser_rst;
41   reg ser_rst_r;
42   initial ser_rst_r = 0;
43   assign ser_rst = (rst & ser_rst_r);
44
45   wire sio_ce;
46   wire sio_ce_x4;
47   sasc_brg sasc_brg(clk, ser_rst, 10, 217, sio_ce, sio_ce_x4);
48   sasc_top sasc_top(clk, ser_rst,
49                     fpga_0_RS232_Uart_1_sin_pin,
50                     fpga_0_RS232_Uart_1_sout_pin,
51                     fpga_0_RS232_Uart_1_ctsN_pin,
52                     fpga_0_RS232_Uart_1_rtsN_pin, 
53                     sio_ce,
54                     sio_ce_x4,
55                     data_to_host,
56                     data_to_fleet,
57                     data_to_fleet_read_enable,
58                     data_to_host_write_enable,
59                     data_to_host_full,
60                     data_to_fleet_empty,
61                     break_o,
62                     break);
63
64    // break and break_o are _active high_
65    always @(posedge clk) break_last <= break_o;
66    assign break      =  break_o && !break_last;
67    assign break_done = !break_o &&  break_last;
68
69    reg data_to_host_write_enable_reg;
70    reg data_to_fleet_read_enable_reg;
71
72    reg root_out_a_reg;
73    reg root_in_r_reg;
74    reg [7:0] root_in_d_reg;
75    wire root_in_a;
76    wire root_in_r;
77    wire root_out_a;
78    wire root_out_r;
79    wire [7:0] root_in_d;
80    wire [7:0] root_out_d;
81
82
83    root my_root(clk, rst && !break, 
84                 root_in_r,  root_in_a,  root_in_d,
85                 root_out_r, root_out_a, root_out_d);
86 /*
87    fifo4 my_root(clk, rst,
88                 root_in_r,  root_in_a,  root_in_d,
89                 root_out_r, root_out_a, data_to_host);
90 */
91    assign root_out_a                = root_out_a_reg;                
92    assign root_in_r                 = root_in_r_reg;
93    assign data_to_fleet_read_enable = data_to_fleet_read_enable_reg;
94    assign data_to_host_write_enable = data_to_host_write_enable_reg;
95    assign root_in_d                 = root_in_d_reg;
96
97    // fpga -> host
98    always @(posedge clk)
99    begin
100      if (break) begin
101        root_out_a_reg = 0;
102        data_to_host_write_enable_reg <= 0;
103 /*
104      end else if (break_done) begin
105        data_to_host_write_enable_reg <= 1;
106        data_to_host_r <= 111;
107        send_k <= 1;
108      end else if (send_k) begin
109        data_to_host_write_enable_reg <= 1;
110        data_to_host_r <= 107;
111        send_k <= 0;
112 */
113
114      end else if (root_out_r && !root_out_a_reg && !data_to_host_full) begin
115        data_to_host_write_enable_reg <= 1;
116        data_to_host_r <= root_out_d;
117        root_out_a_reg = 1;
118      end else if (root_out_a_reg && !root_out_r) begin
119        data_to_host_write_enable_reg <= 0;
120        root_out_a_reg = 0;
121      end else begin
122        data_to_host_write_enable_reg <= 0;
123      end
124    end
125
126    // host -> fpga
127    always @(posedge clk)
128    begin
129      ser_rst_r <= 1;
130      if (break) begin
131        root_in_r_reg <= 0;
132        root_in_d_reg <= 0;
133        data_to_fleet_read_enable_reg <= 0;
134      end else
135   
136      if (!data_to_fleet_empty && !root_in_r_reg && !root_in_a) begin
137         root_in_r_reg <= 1;
138         root_in_d_reg <= data_to_fleet;
139         data_to_fleet_read_enable_reg <= 1;
140      end else begin
141        data_to_fleet_read_enable_reg <= 0;
142         if (root_in_a) begin
143           root_in_r_reg <= 0;
144         end
145      end
146    end
147
148    initial
149    begin
150      root_in_r_reg = 0;
151      root_in_d_reg = 0;
152      root_out_a_reg = 0;
153      data_to_fleet_read_enable_reg = 0;
154      data_to_host_write_enable_reg = 0;
155    end
156 endmodule
157
158