simplify DVI code
[fleet.git] / ships / Dvi.ship
1 ship: Video
2
3 == Ports ===========================================================
4 data  in:    inX
5 data  in:    inY
6 data  in:    inData
7
8 percolate up:    dvi_d0      1
9 percolate up:    dvi_d1      1
10 percolate up:    dvi_d2      1
11 percolate up:    dvi_d3      1
12 percolate up:    dvi_d4      1
13 percolate up:    dvi_d5      1
14 percolate up:    dvi_d6      1
15 percolate up:    dvi_d7      1
16 percolate up:    dvi_d8      1
17 percolate up:    dvi_d9      1
18 percolate up:    dvi_d10     1
19 percolate up:    dvi_d11     1
20
21 percolate up:    dvi_h       1
22 percolate up:    dvi_v       1
23 percolate up:    dvi_xclk_n  1
24 percolate up:    dvi_xclk_p  1
25 percolate up:    dvi_de      1
26 percolate up:    dvi_reset_b 1
27
28 percolate down:  gpio_sw_c    1
29
30 percolate up:    gpio_led_c   1
31 percolate up:    gpio_led_e   1
32 percolate up:    gpio_led_n   1
33 percolate up:    gpio_led_s   1
34 percolate up:    gpio_led_w   1
35
36 percolate up:    gpio_led_0   1
37 percolate up:    gpio_led_1   1
38 percolate up:    gpio_led_2   1
39 percolate up:    gpio_led_3   1
40 percolate up:    gpio_led_4   1
41 percolate up:    gpio_led_5   1
42 percolate up:    gpio_led_6   1
43 percolate up:    gpio_led_7   1
44
45 percolate down:  dvi_gpio1   1
46 percolate up:    dvi_iic_scl 1
47 percolate inout: dvi_iic_sda 1
48
49 == FPGA ==============================================================
50
51 /*
52 wire [11:0] dvi_d;
53 assign dvi_d0  = dvi_d[0];
54 assign dvi_d1  = dvi_d[1];
55 assign dvi_d2  = dvi_d[2];
56 assign dvi_d3  = dvi_d[3];
57 assign dvi_d4  = dvi_d[4];
58 assign dvi_d5  = dvi_d[5];
59 assign dvi_d6  = dvi_d[6];
60 assign dvi_d7  = dvi_d[7];
61 assign dvi_d8  = dvi_d[8];
62 assign dvi_d9  = dvi_d[9];
63 assign dvi_d10 = dvi_d[10];
64 assign dvi_d11 = dvi_d[11];
65 */
66
67 wire [9:0] x_coord;
68 wire [9:0] y_coord;
69 assign dvi_reset_b = 1;
70 wire data_valid_ext;
71 assign dvi_de = data_valid_ext;
72 wire clk_fb;
73 wire pix_clk;
74 wire[7:0] dvi_green;
75 wire[7:0] dvi_red;
76 wire[7:0] dvi_blue;
77
78 //assign dvi_green = 8'b101010;
79 //assign dvi_red   = 8'b111111;
80 //assign dvi_blue  = 8'b000000;
81
82 assign dvi_green = x_coord[7:0];
83 assign dvi_red   = y_coord[7:0];
84 assign dvi_blue  = 8'b00000000;
85
86 vga_timing_generator 
87  #(
88      .WIDTH(640),
89      .H_FP(16),
90      .H_SYNC(96),
91      .H_BP(48),
92      .HEIGHT(480),
93      .V_FP(12),
94      .V_SYNC(2),
95      .V_BP(31),
96      .HEIGHT_BITS(10),
97      .WIDTH_BITS(10),
98      .DATA_DELAY(0)
99   ) my_vga_timing_generator (
100      .rst(rst),
101      .clk(pix_clk),
102      .hsync(dvi_h),
103      .vsync(dvi_v),
104      .X_COORD(x_coord),
105      .Y_COORD(y_coord),
106      .DATA_VALID(),
107      .DATA_VALID_EXT(data_valid_ext),
108      .PIXEL_COUNT()
109   );
110
111   ODDR #(
112       .DDR_CLK_EDGE("OPPOSITE_EDGE"),    // "OPPOSITE_EDGE" or "SAME_EDGE" 
113       .INIT(1'b0),                          // Initial value for Q port ('1' or '0')
114       .SRTYPE("SYNC")                    // Reset Type ("ASYNC" or "SYNC")
115   ) ODDR_xclk_p (
116       .Q(dvi_xclk_p),       // 1-bit DDR output
117       .C(pix_clk),          // 1-bit clock input
118       .CE(1),              // 1-bit clock enable input
119       .D1(1),              // 1-bit data input (positive edge)
120       .D2(0),              // 1-bit data input (negative edge)
121       .R(0),              // 1-bit reset input
122       .S(0)               // 1-bit set input
123       );
124   ODDR #(
125       .DDR_CLK_EDGE("OPPOSITE_EDGE"),    // "OPPOSITE_EDGE" or "SAME_EDGE" 
126       .INIT(1'b0),                          // Initial value for Q port ('1' or '0')
127       .SRTYPE("SYNC")                    // Reset Type ("ASYNC" or "SYNC")
128   ) ODDR_xclk_n (
129       .Q(dvi_xclk_n),       // 1-bit DDR output
130       .C(pix_clk),          // 1-bit clock input
131       .CE(1),              // 1-bit clock enable input
132       .D1(0),              // 1-bit data input (positive edge)
133       .D2(1),              // 1-bit data input (negative edge)
134       .R(0),              // 1-bit reset input
135       .S(0)               // 1-bit set input
136       );
137
138   i2c_video_programmer my_i2c_video_programmer_i (
139       .CLK200Mhz(clk),
140       .RST(rst),
141       .I2C_SDA(dvi_iic_sda),
142       .I2C_SCL(dvi_iic_scl));
143
144   DCM_BASE #(
145       .CLKDV_DIVIDE(4.0),     // Divide by: 1.5,2.0,2.5,3.0,3.5,4.0,4.5,5.0,5.5,6.0,6.5
146       .CLKFX_DIVIDE(16),      // Can be any interger from 1 to 32
147       .CLKFX_MULTIPLY(2),       // Can be any integer from 2 to 32
148       .CLKIN_DIVIDE_BY_2("FALSE"),   // TRUE/FALSE to enable CLKIN divide by two feature
149       .CLKIN_PERIOD(10.0),     // Specify period of input clock in ns from 1.25 to 1000.00
150       .CLKOUT_PHASE_SHIFT("NONE"),  // Specify phase shift mode of NONE or FIXED
151       .CLK_FEEDBACK("1X"),    // Specify clock feedback of NONE or 1X
152       .DCM_AUTOCALIBRATION("TRUE"),    // DCM calibrartion circuitry TRUE/FALSE
153       .DCM_PERFORMANCE_MODE("MAX_SPEED"),  // Can be MAX_SPEED or MAX_RANGE
154       .DESKEW_ADJUST("SYSTEM_SYNCHRONOUS"),  // SOURCE_SYNCHRONOUS, SYSTEM_SYNCHRONOUS or
155       .DFS_FREQUENCY_MODE("HIGH"),  // LOW or HIGH frequency mode for frequency synthesis
156       .DLL_FREQUENCY_MODE("LOW"),  // LOW, HIGH, or HIGH_SER frequency mode for DLL
157       .DUTY_CYCLE_CORRECTION("TRUE"),    // Duty cycle correction, TRUE or FALSE
158       .FACTORY_JF(16'hF0F0),  // FACTORY JF Values Suggested to be set to X"F0F0" 
159       .PHASE_SHIFT(0),       // Amount of fixed phase shift from -255 to 1023
160       .STARTUP_WAIT("FALSE")   // Delay configuration DONE until DCM LOCK, TRUE/FALSE
161   ) DCM_BASE_dvi (
162       .CLK0(clk_fb),
163       .CLKDV(pix_clk),
164       .CLKFB(clk_fb),
165       .CLKIN(clk),
166       .RST(rst)
167       );
168
169   ODDR ODDR_dvi_d0  (dvi_d0,  pix_clk, 1, dvi_green[4], dvi_blue[0], ~data_valid_ext, 0);
170   ODDR ODDR_dvi_d1  (dvi_d1,  pix_clk, 1, dvi_green[5], dvi_blue[1], ~data_valid_ext, 0);
171   ODDR ODDR_dvi_d2  (dvi_d2,  pix_clk, 1, dvi_green[6], dvi_blue[2], ~data_valid_ext, 0);
172   ODDR ODDR_dvi_d3  (dvi_d3,  pix_clk, 1, dvi_green[7], dvi_blue[3], ~data_valid_ext, 0);
173   ODDR ODDR_dvi_d4  (dvi_d4,  pix_clk, 1, dvi_red[0], dvi_blue[4], ~data_valid_ext, 0);
174   ODDR ODDR_dvi_d5  (dvi_d5,  pix_clk, 1, dvi_red[1], dvi_blue[5], ~data_valid_ext, 0);
175   ODDR ODDR_dvi_d6  (dvi_d6,  pix_clk, 1, dvi_red[2], dvi_blue[6], ~data_valid_ext, 0);
176   ODDR ODDR_dvi_d7  (dvi_d7,  pix_clk, 1, dvi_red[3], dvi_blue[7], ~data_valid_ext, 0);
177   ODDR ODDR_dvi_d8  (dvi_d8,  pix_clk, 1, dvi_red[4], dvi_green[0], ~data_valid_ext, 0);
178   ODDR ODDR_dvi_d9  (dvi_d9,  pix_clk, 1, dvi_red[5], dvi_green[1], ~data_valid_ext, 0);
179   ODDR ODDR_dvi_d10 (dvi_d10, pix_clk, 1, dvi_red[6], dvi_green[2], ~data_valid_ext, 0);
180   ODDR ODDR_dvi_d11 (dvi_d11, pix_clk, 1, dvi_red[7], dvi_green[3], ~data_valid_ext, 0);
181
182
183
184 /*
185 dvi_video_test my_dvi_video_test(
186   .CLK_P(clk),
187   .CLK_N(clk),
188
189   .DVI_D(dvi_d),
190   .DVI_H(dvi_h),
191   .DVI_V(dvi_v),
192   .DVI_DE(dvi_de),
193   .DVI_XCLK_N(dvi_xclk_n),
194   .DVI_XCLK_P(dvi_xclk_p),
195   .DVI_RESET_B(dvi_reset_b),
196
197   .VGA_PIXEL_CLK(1'b0),
198   .VGA_Y_GREEN(8'b0),
199   .VGA_CBCR_RED(8'b0),
200   .VGA_BLUE(8'b0),
201   .VGA_HSYNC(1'b0),
202   .VGA_VSYNC(1'b0),
203   .VGA_ODD_EVEN_B(1'b0),
204   .VGA_SOGOUT(1'b0),
205   .VGA_CLAMP(1'b0),
206   .VGA_COAST(1'b0),
207
208   .SOGOUT(),
209   .PIXEL_X_COORD(),
210   .PIXEL_Y_COORD(),
211   .TOTAL_PIXEL_COUNT(),
212   .VGA_DATA_VALID(),
213   .Y(),
214   .HSYNC(),
215   .VSYNC(),
216   .DVI_PIXEL_COUNT(),
217   .DVI_X_COORD(),
218   .DVI_Y_COORD(),
219   .DVI_DATA_VALID()
220
221  );
222 */
223
224
225 /*
226   assign dvi_de      = 1;
227   assign dvi_reset_b = 1;
228
229   assign dvi_d0      = 1;
230   assign dvi_d1      = 0;
231   assign dvi_d2      = 1;
232   assign dvi_d3      = 0;
233   assign dvi_d4      = 1;
234   assign dvi_d5      = 0;
235   assign dvi_d6      = 1;
236   assign dvi_d7      = 0;
237   assign dvi_d8      = 1;
238   assign dvi_d9      = 0;
239   assign dvi_d10     = 1;
240   assign dvi_d11     = 0;
241 */
242   assign gpio_led_n = 1;
243   assign gpio_led_s = 0;
244
245   assign gpio_led_0 = dvi_gpio1;
246   assign gpio_led_1 = gpio_sw_c;
247   //assign gpio_led_2 = dvi_xclk_p;
248   //assign gpio_led_3 = 0;
249   //assign gpio_led_4 = 1;
250   assign gpio_led_5 = 0;
251   assign gpio_led_6 = 1;
252   assign gpio_led_7 = 0;
253 /*
254   wire dvi_xclk_p_unbuffered;
255   wire dvi_xclk_n_unbuffered;
256   wire dvi_xclk_fb;
257 */
258 /*
259   reg initialized;
260   always @(posedge clk) begin
261     if (rst) begin
262       initialized <= 0;
263     end else begin
264       if (!initialized && gpio_sw_c) begin
265       end
266     end
267   end
268 */
269 /*
270 i2c_video_programmer my_i2c_video_programmer
271   ( .CLK200Mhz(clk),
272     .RST(rst),
273     .I2C_SDA(dvi_iic_sda),
274     .I2C_SCL(dvi_iic_scl)
275   );
276
277
278   BUFG GBUF_FOR_DVI_CLOCK_N (.I(dvi_xclk_n_unbuffered), .O(dvi_xclk_n));
279   BUFG GBUF_FOR_DVI_CLOCK_P (.I(dvi_xclk_p_unbuffered), .O(dvi_xclk_p));
280   DCM  // 36Mhz DVI clock
281    #(
282       .CLKFX_MULTIPLY(9),
283       .CLKFX_DIVIDE(25),
284       .CLKIN_PERIOD("10 ns"),
285       .DLL_FREQUENCY_MODE("LOW")
286     ) vgadcm (
287       .CLKIN    (clk),
288       .CLKFB    (dvi_xclk_fb),
289       .CLKFX    (dvi_xclk_p_unbuffered),
290       .CLKFX180 (dvi_xclk_n_unbuffered),
291       .CLK0     (dvi_xclk_fb)
292     );
293
294
295   wire [31:0] vga_pixel_addr_;
296   wire        vga_pixel_r;
297   wire        vga_pixel_a_;
298   reg         vga_pixel_a;
299   assign vga_pixel_a_ = vga_pixel_a;
300   wire [18:0] inAddr;
301
302   reg we;
303   wire [2:0] mem_out;
304   wire  [31:0] vga_pixel_data;
305   assign vga_pixel_data = {
306              8'b0,
307              mem_out[2], 7'b0,
308              mem_out[1], 7'b0,
309              mem_out[0], 7'b0
310   };
311
312   assign inAddr = inX_d + (inY_d * 640);
313
314   vram vram(clk, !rst, we, inAddr[18:0], vga_pixel_addr_[20:2], inData_d, , mem_out);
315
316   wb_vga wb_vga(
317         .wb_clk_i(clk),
318         .wb_rst_i(rst),
319         
320         .fbwb_adr_o(vga_pixel_addr_),
321         .fbwb_stb_o(vga_pixel_r),
322         .fbwb_ack_i(vga_pixel_a_),
323         .fbwb_dat_i(vga_pixel_data),
324
325         // VGA signals
326         .vga_clk(dvi_xclk_p),
327         .vga_psave(vga_psave),
328         .vga_hsync(dvi_h),
329         .vga_vsync(dvi_v),
330         .vga_sync(vga_sync),
331         .vga_blank(vga_blank),
332         .vga_r(vga_r),
333         .vga_g(vga_g),
334         .vga_b(vga_b)
335         // .vga_clkout(vga_clkout)
336   );
337
338   always @(posedge clk) begin
339
340     if (rst) begin
341       `reset
342     end else begin
343       `cleanup
344       vga_pixel_a <= vga_pixel_r;
345
346       if (`inX_full && `inY_full && `inData_full) begin
347          we <= 1;
348          `drain_inX
349          `drain_inY
350          `drain_inData
351       end else begin
352          we <= 0;
353       end
354
355     end
356   end
357
358 */
359
360 == UCF ===============================================================
361
362 #Net "dvi_0/dvi_xclk_p_unbuffered" PERIOD =  5 ns HIGH 50%;
363
364 NET  dvi_d0               LOC="AB8"   | IOSTANDARD="LVDCI_33";   # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
365 NET  dvi_d1               LOC="AC8"   | IOSTANDARD="LVDCI_33";   # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
366 NET  dvi_d2               LOC="AN12"  | IOSTANDARD="LVDCI_33";  # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
367 NET  dvi_d3               LOC="AP12"  | IOSTANDARD="LVDCI_33";  # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
368 NET  dvi_d4               LOC="AA9"   | IOSTANDARD="LVDCI_33";   # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
369 NET  dvi_d5               LOC="AA8"   | IOSTANDARD="LVDCI_33";   # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
370 NET  dvi_d6               LOC="AM13"  | IOSTANDARD="LVDCI_33";  # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
371 NET  dvi_d7               LOC="AN13"  | IOSTANDARD="LVDCI_33";  # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
372 NET  dvi_d8               LOC="AA10"  | IOSTANDARD="LVDCI_33";  # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
373 NET  dvi_d9               LOC="AB10"  | IOSTANDARD="LVDCI_33";  # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
374 NET  dvi_d10              LOC="AP14"  | IOSTANDARD="LVDCI_33";  # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
375 NET  dvi_d11              LOC="AN14"  | IOSTANDARD="LVDCI_33";  # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
376 NET  dvi_de               LOC="AE8"   | IOSTANDARD="LVDCI_33" | SLEW=FAST;   # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
377 NET  dvi_reset_b          LOC="AK6"   | IOSTANDARD="LVCMOS33";   # Bank 18, Vcco=3.3V, No DCI
378 NET  dvi_h                LOC="AM12"  | IOSTANDARD="LVDCI_33" | SLEW=FAST;  # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
379 NET  dvi_v                LOC="AM11"  | IOSTANDARD="LVDCI_33" | SLEW=FAST;  # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
380 NET  dvi_xclk_n           LOC="AL10"  | IOSTANDARD="LVCMOS33" | DRIVE=24 | SLEW=FAST;  # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
381 NET  dvi_xclk_p           LOC="AL11"  | IOSTANDARD="LVCMOS33" | DRIVE=24 | SLEW=FAST;  # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
382
383 NET  dvi_gpio1            LOC="N30" | IOSTANDARD="LVCMOS18";   # Bank 15, Vcco=1.8V, DCI using 49.9 ohm resistors
384 NET  dvi_iic_scl          LOC="U27" | PULLUP | IOSTANDARD="LVCMOS18";   # Bank 15, Vcco=1.8V, DCI using 49.9 ohm resistors
385 NET  dvi_iic_sda          LOC="T29" | PULLUP | IOSTANDARD="LVCMOS18";   # Bank 15, Vcco=1.8V, DCI using 49.9 ohm resistors
386
387 NET  gpio_sw_c            LOC="AJ6" | IOSTANDARD="LVCMOS33";   # Bank 18, Vcco=3.3V, No DCI
388
389 NET  gpio_led_c           LOC="E8";    # Bank 20, Vcco=3.3V, DCI using 49.9 ohm resistors
390 NET  gpio_led_e           LOC="AG23";  # Bank 2, Vcco=3.3V
391 NET  gpio_led_n           LOC="AF13";  # Bank 2, Vcco=3.3V
392 NET  gpio_led_s           LOC="AG12";  # Bank 2, Vcco=3.3V
393 NET  gpio_led_w           LOC="AF23";  # Bank 2, Vcco=3.3V
394
395 NET  gpio_led_0           LOC="H18";   # Bank 3, Vcco=2.5V, No DCI
396 NET  gpio_led_1           LOC="L18";   # Bank 3, Vcco=2.5V, No DCI
397 NET  gpio_led_2           LOC="G15";   # Bank 3, Vcco=2.5V, No DCI
398 NET  gpio_led_3           LOC="AD26" | IOSTANDARD="LVCMOS18";  # Bank 21, Vcco=1.8V, DCI using 49.9 ohm resistors
399 NET  gpio_led_4           LOC="G16";   # Bank 3, Vcco=2.5V, No DCI
400 NET  gpio_led_5           LOC="AD25" | IOSTANDARD="LVCMOS18";  # Bank 21, Vcco=1.8V, DCI using 49.9 ohm resistors
401 NET  gpio_led_6           LOC="AD24" | IOSTANDARD="LVCMOS18";  # Bank 21, Vcco=1.8V, DCI using 49.9 ohm resistors
402 NET  gpio_led_7           LOC="AE24" | IOSTANDARD="LVCMOS18";  # Bank 21, Vcco=1.8V, DCI using 49.9 ohm resistors
403
404 == TeX ==============================================================
405
406 == Fleeterpreter ====================================================
407
408   public void service() { }
409
410 == FleetSim ==============================================================
411
412 == Constants =========================================================
413
414 == Test ==============================================================
415 #skip
416
417 #ship debug : Debug
418
419 == Contributors =========================================================
420 Adam Megacz <megacz@cs.berkeley.edu>