move main.ut into Makefile
[fleet.git] / src / edu / berkeley / fleet / fpga / main.v
index 9c6fcb8..51eed13 100644 (file)
@@ -1,11 +1,36 @@
 
 module main
- (sys_clk_pin,   /* I think this is 100Mhz */
+ (sys_clk_pin,   /* 100Mhz */
   sys_rst_pin,
   fpga_0_RS232_Uart_1_ctsN_pin,
   fpga_0_RS232_Uart_1_rtsN_pin,
   fpga_0_RS232_Uart_1_sin_pin,
-  fpga_0_RS232_Uart_1_sout_pin
+  fpga_0_RS232_Uart_1_sout_pin,
+
+  ddr1_Clk_pin,
+  ddr1_Clk_n_pin,
+  ddr1_Addr_pin,
+  ddr1_BankAddr_pin,
+  ddr1_CAS_n_pin,
+  ddr1_CE_pin,
+  ddr1_CS_n_pin,
+  ddr1_RAS_n_pin,
+  ddr1_WE_n_pin,
+  ddr1_DM_pin,
+  ddr1_DQS,
+  ddr1_DQ,
+
+  vga_psave,
+  vga_hsync,
+  vga_vsync,
+  vga_sync,
+  vga_blank,
+  vga_r,
+  vga_g,
+  vga_b,
+  vga_clkout,
+
+  fpga_0_LEDs_8Bit_GPIO_IO_pin
  );
 
   input  sys_clk_pin;
@@ -15,9 +40,90 @@ module main
   input  fpga_0_RS232_Uart_1_sin_pin;
   output fpga_0_RS232_Uart_1_sout_pin;
 
+  output        ddr1_Clk_pin;
+  output        ddr1_Clk_n_pin;
+  output [12:0] ddr1_Addr_pin;
+  output [1:0]  ddr1_BankAddr_pin;
+  output        ddr1_CAS_n_pin;
+  output        ddr1_CE_pin;
+  output        ddr1_CS_n_pin;
+  output        ddr1_RAS_n_pin;
+  output        ddr1_WE_n_pin;
+  output [3:0]  ddr1_DM_pin;
+  inout  [3:0]  ddr1_DQS;
+  inout  [31:0] ddr1_DQ;
+
+  wire  [31:0]  dram_addr;
+  wire          dram_addr_r;
+  wire          dram_addr_a;
+  wire          dram_isread;
+  wire  [63:0]  dram_write_data;
+  wire          dram_write_data_push;
+  wire          dram_write_data_full;
+  wire   [63:0] dram_read_data;
+  wire          dram_read_data_pop;
+  wire          dram_read_data_empty;
+  wire   [1:0]  dram_read_data_latency;
+
+  output vga_psave;
+  output vga_hsync;
+  output vga_vsync;
+  output vga_sync;
+  output vga_blank;
+  output [7:0] vga_r;
+  output [7:0] vga_g;
+  output [7:0] vga_b;
+  output vga_clkout;
+
   wire clk;
-  assign clk = sys_clk_pin;
+  wire clk_fb;
+  wire clk50mhz;
+  wire clk_unbuffered;
+
+  wire vga_clk;
+  wire vga_clk_fb;
+  wire vga_clk_unbuffered;
+
+  output [7:0] fpga_0_LEDs_8Bit_GPIO_IO_pin;
+  wire [7:0] leds;
+  assign fpga_0_LEDs_8Bit_GPIO_IO_pin = ~leds;
+
+  assign leds[5:0] = dram_read_data[5:0];
+  assign leds[6] = dram_addr_r;
+  assign leds[7] = dram_addr_a;
+
+  BUFG GBUF_FOR_MUX_CLOCK (.I(clk_unbuffered), .O(clk));
+
+  DCM
+   #(
+      .CLKFX_MULTIPLY(4),
+      .CLKFX_DIVIDE(8),
+      .CLKIN_PERIOD("10 ns")
+    ) mydcm(
+      .CLKIN (sys_clk_pin),
+      .CLKFB(clk_fb),
+      .CLKFX (clk_unbuffered),
+      .CLK0  (clk_fb)
+    );
+
+  BUFG GBUF_FOR_VGA_CLOCK (.I(vga_clk_unbuffered), .O(vga_clk));
+  DCM  // 25Mhz VGA clock
+   #(
+      .CLKFX_MULTIPLY(4),
+      .CLKFX_DIVIDE(16),
+      .CLKIN_PERIOD("20 ns")
+    ) vgadcm (
+      .CLKIN (clk_unbuffered),
+      .CLKFB(vga_clk_fb),
+      .CLKFX (vga_clk_unbuffered),
+      .CLK0  (vga_clk_fb)
+    );
+
+
+  wire break_o;
   wire break;
+  reg break_last;
+  reg send_k;                initial send_k = 0;
   wire rst;
   assign rst = sys_rst_pin;
 
@@ -32,15 +138,17 @@ module main
   reg we;
   reg re;
   reg [7:0] data_to_host_r;
+  assign data_to_host = data_to_host_r;
 
   wire ser_rst;
   reg ser_rst_r;
   initial ser_rst_r = 0;
-  assign ser_rst = rst & ser_rst_r;
+  assign ser_rst = (rst & ser_rst_r);
 
   wire sio_ce;
   wire sio_ce_x4;
-  sasc_brg sasc_brg(clk, ser_rst, 10, 217, sio_ce, sio_ce_x4);
+
+  sasc_brg sasc_brg(sys_clk_pin, ser_rst, 8, 65, sio_ce, sio_ce_x4);
   sasc_top sasc_top(clk, ser_rst,
                     fpga_0_RS232_Uart_1_sin_pin,
                     fpga_0_RS232_Uart_1_sout_pin,
@@ -54,8 +162,14 @@ module main
                     data_to_host_write_enable,
                     data_to_host_full,
                     data_to_fleet_empty,
+                    break_o,
                     break);
 
