make FpgaPath extend FleetTwoPath
[fleet.git] / src / edu / berkeley / fleet / fpga / main.v
1
2 module main
3  (sys_clk_pin,   /* 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   ddr1_Clk_pin,
11   ddr1_Clk_n_pin,
12   ddr1_Addr_pin,
13   ddr1_BankAddr_pin,
14   ddr1_CAS_n_pin,
15   ddr1_CE_pin,
16   ddr1_CS_n_pin,
17   ddr1_RAS_n_pin,
18   ddr1_WE_n_pin,
19   ddr1_DM_pin,
20   ddr1_DQS,
21   ddr1_DQ,
22
23   ddr2_ODT_pin,
24   ddr2_Clk_pin,
25   ddr2_Clk_n_pin,
26   ddr2_Addr_pin,
27   ddr2_BankAddr_pin,
28   ddr2_CAS_n_pin,
29   ddr2_CE_pin,
30   ddr2_CS_n_pin,
31   ddr2_RAS_n_pin,
32   ddr2_WE_n_pin,
33   ddr2_DM_pin,
34   ddr2_DQS,
35   ddr2_DQS_n,
36   ddr2_DQ,
37
38   vga_psave,
39   vga_hsync,
40   vga_vsync,
41   vga_sync,
42   vga_blank,
43   vga_r,
44   vga_g,
45   vga_b,
46   vga_clkout,
47
48   fpga_0_LEDs_8Bit_GPIO_IO_pin
49  );
50
51   input  sys_clk_pin;
52   input  sys_rst_pin;
53   input  fpga_0_RS232_Uart_1_ctsN_pin;
54   output fpga_0_RS232_Uart_1_rtsN_pin;
55   input  fpga_0_RS232_Uart_1_sin_pin;
56   output fpga_0_RS232_Uart_1_sout_pin;
57
58   output        ddr1_Clk_pin;
59   output        ddr1_Clk_n_pin;
60   output [12:0] ddr1_Addr_pin;
61   output [1:0]  ddr1_BankAddr_pin;
62   output        ddr1_CAS_n_pin;
63   output        ddr1_CE_pin;
64   output        ddr1_CS_n_pin;
65   output        ddr1_RAS_n_pin;
66   output        ddr1_WE_n_pin;
67   output [3:0]  ddr1_DM_pin;
68   inout  [3:0]  ddr1_DQS;
69   inout  [31:0] ddr1_DQ;
70
71   output        ddr2_ODT_pin;
72   output        ddr2_Clk_pin;
73   output        ddr2_Clk_n_pin;
74   output [12:0] ddr2_Addr_pin;
75   output [1:0]  ddr2_BankAddr_pin;
76   output        ddr2_CAS_n_pin;
77   output        ddr2_CE_pin;
78   output        ddr2_CS_n_pin;
79   output        ddr2_RAS_n_pin;
80   output        ddr2_WE_n_pin;
81   output [7:0]  ddr2_DM_pin;
82   inout  [7:0]  ddr2_DQS;
83   inout  [7:0]  ddr2_DQS_n;
84   inout  [63:0] ddr2_DQ;
85
86   wire  [31:0]  dram_addr;
87   wire          dram_addr_r;
88   wire          dram_addr_a;
89   wire          dram_isread;
90   wire  [63:0]  dram_write_data;
91   wire          dram_write_data_push;
92   wire          dram_write_data_full;
93   wire   [63:0] dram_read_data;
94   wire          dram_read_data_pop;
95   wire          dram_read_data_empty;
96   wire   [1:0]  dram_read_data_latency;
97
98   wire  [31:0]  ddr2_addr;
99   wire          ddr2_addr_r;
100   wire          ddr2_addr_a;
101   wire          ddr2_isread;
102   wire  [63:0]  ddr2_write_data;
103   wire          ddr2_write_data_push;
104   wire          ddr2_write_data_full;
105   wire   [63:0] ddr2_read_data;
106   wire          ddr2_read_data_pop;
107   wire          ddr2_read_data_empty;
108   wire   [1:0]  ddr2_read_data_latency;
109
110   output vga_psave;
111   output vga_hsync;
112   output vga_vsync;
113   output vga_sync;
114   output vga_blank;
115   output [7:0] vga_r;
116   output [7:0] vga_g;
117   output [7:0] vga_b;
118   output vga_clkout;
119
120   wire clk;
121   wire clk_fb;
122   wire clk50mhz;
123   wire clk_unbuffered;
124
125   wire vga_clk;
126   wire vga_clk_fb;
127   wire vga_clk_unbuffered;
128
129   output [7:0] fpga_0_LEDs_8Bit_GPIO_IO_pin;
130   wire [7:0] leds;
131   assign fpga_0_LEDs_8Bit_GPIO_IO_pin = ~leds;
132
133   assign leds[5:0] = dram_read_data[5:0];
134   assign leds[6] = dram_addr_r;
135   assign leds[7] = dram_addr_a;
136
137
138   //assign clk = sys_clk_pin;
139 /*
140   reg clk_unbuffered;
141   initial clk_unbuffered = 0;
142
143   always @(posedge sys_clk_pin) begin
144     clk_unbuffered = ~clk_unbuffered;
145   end
146
147   assign clk_unbuffered = sys_clk_pin;
148 */
149   BUFG GBUF_FOR_MUX_CLOCK (.I(clk_unbuffered), .O(clk));
150
151   DCM
152    #(
153       .CLKFX_MULTIPLY(4),
154       .CLKFX_DIVIDE(8),
155       .CLKIN_PERIOD("10 ns")
156     ) mydcm(
157       .CLKIN (sys_clk_pin),
158       .CLKFB(clk_fb),
159       .CLKFX (clk_unbuffered),
160       .CLK0  (clk_fb)
161     );
162
163   BUFG GBUF_FOR_VGA_CLOCK (.I(vga_clk_unbuffered), .O(vga_clk));
164   DCM  // 25Mhz VGA clock
165    #(
166       .CLKFX_MULTIPLY(4),
167       .CLKFX_DIVIDE(16),
168       .CLKIN_PERIOD("20 ns")
169     ) vgadcm (
170       .CLKIN (clk_unbuffered),
171       .CLKFB(vga_clk_fb),
172       .CLKFX (vga_clk_unbuffered),
173       .CLK0  (vga_clk_fb)
174     );
175
176
177   wire break_o;
178   wire break;
179   reg break_last;
180   reg send_k;                initial send_k = 0;
181   wire rst;
182   assign rst = sys_rst_pin;
183
184   wire       data_to_host_full;
185   wire       data_to_host_write_enable;
186   wire [7:0] data_to_host;
187
188   wire       data_to_fleet_empty;
189   wire       data_to_fleet_read_enable;
190   wire [7:0] data_to_fleet;
191
192   reg we;
193   reg re;
194   reg [7:0] data_to_host_r;
195   assign data_to_host = data_to_host_r;
196
197   wire ser_rst;
198   reg ser_rst_r;
199   initial ser_rst_r = 0;
200   assign ser_rst = (rst & ser_rst_r);
201
202   wire sio_ce;
203   wire sio_ce_x4;
204   //sasc_brg sasc_brg(clk, ser_rst, 8, 65, sio_ce, sio_ce_x4);
205   //  sasc_brg sasc_brg(clk, ser_rst, 3, 65, sio_ce, sio_ce_x4);
206   sasc_brg sasc_brg(sys_clk_pin, ser_rst, 8, 65, sio_ce, sio_ce_x4);
207   sasc_top sasc_top(clk, ser_rst,
208                     fpga_0_RS232_Uart_1_sin_pin,
209                     fpga_0_RS232_Uart_1_sout_pin,
210                     fpga_0_RS232_Uart_1_ctsN_pin,
211                     fpga_0_RS232_Uart_1_rtsN_pin, 
212                     sio_ce,
213                     sio_ce_x4,
214                     data_to_host,
215                     data_to_fleet,
216                     data_to_fleet_read_enable,
217                     data_to_host_write_enable,
218                     data_to_host_full,
219                     data_to_fleet_empty,
220                     break_o,
221                     break);
222
223    // break and break_o are _active high_
224    always @(posedge clk) break_last <= break_o;
225    assign break      =  break_o && !break_last;
226    assign break_done = !break_o &&  break_last;
227
228    reg data_to_host_write_enable_reg;
229    reg data_to_fleet_read_enable_reg;
230
231    reg root_out_a_reg;
232    reg root_in_r_reg;
233    reg [7:0] root_in_d_reg;
234    wire root_in_a;
235    wire root_in_r;
236    wire root_out_a;
237    wire root_out_r;
238    wire [7:0] root_in_d;
239    wire [7:0] root_out_d;
240
241    /*
242     * There is some very weird timing thing going on here; we need to
243     * hold reset low for more than one clock in order for it to propagate
244     * all the way to the docks.
245     */
246    root my_root(clk, rst && !break_o,
247                 root_in_r,  root_in_a,  root_in_d,
248                 root_out_r, root_out_a, root_out_d,
249                 dram_addr,
250                 dram_addr_r,
251                 dram_addr_a,
252                 dram_isread,
253                 dram_write_data,
254                 dram_write_data_push,
255                 dram_write_data_full,
256                 dram_read_data,
257                 dram_read_data_pop,
258                 dram_read_data_empty,
259                 dram_read_data_latency,
260                 vga_clk,
261                 vga_psave,
262                 vga_hsync,
263                 vga_vsync,
264                 vga_sync,
265                 vga_blank,
266                 vga_r,
267                 vga_g,
268                 vga_b,
269                 vga_clkout
270                );
271 /*
272    fifo4 my_root(clk, rst,
273                 root_in_r,  root_in_a,  root_in_d,
274                 root_out_r, root_out_a, data_to_host);
275 */
276    assign root_out_a                = root_out_a_reg;                
277    assign root_in_r                 = root_in_r_reg;
278    assign data_to_fleet_read_enable = data_to_fleet_read_enable_reg;
279    assign data_to_host_write_enable = data_to_host_write_enable_reg;
280    assign root_in_d                 = root_in_d_reg;
281
282    // fpga -> host
283    always @(posedge clk)
284    begin
285      if (break) begin
286        root_out_a_reg = 0;
287        data_to_host_write_enable_reg <= 0;
288
289      end else if (break_done) begin
290        data_to_host_write_enable_reg <= 1;
291        data_to_host_r <= 111;
292        send_k <= 1;
293      end else if (send_k) begin
294        data_to_host_write_enable_reg <= 1;
295        data_to_host_r <= 107;
296        send_k <= 0;
297
298
299      end else if (root_out_r && !root_out_a_reg && !data_to_host_full) begin
300        data_to_host_write_enable_reg <= 1;
301        data_to_host_r <= root_out_d;
302        root_out_a_reg = 1;
303      end else if (root_out_a_reg && !root_out_r) begin
304        data_to_host_write_enable_reg <= 0;
305        root_out_a_reg = 0;
306      end else begin
307        data_to_host_write_enable_reg <= 0;
308      end
309    end
310
311    // host -> fpga
312    always @(posedge clk)
313    begin
314      ser_rst_r <= 1;
315      if (break) begin
316        root_in_r_reg <= 0;
317        root_in_d_reg <= 0;
318        data_to_fleet_read_enable_reg <= 0;
319      end else
320   
321      if (!data_to_fleet_empty && !root_in_r_reg && !root_in_a) begin
322         root_in_r_reg <= 1;
323         root_in_d_reg <= data_to_fleet;
324         data_to_fleet_read_enable_reg <= 1;
325      end else begin
326        data_to_fleet_read_enable_reg <= 0;
327         if (root_in_a) begin
328           root_in_r_reg <= 0;
329         end
330      end
331    end
332
333    initial
334    begin
335      root_in_r_reg = 0;
336      root_in_d_reg = 0;
337      root_out_a_reg = 0;
338      data_to_fleet_read_enable_reg = 0;
339      data_to_host_write_enable_reg = 0;
340    end
341
342    ddr_ctrl 
343    #(
344         .clk_freq( 50000000 ),
345         .clk_multiply( 12 ),
346         .clk_divide( 5 ),
347         .phase_shift( 0 ),
348         .wait200_init( 26 )
349    ) ddr_ctrl (
350           .ddr_a( ddr1_Addr_pin ),
351           .ddr_clk( ddr1_Clk_pin ),
352           .ddr_clk_n( ddr1_Clk_n_pin ),
353           .ddr_ba( ddr1_BankAddr_pin ),
354           .ddr_dq( ddr1_DQ ),
355           .ddr_dm( ddr1_DM_pin ),
356           .ddr_dqs( ddr1_DQS ),
357           .ddr_cs_n( ddr1_CS_n_pin ),
358           .ddr_ras_n( ddr1_RAS_n_pin ),
359           .ddr_cas_n( ddr1_CAS_n_pin ),
360           .ddr_we_n( ddr1_WE_n_pin ),
361           .ddr_cke( ddr1_CE_pin ),
362    
363           .clk(clk),
364           .reset(!rst),
365           .rot(3'b100),
366    
367           .fml_wr(!dram_isread && dram_addr_r),
368           .fml_done(dram_addr_a),
369           .fml_rd( dram_isread && dram_addr_r),
370           .fml_adr(dram_addr),
371           .fml_din(dram_write_data),
372           .fml_dout(dram_read_data),
373 //          .fml_msk(16'hffff)
374           .fml_msk(16'h0)
375    );
376
377 /*
378    ddr2spa
379    #(
380 //    fabtech : integer := virtex4;
381 //    memtech : integer := 0;
382 //    rskew   : integer := 0;
383 //    hindex  : integer := 0;
384 //    haddr   : integer := 0;
385 //    hmask   : integer := 16#f00#;
386 //    ioaddr  : integer := 16#000#;
387 //    iomask  : integer := 16#fff#;
388     .mhz(100),
389     .clkmul(2),
390     .clkdiv(1),
391 //    col     : integer := 9;
392 //    Mbyte   : integer := 16;
393 //    rstdel  : integer := 200;
394     .pwron(1),
395     //oepol   : integer := 0;
396     .ddrbits(64),
397     .ahbfreq(50),
398     //readdly : integer := 1; -- 1 added read latency cycle
399     //ddelayb0 : integer := 0; -- Data delay value (0 - 63)
400     //ddelayb1 : integer := 0; -- Data delay value (0 - 63)
401     //ddelayb2 : integer := 0; -- Data delay value (0 - 63)
402     //ddelayb3 : integer := 0; -- Data delay value (0 - 63)
403     //ddelayb4 : integer := 0; -- Data delay value (0 - 63)
404     //ddelayb5 : integer := 0; -- Data delay value (0 - 63)
405     //ddelayb6 : integer := 0; -- Data delay value (0 - 63)
406     //ddelayb7 : integer := 0; -- Data delay value (0 - 63)
407     //numidelctrl : integer := 4; 
408     .norefclk(1)
409     //odten    : integer := 0 
410    ) ddr2_spa (
411     .rst_ddr(sys_rst_pin),
412     .rst_ahb(rst),
413     .clk_ddr(sys_clk_pin),
414     .clk_ahb(clk),
415     //clkref200  : in  std_logic;
416     //lock       : out std_ulogic;    -- DCM locked
417     .clkddro(ddr2_clock),
418     .clkddri(ddr2_clock),
419     //ahbsi      : in  ahb_slv_in_type;
420     //ahbso      : out ahb_slv_out_type;
421     .ddr_clk(ddr2_Clk_pin),
422     .ddr_clkb(ddr2_Clk_n_pin),
423     .ddr_cke(ddr2_CE_pin),
424     .ddr_csb(ddr2_CS_n_pin),
425     .ddr_web(ddr2_WE_n_pin),
426     .ddr_rasb(ddr2_RAS_n_pin),
427     .ddr_casb(ddr2_CAS_n_pin),
428     .ddr_dm(ddr2_DM_pin),
429     .ddr_dqs(ddr2_DQS),
430     .ddr_dqsn(ddr2_DQS_n),
431     .ddr_ad(ddr2_Addr_pin),
432     .ddr_ba(ddr2_BankAddr_pin),
433     .ddr_dq(ddr2_DQ),
434     .ddr_odt(ddr2_ODT_pin)
435    );
436 */
437 endmodule
438