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