+   // break and break_o are _active high_
+   always @(posedge clk) break_last <= break_o;
+   assign break      =  break_o && !break_last;
+   assign break_done = !break_o &&  break_last;
+
    reg data_to_host_write_enable_reg;
    reg data_to_fleet_read_enable_reg;
 
@@ -67,16 +181,39 @@ module main
    wire root_out_a;
    wire root_out_r;
    wire [7:0] root_in_d;
+   wire [7:0] root_out_d;
 
-
-   root my_root(clk, rst && !break, 
-                root_in_r,  root_in_a,  root_in_d,
-                root_out_r, root_out_a, data_to_host);
-/*
-   fifo4 my_root(clk, rst,
+   /*
+    * There is some very weird timing thing going on here; we need to
+    * hold reset low for more than one clock in order for it to propagate
+    * all the way to the docks.
+    */
+   root my_root(clk, rst && !break_o,
                 root_in_r,  root_in_a,  root_in_d,
-                root_out_r, root_out_a, data_to_host);
-*/
+                root_out_r, root_out_a, root_out_d,
+                dram_addr,
+                dram_addr_r,
+                dram_addr_a,
+                dram_isread,
+                dram_write_data,
+                dram_write_data_push,
+                dram_write_data_full,
+                dram_read_data,
+                dram_read_data_pop,
+                dram_read_data_empty,
+                dram_read_data_latency,
+                vga_clk,
+                vga_psave,
+                vga_hsync,
+                vga_vsync,
+                vga_sync,
+                vga_blank,
+                vga_r,
+                vga_g,
+                vga_b,
+                vga_clkout
+               );
+
    assign root_out_a                = root_out_a_reg;                
    assign root_in_r                 = root_in_r_reg;
    assign data_to_fleet_read_enable = data_to_fleet_read_enable_reg;
@@ -86,12 +223,29 @@ module main
    // fpga -> host
    always @(posedge clk)
    begin
-     data_to_host_write_enable_reg = 0;
-     if (root_out_r && !root_out_a_reg && !data_to_host_full) begin
-       data_to_host_write_enable_reg = 1;
+     if (break) begin
+       root_out_a_reg = 0;
+       data_to_host_write_enable_reg <= 0;
+
+     end else if (break_done) begin
+       data_to_host_write_enable_reg <= 1;
+       data_to_host_r <= 111;
+       send_k <= 1;
+     end else if (send_k) begin
+       data_to_host_write_enable_reg <= 1;
+       data_to_host_r <= 107;
+       send_k <= 0;
+
+
+     end else if (root_out_r && !root_out_a_reg && !data_to_host_full) begin
+       data_to_host_write_enable_reg <= 1;
+       data_to_host_r <= root_out_d;
        root_out_a_reg = 1;
      end else if (root_out_a_reg && !root_out_r) begin
+       data_to_host_write_enable_reg <= 0;
        root_out_a_reg = 0;
+     end else begin
+       data_to_host_write_enable_reg <= 0;
      end
    end
 
@@ -99,14 +253,20 @@ module main
    always @(posedge clk)
    begin
      ser_rst_r <= 1;
-     data_to_fleet_read_enable_reg = 0;
+     if (break) begin
+       root_in_r_reg <= 0;
+       root_in_d_reg <= 0;
+       data_to_fleet_read_enable_reg <= 0;
+     end else
+  
      if (!data_to_fleet_empty && !root_in_r_reg && !root_in_a) begin
-        root_in_r_reg = 1;
-        root_in_d_reg = data_to_fleet;
-        data_to_fleet_read_enable_reg = 1;
+        root_in_r_reg <= 1;
+        root_in_d_reg <= data_to_fleet;
+        data_to_fleet_read_enable_reg <= 1;
      end else begin
+       data_to_fleet_read_enable_reg <= 0;
         if (root_in_a) begin
-          root_in_r_reg = 0;
+          root_in_r_reg <= 0;
         end
      end
    end
@@ -119,6 +279,40 @@ module main
      data_to_fleet_read_enable_reg = 0;
      data_to_host_write_enable_reg = 0;
    end
-endmodule
 
+   ddr_ctrl 
+   #(
+       .clk_freq( 50000000 ),
+       .clk_multiply( 12 ),
+       .clk_divide( 5 ),
+       .phase_shift( 0 ),
+       .wait200_init( 26 )
+   ) ddr_ctrl (
+          .ddr_a( ddr1_Addr_pin ),
+          .ddr_clk( ddr1_Clk_pin ),
+          .ddr_clk_n( ddr1_Clk_n_pin ),
+          .ddr_ba( ddr1_BankAddr_pin ),
+          .ddr_dq( ddr1_DQ ),
+          .ddr_dm( ddr1_DM_pin ),
+          .ddr_dqs( ddr1_DQS ),
+          .ddr_cs_n( ddr1_CS_n_pin ),
+          .ddr_ras_n( ddr1_RAS_n_pin ),
+          .ddr_cas_n( ddr1_CAS_n_pin ),
+          .ddr_we_n( ddr1_WE_n_pin ),
+          .ddr_cke( ddr1_CE_pin ),
+   
+          .clk(clk),
+          .reset(!rst),
+          .rot(3'b100),
+   
+          .fml_wr(!dram_isread && dram_addr_r),
+          .fml_done(dram_addr_a),
+          .fml_rd( dram_isread && dram_addr_r),
+          .fml_adr(dram_addr),
+          .fml_din(dram_write_data),
+          .fml_dout(dram_read_data),
+          .fml_msk(16'h0)
+   );
 
+endmodule
+