Π’ΠΎΠ²Π° Π²ΠΈΠ΄Π΅ΠΎ ΠΏΠΎΠΊΠ°Π·Π²Π°: ΠΏΠ»Π°ΡΠΊΠ° Raspberry Pi3, ΠΊΡΠΌ ΠΊΠΎΡΡΠΎ ΡΡΠ΅Π· GPIO ΠΊΠΎΠ½Π΅ΠΊΡΠΎΡΠ° Π΅ ΡΠ²ΡΡΠ·Π°Π½Π° ΠΏΠ»Π°ΡΠΊΠ° FPGA Mars Rover2rpi (Cyclone IV), ΠΊΡΠΌ ΠΊΠΎΡΡΠΎ Π΅ ΡΠ²ΡΡΠ·Π°Π½ HDMI ΠΌΠΎΠ½ΠΈΡΠΎΡ. ΠΡΠΎΡΠΈΡΡ ΠΌΠΎΠ½ΠΈΡΠΎΡ Π΅ ΡΠ²ΡΡΠ·Π°Π½ ΡΡΠ΅Π· ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΈΡ Raspberry Pi3 HDMI ΠΊΠΎΠ½Π΅ΠΊΡΠΎΡ. ΠΡΠΈΡΠΊΠΎ Π·Π°Π΅Π΄Π½ΠΎ ΡΠ°Π±ΠΎΡΠΈ ΠΊΠ°ΡΠΎ ΡΠΈΡΡΠ΅ΠΌΠ° Ρ Π΄Π²ΠΎΠ΅Π½ ΠΌΠΎΠ½ΠΈΡΠΎΡ.
Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΡΠ΅ Π²ΠΈ ΠΊΠ°ΠΆΠ° ΠΊΠ°ΠΊ ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°.
ΠΠΎΠΏΡΠ»ΡΡΠ½Π°ΡΠ° ΠΏΠ»Π°ΡΠΊΠ° Raspberry Pi3 ΠΈΠΌΠ° GPIO ΠΊΠΎΠ½Π΅ΠΊΡΠΎΡ, ΡΡΠ΅Π· ΠΊΠΎΠΉΡΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΠ²ΡΡΠΆΠ΅ΡΠ΅ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΠ°Π·ΡΠΈΡΠΈΡΠ΅Π»Π½ΠΈ ΠΏΠ»Π°ΡΠΊΠΈ: ΡΠ΅Π½Π·ΠΎΡΠΈ, ΡΠ²Π΅ΡΠΎΠ΄ΠΈΠΎΠ΄ΠΈ, Π΄ΡΠ°ΠΉΠ²Π΅ΡΠΈ Π·Π° ΡΡΡΠΏΠΊΠΎΠ²ΠΈ Π΄Π²ΠΈΠ³Π°ΡΠ΅Π»ΠΈ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΡΡΠ³ΠΈ. Π‘ΠΏΠ΅ΡΠΈΡΠΈΡΠ½Π°ΡΠ° ΡΡΠ½ΠΊΡΠΈΡ Π½Π° Π²ΡΠ΅ΠΊΠΈ ΡΠΈΡΡ Π½Π° ΠΊΠΎΠ½Π΅ΠΊΡΠΎΡΠ° Π·Π°Π²ΠΈΡΠΈ ΠΎΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° Π½Π° ΠΏΠΎΡΡΠ°. ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° GPIO ALT2 Π²ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΠΏΡΠ΅Π²ΠΊΠ»ΡΡΠΈΡΠ΅ ΠΊΠΎΠ½Π΅ΠΊΡΠΎΡΠ° Π² ΡΠ΅ΠΆΠΈΠΌ Π½Π° DPI ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ, Display Parallel Interface. ΠΠΌΠ° ΡΠ°Π·ΡΠΈΡΠΈΡΠ΅Π»Π½ΠΈ ΠΏΠ»Π°ΡΠΊΠΈ Π·Π° ΡΠ²ΡΡΠ·Π²Π°Π½Π΅ Π½Π° VGA ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈ ΡΡΠ΅Π· DPI. ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠΎΠ²Π°, ΠΏΡΡΠ²ΠΎ, VGA ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΡΠ΅ Π²Π΅ΡΠ΅ Π½Π΅ ΡΠ° ΡΠΎΠ»ΠΊΠΎΠ²Π° ΡΠ΅ΡΡΠΎ ΡΡΠ΅ΡΠ°Π½ΠΈ, ΠΊΠΎΠ»ΠΊΠΎΡΠΎ HDMI, ΠΈ Π²ΡΠΎΡΠΎ, ΡΠΈΡΡΠΎΠ²ΠΈΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ ΡΡΠ°Π²Π° Π²ΡΠ΅ ΠΏΠΎ-Π΄ΠΎΠ±ΡΡ ΠΎΡ Π°Π½Π°Π»ΠΎΠ³ΠΎΠ²ΠΈΡ. ΠΡΠ²Π΅Π½ ΡΠΎΠ²Π° DAC Π½Π° ΡΠ°ΠΊΠΈΠ²Π° VGA ΡΠ°Π·ΡΠΈΡΠΈΡΠ΅Π»Π½ΠΈ ΠΊΠ°ΡΡΠΈ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΡΠ΅ ΠΏΡΠ°Π²ΠΈ ΠΏΠΎΠ΄ ΡΠΎΡΠΌΠ°ΡΠ° Π½Π° R-2-R Π²Π΅ΡΠΈΠ³ΠΈ ΠΈ ΡΠ΅ΡΡΠΎ Π½Π΅ ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΎΡ 6 Π±ΠΈΡΠ° Π½Π° ΡΠ²ΡΡ.
Π ΡΠ΅ΠΆΠΈΠΌ ALT2 ΡΠΈΡΡΠΎΠ²Π΅ΡΠ΅ Π½Π° GPIO ΠΊΠΎΠ½Π΅ΠΊΡΠΎΡΠ° ΠΈΠΌΠ°Ρ ΡΠ»Π΅Π΄Π½ΠΎΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅:
Π’ΡΠΊ ΠΎΡΠ²Π΅ΡΠΈΡ
RGB ΡΠΈΡΡΠΎΠ²Π΅ΡΠ΅ Π½Π° ΠΊΠΎΠ½Π΅ΠΊΡΠΎΡΠ° ΡΡΠΎΡΠ²Π΅ΡΠ½ΠΎ Π² ΡΠ΅ΡΠ²Π΅Π½ΠΎ, Π·Π΅Π»Π΅Π½ΠΎ ΠΈ ΡΠΈΠ½ΡΠΎ. ΠΡΡΠ³ΠΈ Π²Π°ΠΆΠ½ΠΈ ΡΠΈΠ³Π½Π°Π»ΠΈ ΡΠ° V-SYNC ΠΈ H-SYNC ΡΠΈΠ½Ρ
ΡΠΎΠ½ΠΈΠ·ΠΈΡΠ°ΡΠΈ ΡΠΈΠ³Π½Π°Π»ΠΈ, ΠΊΠ°ΠΊΡΠΎ ΠΈ CLK. Π’Π°ΠΊΡΠΎΠ²Π°ΡΠ° ΡΠ΅ΡΡΠΎΡΠ° Π½Π° CLK Π΅ ΡΠ΅ΡΡΠΎΡΠ°ΡΠ°, ΠΏΡΠΈ ΠΊΠΎΡΡΠΎ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈΡΠ΅ Π½Π° ΠΏΠΈΠΊΡΠ΅Π»ΠΈΡΠ΅ ΡΠ΅ ΠΈΠ·Π²Π΅ΠΆΠ΄Π°Ρ ΠΊΡΠΌ ΠΊΠΎΠ½Π΅ΠΊΡΠΎΡΠ° ΠΈ Π·Π°Π²ΠΈΡΠΈ ΠΎΡ ΠΈΠ·Π±ΡΠ°Π½ΠΈΡ Π²ΠΈΠ΄Π΅ΠΎ ΡΠ΅ΠΆΠΈΠΌ.
ΠΠ° Π΄Π° ΡΠ²ΡΡΠΆΠ΅ΡΠ΅ ΡΠΈΡΡΠΎΠ² HDMI ΠΌΠΎΠ½ΠΈΡΠΎΡ, ΡΡΡΠ±Π²Π° Π΄Π° Π·Π°ΡΠ½Π΅ΠΌΠ΅ΡΠ΅ DPI ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ½ΠΈ ΡΠΈΠ³Π½Π°Π»ΠΈ ΠΈ Π΄Π° Π³ΠΈ ΠΊΠΎΠ½Π²Π΅ΡΡΠΈΡΠ°ΡΠ΅ Π² HDMI ΡΠΈΠ³Π½Π°Π»ΠΈ. Π’ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° Π²ΡΡΠΊΠ° FPGA ΠΏΠ»Π°ΡΠΊΠ°. ΠΠ°ΠΊΡΠΎ ΡΠ΅ ΠΎΠΊΠ°Π·Π°, ΠΏΠ»Π°ΡΠΊΠ°ΡΠ° Mars Rover2rpi Π΅ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡΠ° Π·Π° ΡΠ°Π·ΠΈ ΡΠ΅Π». ΠΡΡΡΠ½ΠΎΡΡ ΠΎΡΠ½ΠΎΠ²Π½Π°ΡΠ° ΠΎΠΏΡΠΈΡ Π·Π° ΡΠ²ΡΡΠ·Π²Π°Π½Π΅ Π½Π° ΡΠ°Π·ΠΈ ΠΏΠ»Π°ΡΠΊΠ° ΡΡΠ΅Π· ΡΠΏΠ΅ΡΠΈΠ°Π»Π΅Π½ Π°Π΄Π°ΠΏΡΠ΅Ρ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΡΠ°ΠΊΠ°:
Π’Π°Π·ΠΈ ΠΏΠ»Π°ΡΠΊΠ° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π° ΡΠ²Π΅Π»ΠΈΡΠ°Π²Π°Π½Π΅ Π½Π° Π±ΡΠΎΡ Π½Π° GPIO ΠΏΠΎΡΡΠΎΠ²Π΅ΡΠ΅ ΠΈ Π·Π° ΡΠ²ΡΡΠ·Π²Π°Π½Π΅ Π½Π° ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΏΠ΅ΡΠΈΡΠ΅ΡΠ½ΠΈ ΡΡΡΡΠΎΠΉΡΡΠ²Π° ΠΊΡΠΌ ΠΌΠ°Π»ΠΈΠ½Π°ΡΠ°. Π ΡΡΡΠΎΡΠΎ Π²ΡΠ΅ΠΌΠ΅ 4 GPIO ΡΠΈΠ³Π½Π°Π»Π° Ρ ΡΠ°Π·ΠΈ Π²ΡΡΠ·ΠΊΠ° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Π·Π° JTAG ΡΠΈΠ³Π½Π°Π»ΠΈ, ΡΠ°ΠΊΠ° ΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° ΠΎΡ ΡΠ°Π·ΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½ΠΈΠ΅ΡΠΎ Π΄Π° ΠΌΠΎΠΆΠ΅ Π΄Π° Π·Π°ΡΠ΅Π΄ΠΈ ΡΡΡΠΌΡΠ΅ΡΠ° Π½Π° FPGA Π² FPGA. ΠΠΎΡΠ°Π΄ΠΈ ΡΠΎΠ²Π° ΡΠ°ΠΊΠ°Π²Π° ΡΠ΅Π΄ΠΎΠ²Π½Π° Π²ΡΡΠ·ΠΊΠ° Π½Π΅ ΠΌΠ΅ ΡΡΡΡΠΎΠΉΠ²Π°, 4 DPI ΡΠΈΠ³Π½Π°Π»ΠΈ ΠΎΡΠΏΠ°Π΄Π°Ρ. ΠΠ° ΡΠ°ΡΡΠΈΠ΅, Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½ΠΈΡΠ΅ Π³ΡΠ΅Π±Π΅Π½ΠΈ Π½Π° Π΄ΡΡΠΊΠ°ΡΠ° ΠΈΠΌΠ°Ρ ΡΠΈΡΡΠΎΠ²Π΅, ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΈ Ρ Raspberry. ΠΠ° Π΄Π° ΠΌΠΎΠ³Π° Π΄Π° Π·Π°Π²ΡΡΡΡ ΠΏΠ»Π°ΡΠΊΠ°ΡΠ° Π½Π° 90 Π³ΡΠ°Π΄ΡΡΠ° ΠΈ ΠΏΠ°ΠΊ Π΄Π° Ρ ΡΠ²ΡΡΠΆΠ° Ρ ΠΌΠΎΡΡΠ° ΠΌΠ°Π»ΠΈΠ½Π°:
Π Π°Π·Π±ΠΈΡΠ° ΡΠ΅, ΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ Π²ΡΠ½ΡΠ΅Π½ JTAG ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠΎΡ, Π½ΠΎ ΡΠΎΠ²Π° Π½Π΅ Π΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌ.
ΠΡΠ΅ ΠΎΡΠ΅ ΠΈΠΌΠ° ΠΌΠ°Π»ΡΠΊ ΠΏΡΠΎΠ±Π»Π΅ΠΌ. ΠΠ΅ Π²ΡΠ΅ΠΊΠΈ ΡΠΈΡΡ Π½Π° FPGA ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΊΠ°ΡΠΎ Π²Ρ ΠΎΠ΄ Π·Π° ΡΠ°ΡΠΎΠ²Π½ΠΈΠΊ. ΠΠΌΠ° ΡΠ°ΠΌΠΎ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΠΏΠ΅ΡΠΈΠ°Π»Π½ΠΈ ΠΏΠΈΠ½Π°, ΠΊΠΎΠΈΡΠΎ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Π·Π° ΡΠ°Π·ΠΈ ΡΠ΅Π». Π’Π°ΠΊΠ° ΡΠ΅ ΠΎΠΊΠ°Π·Π°, ΡΠ΅ GPIO_0 CLK ΡΠΈΠ³Π½Π°Π»ΡΡ Π½Π΅ Π΄ΠΎΡΡΠΈΠ³Π° Π΄ΠΎ FPGA Π²Ρ ΠΎΠ΄Π°, ΠΊΠΎΠΉΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΊΠ°ΡΠΎ FPGA ΡΠ°ΡΠΎΠ²Π½ΠΈΠΊΠΎΠ² Π²Ρ ΠΎΠ΄. Π’Π°ΠΊΠ° ΡΠ΅ Π²ΡΠ΅ ΠΏΠ°ΠΊ ΡΡΡΠ±Π²Π°ΡΠ΅ Π΄Π° Ρ Π²ΡΡΠ»Ρ Π΅Π΄Π½Π° ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΡ Π½Π° ΡΠ°Π». Π‘Π²ΡΡΠ·Π²Π°ΠΌ GPIO_0 ΠΈ KEY[1] ΡΠΈΠ³Π½Π°Π» Π½Π° ΠΏΠ»Π°ΡΠΊΠ°ΡΠ°:
Π‘Π΅Π³Π° ΡΠ΅ Π²ΠΈ ΡΠ°Π·ΠΊΠ°ΠΆΠ° ΠΌΠ°Π»ΠΊΠΎ Π·Π° ΠΏΡΠΎΠ΅ΠΊΡΠ° Π² FPGA. ΠΡΠ½ΠΎΠ²Π½Π°ΡΠ° ΡΡΡΠ΄Π½ΠΎΡΡ ΠΏΡΠΈ ΡΠΎΡΠΌΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° HDMI ΡΠΈΠ³Π½Π°Π»ΠΈ ΡΠ° ΠΌΠ½ΠΎΠ³ΠΎ Π²ΠΈΡΠΎΠΊΠΈΡΠ΅ ΡΠ΅ΡΡΠΎΡΠΈ. Π Π°Π·Π³Π»Π΅ΠΆΠ΄Π°ΠΉΠΊΠΈ ΡΠ°Π·Π²ΠΎΠ΄ΠΊΠ°ΡΠ° Π½Π° HDMI ΠΊΠΎΠ½Π΅ΠΊΡΠΎΡΠ°, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡΠ΅, ΡΠ΅ RGB ΡΠΈΠ³Π½Π°Π»ΠΈΡΠ΅ Π²Π΅ΡΠ΅ ΡΠ° ΡΠ΅ΡΠΈΠΉΠ½ΠΈ Π΄ΠΈΡΠ΅ΡΠ΅Π½ΡΠΈΠ°Π»Π½ΠΈ ΡΠΈΠ³Π½Π°Π»ΠΈ:
ΠΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° Π΄ΠΈΡΠ΅ΡΠ΅Π½ΡΠΈΠ°Π»Π΅Π½ ΡΠΈΠ³Π½Π°Π» Π²ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΡΠ΅ ΡΠΏΡΠ°Π²ΠΈΡΠ΅ Ρ ΡΡΠΌΠ° Π² ΠΎΠ±Ρ ΡΠ΅ΠΆΠΈΠΌ Π½Π° ΠΏΡΠ΅Π΄Π°Π²Π°ΡΠ΅Π»Π½Π°ΡΠ° Π»ΠΈΠ½ΠΈΡ. Π ΡΠΎΠ·ΠΈ ΡΠ»ΡΡΠ°ΠΉ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»Π½ΠΈΡΡ ΠΎΡΠ΅ΠΌ-Π±ΠΈΡΠΎΠ² ΠΊΠΎΠ΄ Π½Π° Π²ΡΠ΅ΠΊΠΈ ΡΠ²Π΅ΡΠ΅Π½ ΡΠΈΠ³Π½Π°Π» ΡΠ΅ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ²Π° Π² 10-Π±ΠΈΡΠΎΠ² TMDS (ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡΠ°Π½ΠΎ Π΄ΠΈΡΠ΅ΡΠ΅Π½ΡΠΈΠ°Π»Π½ΠΎ ΡΠΈΠ³Π½Π°Π»ΠΈΠ·ΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΡΠ΅Ρ
ΠΎΠ΄Π°). Π’ΠΎΠ²Π° Π΅ ΡΠΏΠ΅ΡΠΈΠ°Π»Π΅Π½ ΠΌΠ΅ΡΠΎΠ΄ Π½Π° ΠΊΠΎΠ΄ΠΈΡΠ°Π½Π΅ Π·Π° ΠΏΡΠ΅ΠΌΠ°Ρ
Π²Π°Π½Π΅ Π½Π° ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎΡΠΎΠΊΠΎΠ²ΠΈΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ΠΎΡ ΡΠΈΠ³Π½Π°Π»Π° ΠΈ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΡΠ΅Π²ΠΊΠ»ΡΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠΈΠ³Π½Π°Π»Π° Π² Π΄ΠΈΡΠ΅ΡΠ΅Π½ΡΠΈΠ°Π»Π½Π°ΡΠ° Π»ΠΈΠ½ΠΈΡ. Π’ΡΠΉ ΠΊΠ°ΡΠΎ ΡΠ΅Π³Π° ΠΈΠΌΠ° 10 Π±ΠΈΡΠ° Π·Π° ΠΏΡΠ΅Π΄Π°Π²Π°Π½Π΅ Π½Π° Π±Π°ΠΉΡ ΡΠ²ΡΡ ΠΏΠΎ ΡΠ΅ΡΠΈΠΉΠ½Π°ΡΠ° Π»ΠΈΠ½ΠΈΡ, ΡΠ΅ ΠΎΠΊΠ°Π·Π²Π°, ΡΠ΅ ΡΠ°ΠΊΡΠΎΠ²Π°ΡΠ° ΡΠ΅ΡΡΠΎΡΠ° Π½Π° ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΎΡΠ° ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π΅ 10 ΠΏΡΡΠΈ ΠΏΠΎ-Π²ΠΈΡΠΎΠΊΠ° ΠΎΡ ΡΠ°ΠΊΡΠΎΠ²Π°ΡΠ° ΡΠ΅ΡΡΠΎΡΠ° Π½Π° ΠΏΠΈΠΊΡΠ΅Π»ΠΈΡΠ΅. ΠΠΊΠΎ Π²Π·Π΅ΠΌΠ΅ΠΌ Π·Π° ΠΏΡΠΈΠΌΠ΅Ρ Π²ΠΈΠ΄Π΅ΠΎ ΡΠ΅ΠΆΠΈΠΌ 1280x720 60Hz, ΡΠΎΠ³Π°Π²Π° ΡΠ΅ΡΡΠΎΡΠ°ΡΠ° Π½Π° ΠΏΠΈΠΊΡΠ΅Π»ΠΈΡΠ΅ Π½Π° ΡΠΎΠ·ΠΈ ΡΠ΅ΠΆΠΈΠΌ Π΅ 74,25MHz. Π‘Π΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΎΡΡΡ ΡΡΡΠ±Π²Π° Π΄Π° Π΅ 742,5 MHz.
ΠΠΎΠ½Π²Π΅Π½ΡΠΈΠΎΠ½Π°Π»Π½ΠΈΡΠ΅ FPGA ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ Π½Π΅ ΡΠ° ΡΠΏΠΎΡΠΎΠ±Π½ΠΈ Π½Π° ΡΠΎΠ²Π°, Π·Π° ΡΡΠΆΠ°Π»Π΅Π½ΠΈΠ΅. ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠΎΠ²Π°, Π·Π° Π½Π°Ρ ΠΊΡΡΠΌΠ΅Ρ, FPGA ΠΈΠΌΠ°Ρ Π²Π³ΡΠ°Π΄Π΅Π½ΠΈ DDIO ΠΈΠ·Π²ΠΎΠ΄ΠΈ. Π’ΠΎΠ²Π° ΡΠ° Π·Π°ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ, ΠΊΠΎΠΈΡΠΎ Π²Π΅ΡΠ΅ ΡΠ°, ΡΠ°ΠΊΠ° Π΄Π° ΡΠ΅ ΠΊΠ°ΠΆΠ΅, ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΎΡΠΈ 2 ΠΊΡΠΌ 1. Π’ΠΎΠ΅ΡΡ, ΡΠ΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΠΈΠ·Π²Π΅Π΄Π°Ρ Π΄Π²Π° Π±ΠΈΡΠ° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ ΠΏΠΎ Π½Π°ΡΠ°ΡΡΠ²Π°ΡΠ°ΡΠ° ΠΈ ΡΠΏΠ°Π΄Π°ΡΠ°ΡΠ° ΡΠ°ΠΊΡΠΎΠ²Π° ΡΠ΅ΡΡΠΎΡΠ°. Π’ΠΎΠ²Π° ΠΎΠ·Π½Π°ΡΠ°Π²Π°, ΡΠ΅ Π² ΠΏΡΠΎΠ΅ΠΊΡΠ° FPGA ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ Π½Π΅ 740 MHz, Π° 370 MHz, Π½ΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΠΈΠ·Ρ ΠΎΠ΄Π½ΠΈΡΠ΅ Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈ DDIO Π² FPGA. Π’ΡΠΊ 370 MHz Π²Π΅ΡΠ΅ Π΅ Π΄ΠΎΡΡΠ° ΠΏΠΎΡΡΠΈΠΆΠΈΠΌΠ° ΡΠ΅ΡΡΠΎΡΠ°. ΠΠ° ΡΡΠΆΠ°Π»Π΅Π½ΠΈΠ΅ ΡΠ΅ΠΆΠΈΠΌΡΡ 1280Γ720 Π΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ΡΠΎ. ΠΠΎ-Π²ΠΈΡΠΎΠΊΠ° ΡΠ°Π·Π΄Π΅Π»ΠΈΡΠ΅Π»Π½Π° ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΏΠΎΡΡΠΈΠ³Π½Π°ΡΠ° Π² Π½Π°ΡΠΈΡ FPGA Cyclone IV, ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½ Π½Π° ΠΏΠ»Π°ΡΠΊΠ°ΡΠ° Rover2rpi.
Π ΡΠ°ΠΊΠ°, Π² ΠΏΡΠΎΠ΅ΠΊΡΠ° ΡΠ΅ΡΡΠΎΡΠ°ΡΠ° Π½Π° Π²Ρ ΠΎΠ΄Π½ΠΈΡ ΠΏΠΈΠΊΡΠ΅Π» CLK ΡΠ΅ ΠΏΠΎΠ΄Π°Π²Π° ΠΊΡΠΌ PLL, ΠΊΡΠ΄Π΅ΡΠΎ ΡΠ΅ ΡΠΌΠ½ΠΎΠΆΠ°Π²Π° ΠΏΠΎ 5. ΠΡΠΈ ΡΠ°Π·ΠΈ ΡΠ΅ΡΡΠΎΡΠ° Π±Π°ΠΉΡΠΎΠ²Π΅ΡΠ΅ R, G, B ΡΠ΅ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ²Π°Ρ Π² Π΄Π²ΠΎΠΉΠΊΠΈ Π±ΠΈΡΠΎΠ²Π΅. Π’ΠΎΠ²Π° ΠΏΡΠ°Π²ΠΈ Π΅Π½ΠΊΠΎΠ΄Π΅ΡΡΡ TMDS. ΠΠ·Ρ ΠΎΠ΄Π½ΠΈΡΡ ΠΊΠΎΠ΄ Π½Π° Verilog HDL ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΡΠ°ΠΊΠ°:
module hdmi(
input wire pixclk, // 74MHz
input wire clk_TMDS2, // 370MHz
input wire hsync,
input wire vsync,
input wire active,
input wire [7:0]red,
input wire [7:0]green,
input wire [7:0]blue,
output wire TMDS_bh,
output wire TMDS_bl,
output wire TMDS_gh,
output wire TMDS_gl,
output wire TMDS_rh,
output wire TMDS_rl
);
wire [9:0] TMDS_red, TMDS_green, TMDS_blue;
TMDS_encoder encode_R(.clk(pixclk), .VD(red ), .CD({vsync,hsync}), .VDE(active), .TMDS(TMDS_red));
TMDS_encoder encode_G(.clk(pixclk), .VD(green), .CD({vsync,hsync}), .VDE(active), .TMDS(TMDS_green));
TMDS_encoder encode_B(.clk(pixclk), .VD(blue ), .CD({vsync,hsync}), .VDE(active), .TMDS(TMDS_blue));
reg [2:0] TMDS_mod5=0; // modulus 5 counter
reg [4:0] TMDS_shift_bh=0, TMDS_shift_bl=0;
reg [4:0] TMDS_shift_gh=0, TMDS_shift_gl=0;
reg [4:0] TMDS_shift_rh=0, TMDS_shift_rl=0;
wire [4:0] TMDS_blue_l = {TMDS_blue[9],TMDS_blue[7],TMDS_blue[5],TMDS_blue[3],TMDS_blue[1]};
wire [4:0] TMDS_blue_h = {TMDS_blue[8],TMDS_blue[6],TMDS_blue[4],TMDS_blue[2],TMDS_blue[0]};
wire [4:0] TMDS_green_l = {TMDS_green[9],TMDS_green[7],TMDS_green[5],TMDS_green[3],TMDS_green[1]};
wire [4:0] TMDS_green_h = {TMDS_green[8],TMDS_green[6],TMDS_green[4],TMDS_green[2],TMDS_green[0]};
wire [4:0] TMDS_red_l = {TMDS_red[9],TMDS_red[7],TMDS_red[5],TMDS_red[3],TMDS_red[1]};
wire [4:0] TMDS_red_h = {TMDS_red[8],TMDS_red[6],TMDS_red[4],TMDS_red[2],TMDS_red[0]};
always @(posedge clk_TMDS2)
begin
TMDS_shift_bh <= TMDS_mod5[2] ? TMDS_blue_h : TMDS_shift_bh [4:1];
TMDS_shift_bl <= TMDS_mod5[2] ? TMDS_blue_l : TMDS_shift_bl [4:1];
TMDS_shift_gh <= TMDS_mod5[2] ? TMDS_green_h : TMDS_shift_gh [4:1];
TMDS_shift_gl <= TMDS_mod5[2] ? TMDS_green_l : TMDS_shift_gl [4:1];
TMDS_shift_rh <= TMDS_mod5[2] ? TMDS_red_h : TMDS_shift_rh [4:1];
TMDS_shift_rl <= TMDS_mod5[2] ? TMDS_red_l : TMDS_shift_rl [4:1];
TMDS_mod5 <= (TMDS_mod5[2]) ? 3'd0 : TMDS_mod5+3'd1;
end
assign TMDS_bh = TMDS_shift_bh[0];
assign TMDS_bl = TMDS_shift_bl[0];
assign TMDS_gh = TMDS_shift_gh[0];
assign TMDS_gl = TMDS_shift_gl[0];
assign TMDS_rh = TMDS_shift_rh[0];
assign TMDS_rl = TMDS_shift_rl[0];
endmodule
module TMDS_encoder(
input clk,
input [7:0] VD, // video data (red, green or blue)
input [1:0] CD, // control data
input VDE, // video data enable, to choose between CD (when VDE=0) and VD (when VDE=1)
output reg [9:0] TMDS = 0
);
wire [3:0] Nb1s = VD[0] + VD[1] + VD[2] + VD[3] + VD[4] + VD[5] + VD[6] + VD[7];
wire XNOR = (Nb1s>4'd4) || (Nb1s==4'd4 && VD[0]==1'b0);
wire [8:0] q_m = {~XNOR, q_m[6:0] ^ VD[7:1] ^ {7{XNOR}}, VD[0]};
reg [3:0] balance_acc = 0;
wire [3:0] balance = q_m[0] + q_m[1] + q_m[2] + q_m[3] + q_m[4] + q_m[5] + q_m[6] + q_m[7] - 4'd4;
wire balance_sign_eq = (balance[3] == balance_acc[3]);
wire invert_q_m = (balance==0 || balance_acc==0) ? ~q_m[8] : balance_sign_eq;
wire [3:0] balance_acc_inc = balance - ({q_m[8] ^ ~balance_sign_eq} & ~(balance==0 || balance_acc==0));
wire [3:0] balance_acc_new = invert_q_m ? balance_acc-balance_acc_inc : balance_acc+balance_acc_inc;
wire [9:0] TMDS_data = {invert_q_m, q_m[8], q_m[7:0] ^ {8{invert_q_m}}};
wire [9:0] TMDS_code = CD[1] ? (CD[0] ? 10'b1010101011 : 10'b0101010100) : (CD[0] ? 10'b0010101011 : 10'b1101010100);
always @(posedge clk) TMDS <= VDE ? TMDS_data : TMDS_code;
always @(posedge clk) balance_acc <= VDE ? balance_acc_new : 4'h0;
endmodule
Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΠΈΠ·Ρ ΠΎΠ΄Π½ΠΈΡΠ΅ Π΄Π²ΠΎΠΉΠΊΠΈ ΡΠ΅ ΠΏΠΎΠ΄Π°Π²Π°Ρ ΠΊΡΠΌ ΠΈΠ·Ρ ΠΎΠ΄Π° DDIO, ΠΊΠΎΠΉΡΠΎ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ ΠΏΡΠΎΠΈΠ·Π²Π΅ΠΆΠ΄Π° Π΅Π΄Π½ΠΎΠ±ΠΈΡΠΎΠ² ΡΠΈΠ³Π½Π°Π» ΠΏΡΠΈ Π½Π°ΡΠ°ΡΡΠ²Π°Π½Π΅ ΠΈ ΡΠΏΠ°Π΄.
Π‘Π°ΠΌΠΈΡΡ DDIO ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΎΠΏΠΈΡΠ°Π½ Ρ Verilog ΠΊΠΎΠ΄ ΠΏΠΎ ΡΠ»Π΅Π΄Π½ΠΈΡ Π½Π°ΡΠΈΠ½:
module ddio(
input wire d0,
input wire d1,
input wire clk,
output wire out
);
reg r_d0;
reg r_d1;
always @(posedge clk)
begin
r_d0 <= d0;
r_d1 <= d1;
end
assign out = clk ? r_d0 : r_d1;
endmodule
ΠΠΎ Π²Π΅ΡΠΎΡΡΠ½ΠΎ Π½ΡΠΌΠ° Π΄Π° ΡΠ°Π±ΠΎΡΠΈ ΠΏΠΎ ΡΠΎΠ·ΠΈ Π½Π°ΡΠΈΠ½. Π’ΡΡΠ±Π²Π° Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΠΌΠ΅Π³Π°ΡΡΠ½ΠΊΡΠΈΡΡΠ° ALTDDIO_OUT Π½Π° Altera, Π·Π° Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΡΠ΅Π°Π»Π½ΠΎ DDIO ΠΈΠ·Ρ ΠΎΠ΄Π½ΠΈΡΠ΅ Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈ. Π ΠΌΠΎΡ ΠΏΡΠΎΠ΅ΠΊΡ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΡΠ½ΠΈΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ALTDDIO_OUT.
ΠΠΎΠΆΠ΅ Π²ΡΠΈΡΠΊΠΎ Π΄Π° ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΠΌΠ°Π»ΠΊΠΎ ΡΠ»ΠΎΠΆΠ½ΠΎ, Π½ΠΎ ΡΠ°Π±ΠΎΡΠΈ.
ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡΠ΅ ΡΠ΅Π»ΠΈΡ ΠΈΠ·Ρ
ΠΎΠ΄Π΅Π½ ΠΊΠΎΠ΄, Π½Π°ΠΏΠΈΡΠ°Π½ Π½Π° Verilog HDL
ΠΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½ΠΈΡΡ ΡΡΡΠΌΡΠ΅Ρ Π·Π° FPGA Π΅ Π²Π³ΡΠ°Π΄Π΅Π½ Π² EPCS ΡΠΈΠΏΠ°, ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½ Π½Π° ΠΏΠ»Π°ΡΠΊΠ°ΡΠ° Mars Rover2rpi. ΠΠΎ ΡΠΎΠ·ΠΈ Π½Π°ΡΠΈΠ½, ΠΊΠΎΠ³Π°ΡΠΎ ΡΠ΅ ΠΏΠΎΠ΄Π°Π΄Π΅ Π·Π°Ρ ΡΠ°Π½Π²Π°Π½Π΅ ΠΊΡΠΌ FPGA ΠΏΠ»Π°ΡΠΊΠ°ΡΠ°, FPGA ΡΠ΅ ΡΠ΅ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠ° ΠΎΡ ΡΠ»Π°Ρ ΠΏΠ°ΠΌΠ΅Ρ ΠΈ ΡΠ΅ ΡΡΠ°ΡΡΠΈΡΠ°.
Π‘Π΅Π³Π° ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΠΎΠ³ΠΎΠ²ΠΎΡΠΈΠΌ ΠΌΠ°Π»ΠΊΠΎ Π·Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° Π½Π° ΡΠ°ΠΌΠ°ΡΠ° Raspberry.
ΠΡΠ°Π²Ρ Π΅ΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΈ Ρ Raspberry PI OS (32 Π±ΠΈΡΠ°) Π½Π° Π±Π°Π·Π°ΡΠ° Π½Π° Debian Buster, Π²Π΅ΡΡΠΈΡ: Π°Π²Π³ΡΡΡ 2020 Π³.
ΠΠ°ΡΠ° Π½Π° ΠΈΠ·Π΄Π°Π²Π°Π½Π΅: 2020-08-20, ΠΠ΅ΡΡΠΈΡ Π½Π° ΡΠ΄ΡΠΎΡΠΎ: 5.4.
Π’ΡΡΠ±Π²Π° Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ Π΄Π²Π΅ Π½Π΅ΡΠ°:
- ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠ°ΠΉΡΠ΅ ΡΠ°ΠΉΠ»Π° config.txt;
- ΡΡΠ·Π΄Π°ΠΉΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π½Π° X ΡΡΡΠ²ΡΡ Π·Π° ΡΠ°Π±ΠΎΡΠ° Ρ Π΄Π²Π° ΠΌΠΎΠ½ΠΈΡΠΎΡΠ°.
ΠΠΎΠ³Π°ΡΠΎ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠ°ΡΠ΅ ΡΠ°ΠΉΠ»Π° /boot/config.txt, ΡΡΡΠ±Π²Π° Π΄Π°:
- Π΄Π΅Π°ΠΊΡΠΈΠ²ΠΈΡΠ°ΠΉΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° i2c, i2s, spi;
- Π°ΠΊΡΠΈΠ²ΠΈΡΠ°Π½Π΅ Π½Π° DPI ΡΠ΅ΠΆΠΈΠΌ Ρ Π½Π°ΡΠ»Π°Π³Π²Π°Π½Π΅ dtoverlay=dpi24;
- Π·Π°Π΄Π°ΠΉΡΠ΅ Π²ΠΈΠ΄Π΅ΠΎ ΡΠ΅ΠΆΠΈΠΌ 1280Γ720 60Hz, 24 Π±ΠΈΡΠ° Π½Π° ΡΠΎΡΠΊΠ° Π½Π° DPI;
- ΠΏΠΎΡΠΎΡΠ΅ΡΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈΡ Π±ΡΠΎΠΉ framebuffers 2 (max_framebuffers=2, ΡΠ°ΠΌΠΎ ΡΠΎΠ³Π°Π²Π° ΡΠ΅ ΡΠ΅ ΠΏΠΎΡΠ²ΠΈ Π²ΡΠΎΡΠΎΡΠΎ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ /dev/fb1)
ΠΡΠ»Π½ΠΈΡΡ ΡΠ΅ΠΊΡΡ Π½Π° ΡΠ°ΠΉΠ»Π° config.txt ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΡΠ°ΠΊΠ°.
# For more options and information see
# http://rpf.io/configtxt
# Some settings may impact device functionality. See link above for details
# uncomment if you get no picture on HDMI for a default "safe" mode
#hdmi_safe=1
# uncomment this if your display has a black border of unused pixels visible
# and your display can output without overscan
disable_overscan=1
# uncomment the following to adjust overscan. Use positive numbers if console
# goes off screen, and negative if there is too much border
#overscan_left=16
#overscan_right=16
#overscan_top=16
#overscan_bottom=16
# uncomment to force a console size. By default it will be display's size minus
# overscan.
#framebuffer_width=1280
#framebuffer_height=720
# uncomment if hdmi display is not detected and composite is being output
hdmi_force_hotplug=1
# uncomment to force a specific HDMI mode (this will force VGA)
#hdmi_group=1
#hdmi_mode=1
# uncomment to force a HDMI mode rather than DVI. This can make audio work in
# DMT (computer monitor) modes
#hdmi_drive=2
# uncomment to increase signal to HDMI, if you have interference, blanking, or
# no display
#config_hdmi_boost=4
# uncomment for composite PAL
#sdtv_mode=2
#uncomment to overclock the arm. 700 MHz is the default.
#arm_freq=800
# Uncomment some or all of these to enable the optional hardware interfaces
#dtparam=i2c_arm=on
#dtparam=i2s=on
#dtparam=spi=on
dtparam=i2c_arm=off
dtparam=spi=off
dtparam=i2s=off
dtoverlay=dpi24
overscan_left=0
overscan_right=0
overscan_top=0
overscan_bottom=0
framebuffer_width=1280
framebuffer_height=720
display_default_lcd=0
enable_dpi_lcd=1
dpi_group=2
dpi_mode=87
#dpi_group=1
#dpi_mode=4
dpi_output_format=0x6f027
dpi_timings=1280 1 110 40 220 720 1 5 5 20 0 0 0 60 0 74000000 3
# Uncomment this to enable infrared communication.
#dtoverlay=gpio-ir,gpio_pin=17
#dtoverlay=gpio-ir-tx,gpio_pin=18
# Additional overlays and parameters are documented /boot/overlays/README
# Enable audio (loads snd_bcm2835)
dtparam=audio=on
[pi4]
# Enable DRM VC4 V3D driver on top of the dispmanx display stack
#dtoverlay=vc4-fkms-v3d
max_framebuffers=2
[all]
#dtoverlay=vc4-fkms-v3d
max_framebuffers=2
Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΡΡΡΠ±Π²Π° Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π΅Π½ ΡΠ°ΠΉΠ» Π·Π° X ΡΡΡΠ²ΡΡΠ°, Π·Π° Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ Π΄Π²Π° ΠΌΠΎΠ½ΠΈΡΠΎΡΠ° Π½Π° Π΄Π²Π° ΡΡΠ΅ΠΉΠΌΠ±ΡΡΠ΅ΡΠ° /dev/fb0 ΠΈ /dev/fb1:
ΠΠΎΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π΅Π½ ΡΠ°ΠΉΠ» Π΅ /usr/share/x11/xorg.conf.d/60-dualscreen.conf ΡΠ°ΠΊΠ°
Section "Device"
Identifier "LCD"
Driver "fbturbo"
Option "fbdev" "/dev/fb0"
Option "ShadowFB" "off"
Option "SwapbuffersWait" "true"
EndSection
Section "Device"
Identifier "HDMI"
Driver "fbturbo"
Option "fbdev" "/dev/fb1"
Option "ShadowFB" "off"
Option "SwapbuffersWait" "true"
EndSection
Section "Monitor"
Identifier "LCD-monitor"
Option "Primary" "true"
EndSection
Section "Monitor"
Identifier "HDMI-monitor"
Option "RightOf" "LCD-monitor"
EndSection
Section "Screen"
Identifier "screen0"
Device "LCD"
Monitor "LCD-monitor"
EndSection
Section "Screen"
Identifier "screen1"
Device "HDMI"
Monitor "HDMI-monitor"
EndSection
Section "ServerLayout"
Identifier "default"
Option "Xinerama" "on"
Option "Clone" "off"
Screen 0 "screen0"
Screen 1 "screen1" RightOf "screen0"
EndSection
Π, Π°ΠΊΠΎ Π²Π΅ΡΠ΅ Π½Π΅ Π΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½, ΡΠΎΠ³Π°Π²Π° ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΠ΅ Xinerama. Π’ΠΎΠ³Π°Π²Π° ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎΡΠΎ Π½Π° ΡΠ°Π±ΠΎΡΠ½ΠΈΡ ΠΏΠ»ΠΎΡ ΡΠ΅ Π±ΡΠ΄Π΅ Π½Π°ΠΏΡΠ»Π½ΠΎ ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΎ Π΄ΠΎ Π΄Π²Π° ΠΌΠΎΠ½ΠΈΡΠΎΡΠ°, ΠΊΠ°ΠΊΡΠΎ Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈΡ Π²ΠΈΠ΄Π΅ΠΎΠΊΠ»ΠΈΠΏ ΠΏΠΎ-Π³ΠΎΡΠ΅.
Π’ΠΎΠ²Π° Π΅ ΠΌΠΎΠΆΠ΅ Π±ΠΈ Π²ΡΠΈΡΠΊΠΎ. Π‘Π΅Π³Π° ΡΠΎΠ±ΡΡΠ²Π΅Π½ΠΈΡΠΈΡΠ΅ Π½Π° Raspberry Pi3 ΡΠ΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Π΄Π²Π° ΠΌΠΎΠ½ΠΈΡΠΎΡΠ°.
ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΈ Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠ° Π½Π° ΠΏΠ»Π°ΡΠΊΠ°ΡΠ° Mars Rover2rpi ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com