clean up Dvi, add a test case
[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 up:    dvi_iic_scl 1
46 percolate inout: dvi_iic_sda 1
47
48 == FPGA ==============================================================
49
50 wire [9:0] x_coord;
51 wire [9:0] y_coord;
52 wire data_valid_ext;
53 wire clk_fb;
54 wire pix_clk;
55 wire[7:0] dvi_green;
56 wire[7:0] dvi_red;
57 wire[7:0] dvi_blue;
58
59 assign dvi_reset_b = 1;
60 assign dvi_de = data_valid_ext;
61
62 vga_timing_generator 
63  #(
64      .WIDTH(640),
65      .H_FP(16),
66      .H_SYNC(96),
67      .H_BP(48),
68      .HEIGHT(480),
69      .V_FP(12),
70      .V_SYNC(2),
71      .V_BP(31),
72      .HEIGHT_BITS(10),
73      .WIDTH_BITS(10),
74      .DATA_DELAY(0)
75   ) my_vga_timing_generator (
76      .rst(rst),
77      .clk(pix_clk),
78      .hsync(dvi_h),
79      .vsync(dvi_v),
80      .X_COORD(x_coord),
81      .Y_COORD(y_coord),
82      .DATA_VALID(),
83      .DATA_VALID_EXT(data_valid_ext),
84      .PIXEL_COUNT()
85   );
86
87   ODDR #(
88       .DDR_CLK_EDGE("OPPOSITE_EDGE"),    // "OPPOSITE_EDGE" or "SAME_EDGE" 
89       .INIT(1'b0),                          // Initial value for Q port ('1' or '0')
90       .SRTYPE("SYNC")                    // Reset Type ("ASYNC" or "SYNC")
91   ) ODDR_xclk_p (
92       .Q(dvi_xclk_p),       // 1-bit DDR output
93       .C(pix_clk),          // 1-bit clock input
94       .CE(1),              // 1-bit clock enable input
95       .D1(1),              // 1-bit data input (positive edge)
96       .D2(0),              // 1-bit data input (negative edge)
97       .R(0),              // 1-bit reset input
98       .S(0)               // 1-bit set input
99       );
100   ODDR #(
101       .DDR_CLK_EDGE("OPPOSITE_EDGE"),    // "OPPOSITE_EDGE" or "SAME_EDGE" 
102       .INIT(1'b0),                          // Initial value for Q port ('1' or '0')
103       .SRTYPE("SYNC")                    // Reset Type ("ASYNC" or "SYNC")
104   ) ODDR_xclk_n (
105       .Q(dvi_xclk_n),       // 1-bit DDR output
106       .C(pix_clk),          // 1-bit clock input
107       .CE(1),              // 1-bit clock enable input
108       .D1(0),              // 1-bit data input (positive edge)
109       .D2(1),              // 1-bit data input (negative edge)
110       .R(0),              // 1-bit reset input
111       .S(0)               // 1-bit set input
112       );
113
114   i2c_video_programmer my_i2c_video_programmer_i (
115       .CLK200Mhz(clk),
116       .RST(rst),
117       .I2C_SDA(dvi_iic_sda),
118       .I2C_SCL(dvi_iic_scl));
119
120   DCM_BASE #(
121       .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
122       .CLKFX_DIVIDE(16),      // Can be any interger from 1 to 32
123       .CLKFX_MULTIPLY(2),       // Can be any integer from 2 to 32
124       .CLKIN_DIVIDE_BY_2("FALSE"),   // TRUE/FALSE to enable CLKIN divide by two feature
125       .CLKIN_PERIOD(10.0),     // Specify period of input clock in ns from 1.25 to 1000.00
126       .CLKOUT_PHASE_SHIFT("NONE"),  // Specify phase shift mode of NONE or FIXED
127       .CLK_FEEDBACK("1X"),    // Specify clock feedback of NONE or 1X
128       .DCM_AUTOCALIBRATION("TRUE"),    // DCM calibrartion circuitry TRUE/FALSE
129       .DCM_PERFORMANCE_MODE("MAX_SPEED"),  // Can be MAX_SPEED or MAX_RANGE
130       .DESKEW_ADJUST("SYSTEM_SYNCHRONOUS"),  // SOURCE_SYNCHRONOUS, SYSTEM_SYNCHRONOUS or
131       .DFS_FREQUENCY_MODE("HIGH"),  // LOW or HIGH frequency mode for frequency synthesis
132       .DLL_FREQUENCY_MODE("LOW"),  // LOW, HIGH, or HIGH_SER frequency mode for DLL
133       .DUTY_CYCLE_CORRECTION("TRUE"),    // Duty cycle correction, TRUE or FALSE
134       .FACTORY_JF(16'hF0F0),  // FACTORY JF Values Suggested to be set to X"F0F0" 
135       .PHASE_SHIFT(0),       // Amount of fixed phase shift from -255 to 1023
136       .STARTUP_WAIT("FALSE")   // Delay configuration DONE until DCM LOCK, TRUE/FALSE
137   ) DCM_BASE_dvi (
138       .CLK0(clk_fb),
139       .CLKDV(pix_clk),
140       .CLKFB(clk_fb),
141       .CLKIN(clk),
142       .RST(rst)
143       );
144
145   ODDR ODDR_dvi_d0  (dvi_d0,  pix_clk, 1, dvi_green[4], dvi_blue[0],  ~data_valid_ext, 0);
146   ODDR ODDR_dvi_d1  (dvi_d1,  pix_clk, 1, dvi_green[5], dvi_blue[1],  ~data_valid_ext, 0);
147   ODDR ODDR_dvi_d2  (dvi_d2,  pix_clk, 1, dvi_green[6], dvi_blue[2],  ~data_valid_ext, 0);
148   ODDR ODDR_dvi_d3  (dvi_d3,  pix_clk, 1, dvi_green[7], dvi_blue[3],  ~data_valid_ext, 0);
149   ODDR ODDR_dvi_d4  (dvi_d4,  pix_clk, 1, dvi_red[0],   dvi_blue[4],  ~data_valid_ext, 0);
150   ODDR ODDR_dvi_d5  (dvi_d5,  pix_clk, 1, dvi_red[1],   dvi_blue[5],  ~data_valid_ext, 0);
151   ODDR ODDR_dvi_d6  (dvi_d6,  pix_clk, 1, dvi_red[2],   dvi_blue[6],  ~data_valid_ext, 0);
152   ODDR ODDR_dvi_d7  (dvi_d7,  pix_clk, 1, dvi_red[3],   dvi_blue[7],  ~data_valid_ext, 0);
153   ODDR ODDR_dvi_d8  (dvi_d8,  pix_clk, 1, dvi_red[4],   dvi_green[0], ~data_valid_ext, 0);
154   ODDR ODDR_dvi_d9  (dvi_d9,  pix_clk, 1, dvi_red[5],   dvi_green[1], ~data_valid_ext, 0);
155   ODDR ODDR_dvi_d10 (dvi_d10, pix_clk, 1, dvi_red[6],   dvi_green[2], ~data_valid_ext, 0);
156   ODDR ODDR_dvi_d11 (dvi_d11, pix_clk, 1, dvi_red[7],   dvi_green[3], ~data_valid_ext, 0);
157
158
159   reg we;
160   wire [2:0]  mem_out;
161   wire [18:0] inAddr;
162   wire [18:0] vga_pixel_addr_;
163   reg  [18:0] vga_pixel_addr;
164
165   assign inAddr          = inX_d   + {   inY_d[8:0], 7'b0000000 } + {   inY_d[8:0], 10'b0000000000 };
166   assign vga_pixel_addr_ = x_coord + { y_coord[8:0], 7'b0000000 } + { y_coord[8:0], 10'b0000000000 };
167   assign dvi_red   = { mem_out[2], 7'b0 };
168   assign dvi_green = { mem_out[1], 7'b0 };
169   assign dvi_blue  = { mem_out[0], 7'b0 };
170
171   vram vram(clk, ~rst, we,
172             inAddr[18:0],
173             vga_pixel_addr,
174             inData_d, ,
175             mem_out);
176
177   always @(posedge pix_clk) begin
178       vga_pixel_addr <= vga_pixel_addr_;
179   end
180
181   always @(posedge clk) begin
182
183     if (rst) begin
184       `reset
185     end else begin
186       `cleanup
187
188       if (`inX_full && `inY_full && `inData_full) begin
189          we <= 1;
190          `drain_inX
191          `drain_inY
192          `drain_inData
193       end else begin
194          we <= 0;
195       end
196
197     end
198   end
199
200
201
202 == UCF ===============================================================
203
204 #Net "dvi_0/dvi_xclk_p_unbuffered" PERIOD =  5 ns HIGH 50%;
205
206 NET  dvi_d0               LOC="AB8"   | IOSTANDARD="LVDCI_33";   # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
207 NET  dvi_d1               LOC="AC8"   | IOSTANDARD="LVDCI_33";   # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
208 NET  dvi_d2               LOC="AN12"  | IOSTANDARD="LVDCI_33";  # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
209 NET  dvi_d3               LOC="AP12"  | IOSTANDARD="LVDCI_33";  # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
210 NET  dvi_d4               LOC="AA9"   | IOSTANDARD="LVDCI_33";   # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
211 NET  dvi_d5               LOC="AA8"   | IOSTANDARD="LVDCI_33";   # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
212 NET  dvi_d6               LOC="AM13"  | IOSTANDARD="LVDCI_33";  # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
213 NET  dvi_d7               LOC="AN13"  | IOSTANDARD="LVDCI_33";  # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
214 NET  dvi_d8               LOC="AA10"  | IOSTANDARD="LVDCI_33";  # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
215 NET  dvi_d9               LOC="AB10"  | IOSTANDARD="LVDCI_33";  # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
216 NET  dvi_d10              LOC="AP14"  | IOSTANDARD="LVDCI_33";  # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
217 NET  dvi_d11              LOC="AN14"  | IOSTANDARD="LVDCI_33";  # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
218 NET  dvi_de               LOC="AE8"   | IOSTANDARD="LVDCI_33" | SLEW=FAST;   # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
219 NET  dvi_reset_b          LOC="AK6"   | IOSTANDARD="LVCMOS33";   # Bank 18, Vcco=3.3V, No DCI
220 NET  dvi_h                LOC="AM12"  | IOSTANDARD="LVDCI_33" | SLEW=FAST;  # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
221 NET  dvi_v                LOC="AM11"  | IOSTANDARD="LVDCI_33" | SLEW=FAST;  # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
222 NET  dvi_xclk_n           LOC="AL10"  | IOSTANDARD="LVCMOS33" | DRIVE=24 | SLEW=FAST;  # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
223 NET  dvi_xclk_p           LOC="AL11"  | IOSTANDARD="LVCMOS33" | DRIVE=24 | SLEW=FAST;  # Bank 22, Vcco=3.3V, DCI using 49.9 ohm resistors
224
225 NET  dvi_gpio1            LOC="N30" | IOSTANDARD="LVCMOS18";   # Bank 15, Vcco=1.8V, DCI using 49.9 ohm resistors
226 NET  dvi_iic_scl          LOC="U27" | PULLUP | IOSTANDARD="LVCMOS18";   # Bank 15, Vcco=1.8V, DCI using 49.9 ohm resistors
227 NET  dvi_iic_sda          LOC="T29" | PULLUP | IOSTANDARD="LVCMOS18";   # Bank 15, Vcco=1.8V, DCI using 49.9 ohm resistors
228
229 NET  gpio_sw_c            LOC="AJ6" | IOSTANDARD="LVCMOS33";   # Bank 18, Vcco=3.3V, No DCI
230
231 NET  gpio_led_c           LOC="E8";    # Bank 20, Vcco=3.3V, DCI using 49.9 ohm resistors
232 NET  gpio_led_e           LOC="AG23";  # Bank 2, Vcco=3.3V
233 NET  gpio_led_n           LOC="AF13";  # Bank 2, Vcco=3.3V
234 NET  gpio_led_s           LOC="AG12";  # Bank 2, Vcco=3.3V
235 NET  gpio_led_w           LOC="AF23";  # Bank 2, Vcco=3.3V
236
237 NET  gpio_led_0           LOC="H18";   # Bank 3, Vcco=2.5V, No DCI
238 NET  gpio_led_1           LOC="L18";   # Bank 3, Vcco=2.5V, No DCI
239 NET  gpio_led_2           LOC="G15";   # Bank 3, Vcco=2.5V, No DCI
240 NET  gpio_led_3           LOC="AD26" | IOSTANDARD="LVCMOS18";  # Bank 21, Vcco=1.8V, DCI using 49.9 ohm resistors
241 NET  gpio_led_4           LOC="G16";   # Bank 3, Vcco=2.5V, No DCI
242 NET  gpio_led_5           LOC="AD25" | IOSTANDARD="LVCMOS18";  # Bank 21, Vcco=1.8V, DCI using 49.9 ohm resistors
243 NET  gpio_led_6           LOC="AD24" | IOSTANDARD="LVCMOS18";  # Bank 21, Vcco=1.8V, DCI using 49.9 ohm resistors
244 NET  gpio_led_7           LOC="AE24" | IOSTANDARD="LVCMOS18";  # Bank 21, Vcco=1.8V, DCI using 49.9 ohm resistors
245
246 == TeX ==============================================================
247
248 == Fleeterpreter ====================================================
249
250   public void service() { }
251
252 == FleetSim ==============================================================
253
254 == Constants =========================================================
255
256 == Test ==============================================================
257
258 #expect 0
259 #expect 0
260 #expect 0
261
262 #ship debug : Debug
263 #ship video : Dvi
264
265 video.inX:
266   set word=0;
267   deliver;
268   send token to debug.in;
269 video.inY:
270   set word=0;
271   deliver;
272   send token to debug.in;
273 video.inData:
274   set word=0;
275   deliver;
276   send token to debug.in;
277
278 debug.in:
279   set word=0;
280   set ilc=*;
281   recv token, deliver;
282
283
284 == Contributors =========================================================
285 Adam Megacz <megacz@cs.berkeley.edu>