ΠΠ²Π° Π²ΠΈΠ΄Π΅ΠΎ ΠΏΠΎΠΊΠ°ΠΆΡΠ²Π°: ΠΏΠ»ΠΎΡΠΊΠ° Raspberry Pi3, ΠΏΠΎΠ²ΡΠ·Π°Π½Π° ΡΠΎ Π½Π΅Π° ΠΏΡΠ΅ΠΊΡ GPIO ΠΊΠΎΠ½Π΅ΠΊΡΠΎΡΠΎΡ Π΅ FPGA ΠΏΠ»ΠΎΡΠ° Mars Rover2rpi (Cyclone IV), Π½Π° ΠΊΠΎΡΠ° Π΅ ΠΏΠΎΠ²ΡΠ·Π°Π½ HDMI ΠΌΠΎΠ½ΠΈΡΠΎΡ. ΠΡΠΎΡΠΈΠΎΡ ΠΌΠΎΠ½ΠΈΡΠΎΡ Π΅ ΠΏΠΎΠ²ΡΠ·Π°Π½ ΠΏΡΠ΅ΠΊΡ ΡΡΠ°Π½Π΄Π°ΡΠ΄Π½ΠΈΠΎΡ HDMI ΠΊΠΎΠ½Π΅ΠΊΡΠΎΡ Π½Π° Raspberry Pi3. Π‘Γ¨ ΡΠ°Π±ΠΎΡΠΈ Π·Π°Π΅Π΄Π½ΠΎ ΠΊΠ°ΠΊΠΎ ΡΠΈΡΡΠ΅ΠΌ ΡΠΎ Π΄Π²ΠΎΠ΅Π½ ΠΌΠΎΠ½ΠΈΡΠΎΡ.
Π‘Π»Π΅Π΄Π½ΠΎ ΡΠ΅ Π²ΠΈ ΠΊΠ°ΠΆΠ°ΠΌ ΠΊΠ°ΠΊΠΎ ΡΠ΅ ΡΠΏΡΠΎΠ²Π΅Π΄ΡΠ²Π° ΠΎΠ²Π°.
ΠΠΎΠΏΡΠ»Π°ΡΠ½Π°ΡΠ° ΠΏΠ»ΠΎΡΠΊΠ° Raspberry Pi3 ΠΈΠΌΠ° GPIO ΠΊΠΎΠ½Π΅ΠΊΡΠΎΡ ΠΏΡΠ΅ΠΊΡ ΠΊΠΎΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΠΎΠ²ΡΠ·Π΅ΡΠ΅ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΊΠ°ΡΡΠΈΡΠΊΠΈ Π·Π° ΠΏΡΠΎΡΠΈΡΡΠ²Π°ΡΠ΅: ΡΠ΅Π½Π·ΠΎΡΠΈ, LED Π΄ΠΈΠΎΠ΄ΠΈ, Π΄ΡΠ°ΡΠ²Π΅ΡΠΈ Π·Π° ΡΡΠ΅ΠΏΠ΅Ρ ΠΌΠΎΡΠΎΡΠΈ ΠΈ ΠΌΠ½ΠΎΠ³Ρ ΠΏΠΎΠ²Π΅ΡΠ΅. Π’ΠΎΡΠ½Π°ΡΠ° ΡΡΠ½ΠΊΡΠΈΡΠ° Π½Π° ΡΠ΅ΠΊΠΎΡ ΠΏΠΈΠ½ Π½Π° ΠΊΠΎΠ½Π΅ΠΊΡΠΎΡΠΎΡ Π·Π°Π²ΠΈΡΠΈ ΠΎΠ΄ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°ΡΠ° Π½Π° ΠΏΠΎΡΡΠ°ΡΠ°. ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°ΡΠ° GPIO ALT2 Π²ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π° Π΄Π° Π³ΠΎ ΠΏΡΠ΅ΡΡΠ»ΠΈΡΠ΅ ΠΊΠΎΠ½Π΅ΠΊΡΠΎΡΠΎΡ Π²ΠΎ ΡΠ΅ΠΆΠΈΠΌ Π½Π° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΡΡ DPI, ΠΡΠΈΠΊΠ°ΠΆΠΈ ΠΏΠ°ΡΠ°Π»Π΅Π»Π΅Π½ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΡΡ. ΠΠΎΡΡΠΎΡΠ°Ρ ΠΊΠ°ΡΡΠΈΡΠΊΠΈ Π·Π° ΠΏΡΠΎΡΠΈΡΡΠ²Π°ΡΠ΅ Π·Π° ΠΏΠΎΠ²ΡΠ·ΡΠ²Π°ΡΠ΅ Π½Π° 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 ΠΏΠΎΡΡΠΈ ΠΈ Π·Π° ΠΏΠΎΠ²ΡΠ·ΡΠ²Π°ΡΠ΅ Π½Π° ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΏΠ΅ΡΠΈΡΠ΅ΡΠ½ΠΈ ΡΡΠ΅Π΄ΠΈ ΡΠΎ raspberry. ΠΠΎ ΠΈΡΡΠΎ Π²ΡΠ΅ΠΌΠ΅, 4 GPIO ΡΠΈΠ³Π½Π°Π»ΠΈ ΡΠΎ ΠΎΠ²Π°Π° Π²ΡΡΠΊΠ° ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠ°Ρ Π·Π° JTAG ΡΠΈΠ³Π½Π°Π»ΠΈ, ΡΠ°ΠΊΠ° ΡΡΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° ΠΎΠ΄ Raspberry ΠΌΠΎΠΆΠ΅ Π΄Π° Π³ΠΎ Π²ΡΠΈΡΠ° ΡΠΈΡΠΌΠ²Π΅ΡΠΎΡ FPGA Π²ΠΎ FPGA. ΠΠΎΡΠ°Π΄ΠΈ ΠΎΠ²Π°, ΠΎΠ²Π°Π° ΡΡΠ°Π½Π΄Π°ΡΠ΄Π½Π° Π²ΡΡΠΊΠ° Π½Π΅ ΠΌΠΈ ΠΎΠ΄Π³ΠΎΠ²Π°ΡΠ°; 4 DPI ΡΠΈΠ³Π½Π°Π»ΠΈ ΠΈΡΠΏΠ°ΡΠ°Π°Ρ. ΠΠ° ΡΡΠ΅ΡΠ°, Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»Π½ΠΈΡΠ΅ ΡΠ΅ΡΠ»ΠΈ Π½Π° ΡΠ°Π±Π»Π°ΡΠ° ΠΈΠΌΠ°Π°Ρ ΠΏΠΈΠ½ΡΡ ΠΊΠΎΠΌΠΏΠ°ΡΠΈΠ±ΠΈΠ»Π΅Π½ ΡΠΎ Raspberry. Π’Π°ΠΊΠ°, ΠΌΠΎΠΆΠ°ΠΌ Π΄Π° ΡΠ° ΡΠΎΡΠΈΡΠ°ΠΌ ΡΠ°Π±Π»Π°ΡΠ° Π·Π° 90 ΡΡΠ΅ΠΏΠ΅Π½ΠΈ ΠΈ ΡΠ΅ΠΏΠ°ΠΊ Π΄Π° ΡΠ° ΠΏΠΎΠ²ΡΠ·Π°ΠΌ ΡΠΎ ΠΌΠΎΡΠ°ΡΠ° ΠΌΠ°Π»ΠΈΠ½Π°:
Π‘Π΅ΠΊΠ°ΠΊΠΎ, ΡΠ΅ ΠΌΠΎΡΠ° Π΄Π° ΠΊΠΎΡΠΈΡΡΠΈΡΠ΅ Π½Π°Π΄Π²ΠΎΡΠ΅ΡΠ΅Π½ JTAG ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ΅Ρ, Π½ΠΎ ΡΠΎΠ° Π½Π΅ Π΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌ.
Π‘Π΅ ΡΡΡΠ΅ ΠΈΠΌΠ° ΠΌΠ°Π» ΠΏΡΠΎΠ±Π»Π΅ΠΌ. ΠΠ΅ ΡΠ΅ΠΊΠΎΡ FPGA ΠΏΠΈΠ½ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠΈ ΠΊΠ°ΠΊΠΎ Π²Π»Π΅Π·Π΅Π½ ΡΠ°ΡΠΎΠ²Π½ΠΈΠΊ. ΠΠΌΠ° ΡΠ°ΠΌΠΎ Π½Π΅ΠΊΠΎΠ»ΠΊΡ ΠΏΠΎΡΠ²Π΅ΡΠ΅Π½ΠΈ ΠΈΠ³Π»ΠΈΡΠΊΠΈ ΠΊΠΎΠΈ ΠΌΠΎΠΆΠ°Ρ Π΄Π° ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠ°Ρ Π·Π° ΠΎΠ²ΠΈΠ΅ ΡΠ΅Π»ΠΈ. Π’Π°ΠΊΠ°, ΠΎΠ²Π΄Π΅ ΡΠ΅ ΠΏΠΎΠΊΠ°ΠΆΠ° Π΄Π΅ΠΊΠ° ΡΠΈΠ³Π½Π°Π»ΠΎΡ GPIO_0 CLK Π½Π΅ Π³ΠΎ Π΄ΠΎΡΡΠΈΠ³Π½ΡΠ²Π° Π²Π»Π΅Π·ΠΎΡ FPGA, ΠΊΠΎΡ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠΈ ΠΊΠ°ΠΊΠΎ Π²Π»Π΅Π· Π½Π° ΡΠ°ΡΠΎΠ²Π½ΠΈΠΊΠΎΡ FPGA. Π’Π°ΠΊΠ°, ΡΠ΅ΠΏΠ°ΠΊ ΠΌΠΎΡΠ°Π² Π΄Π° ΡΡΠ°Π²Π°ΠΌ Π΅Π΄Π½Π° ΠΆΠΈΡΠ° Π½Π° ΡΠ°Π»ΠΎΡ. ΠΠΈ ΠΏΠΎΠ²ΡΠ·ΡΠ²Π°ΠΌ GPIO_0 ΠΈ ΡΠΈΠ³Π½Π°Π»ΠΎΡ KEY[1] Π½Π° ΡΠ°Π±Π»Π°ΡΠ°:
Π‘Π΅Π³Π° ΡΠ΅ Π²ΠΈ ΠΊΠ°ΠΆΠ°ΠΌ ΠΌΠ°Π»ΠΊΡ Π·Π° ΠΏΡΠΎΠ΅ΠΊΡΠΎΡ FPGA. ΠΠ»Π°Π²Π½Π°ΡΠ° ΡΠ΅ΡΠΊΠΎΡΠΈΡΠ° Π²ΠΎ Π³Π΅Π½Π΅ΡΠΈΡΠ°ΡΠ΅ΡΠΎ HDMI ΡΠΈΠ³Π½Π°Π»ΠΈ ΡΠ΅ ΠΌΠ½ΠΎΠ³Ρ Π²ΠΈΡΠΎΠΊΠΈΡΠ΅ ΡΡΠ΅ΠΊΠ²Π΅Π½ΡΠΈΠΈ. ΠΠΊΠΎ Π³ΠΎ ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ΡΠ΅ ΠΏΡΠΈΠΊΠ»ΡΡΠΎΠΊΠΎΡ Π·Π° HDMI ΠΊΠΎΠ½Π΅ΠΊΡΠΎΡΠΎΡ, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡΠ΅ Π΄Π΅ΠΊΠ° RGB ΡΠΈΠ³Π½Π°Π»ΠΈΡΠ΅ ΡΠ΅Π³Π° ΡΠ΅ ΡΠ΅ΡΠΈΡΠΊΠΈ Π΄ΠΈΡΠ΅ΡΠ΅Π½ΡΠΈΡΠ°Π»Π½ΠΈ ΡΠΈΠ³Π½Π°Π»ΠΈ:
Π£ΠΏΠΎΡΡΠ΅Π±Π°ΡΠ° Π½Π° Π΄ΠΈΡΠ΅ΡΠ΅Π½ΡΠΈΡΠ°Π»Π΅Π½ ΡΠΈΠ³Π½Π°Π» Π²ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π° Π΄Π° ΡΠ΅ Π±ΠΎΡΠΈΡΠ΅ ΡΠΎ ΠΏΡΠ΅ΡΠΊΠΈ Π½Π° Π·Π°Π΅Π΄Π½ΠΈΡΠΊΠΈΠΎΡ ΡΠ΅ΠΆΠΈΠΌ Π½Π° Π΄Π°Π»Π½ΠΎΠ²ΠΎΠ΄ΠΎΡ. ΠΠΎ ΠΎΠ²ΠΎΡ ΡΠ»ΡΡΠ°Ρ, ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»Π½ΠΈΠΎΡ ΠΎΡΡΠΌ-Π±ΠΈΡΠ΅Π½ ΠΊΠΎΠ΄ Π½Π° ΡΠ΅ΠΊΠΎΡ ΡΠΈΠ³Π½Π°Π» Π²ΠΎ Π±ΠΎΡΠ° ΡΠ΅ ΠΏΡΠ΅ΡΠ²ΠΎΡΠ° Π²ΠΎ 10-Π±ΠΈΡΠ½Π° TMDS (ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡΠ°Π½Π° Π΄ΠΈΡΠ΅ΡΠ΅Π½ΡΠΈΡΠ°Π»Π½Π° ΡΠΈΠ³Π½Π°Π»ΠΈΠ·Π°ΡΠΈΡΠ° ΡΠΎ ΡΡΠ°Π½Π·ΠΈΡΠΈΡΠ°). ΠΠ²Π° Π΅ ΡΠΏΠ΅ΡΠΈΡΠ°Π»Π΅Π½ ΠΌΠ΅ΡΠΎΠ΄ Π·Π° ΠΊΠΎΠ΄ΠΈΡΠ°ΡΠ΅ Π·Π° ΠΎΡΡΡΡΠ°Π½ΡΠ²Π°ΡΠ΅ Π½Π° DC ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°ΡΠ° ΠΎΠ΄ ΡΠΈΠ³Π½Π°Π»ΠΎΡ ΠΈ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡΠ°ΡΠ΅ Π½Π° ΠΏΡΠ΅ΡΡΠ»ΡΠ²Π°ΡΠ΅ΡΠΎ Π½Π° ΡΠΈΠ³Π½Π°Π»ΠΎΡ Π²ΠΎ Π΄ΠΈΡΠ΅ΡΠ΅Π½ΡΠΈΡΠ°Π»Π½Π°ΡΠ° Π»ΠΈΠ½ΠΈΡΠ°. ΠΠΈΠ΄Π΅ΡΡΠΈ 10 Π±ΠΈΡΠ° ΡΠ΅Π³Π° ΡΡΠ΅Π±Π° Π΄Π° ΡΠ΅ ΠΏΡΠ΅Π½Π΅ΡΠ°Ρ ΠΏΡΠ΅ΠΊΡ ΡΠ΅ΡΠΈΡΠΊΠ°ΡΠ° Π»ΠΈΠ½ΠΈΡΠ° Π·Π° Π΅Π΄Π΅Π½ Π±Π°ΡΡ Π±ΠΎΡΠ°, ΠΈΠ·Π»Π΅Π³ΡΠ²Π° Π΄Π΅ΠΊΠ° Π±ΡΠ·ΠΈΠ½Π°ΡΠ° Π½Π° ΡΠ°ΡΠΎΠ²Π½ΠΈΠΊΠΎΡ Π½Π° ΡΠ΅ΡΠΈΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡΠ°ΡΠ° ΠΌΠΎΡΠ° Π΄Π° Π±ΠΈΠ΄Π΅ 10 ΠΏΠ°ΡΠΈ ΠΏΠΎΠ³ΠΎΠ»Π΅ΠΌΠ° ΠΎΠ΄ Π±ΡΠ·ΠΈΠ½Π°ΡΠ° Π½Π° ΡΠ°ΡΠΎΠ²Π½ΠΈΠΊΠΎΡ Π½Π° ΠΏΠΈΠΊΡΠ΅Π»ΠΈΡΠ΅. ΠΠΊΠΎ Π³ΠΎ Π·Π΅ΠΌΠ΅ΠΌΠ΅ Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ Π²ΠΈΠ΄Π΅ΠΎ ΡΠ΅ΠΆΠΈΠΌΠΎΡ 1280x720 60Hz, ΡΠΎΠ³Π°Ρ ΡΡΠ΅ΠΊΠ²Π΅Π½ΡΠΈΡΠ°ΡΠ° Π½Π° ΠΏΠΈΠΊΡΠ΅Π»ΠΈ Π½Π° ΠΎΠ²ΠΎΡ ΡΠ΅ΠΆΠΈΠΌ Π΅ 74,25 MHz. Π‘Π΅ΡΠΈΡΠΈΠ·Π°ΡΠΎΡΠΎΡ ΡΡΠ΅Π±Π° Π΄Π° Π±ΠΈΠ΄Π΅ 742,5 MHz.
Π Π΅Π΄ΠΎΠ²Π½ΠΈΡΠ΅ FPGA, Π·Π° ΠΆΠ°Π», Π½Π΅ ΡΠ΅ ΡΠΏΠΎΡΠΎΠ±Π½ΠΈ Π·Π° ΠΎΠ²Π°. Π‘Π΅ΠΏΠ°ΠΊ, Π·Π° Π½Π°ΡΠ° ΡΡΠ΅ΡΠ°, FPGA ΠΈΠΌΠ° Π²Π³ΡΠ°Π΄Π΅Π½ΠΈ DDIO ΠΏΠΈΠ½ΠΎΠ²ΠΈ. ΠΠ²Π° ΡΠ΅ Π·Π°ΠΊΠ»ΡΡΠΎΡΠΈ ΠΊΠΎΠΈ ΡΠ΅ Π²Π΅ΡΠ΅, ΠΊΠ°ΠΊΠΎ Π΄Π° ΡΠ΅, ΡΠ΅ΡΠΈΡΠ°Π»ΠΈΠ·Π°ΡΠΎΡΠΈ 2-Π½Π°-1. Π’ΠΎΠ° Π΅, ΡΠΈΠ΅ ΠΌΠΎΠΆΠ°Ρ Π΄Π° ΠΈΠ·Π»Π΅Π·Π°Ρ Π΄Π²Π° Π±ΠΈΡΠ° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ Π½Π° ΡΠ°ΡΡΠ΅ΡΠΊΠΈΡΠ΅ ΠΈ ΠΎΠΏΠ°ΡΠ°ΡΠΊΠΈΡΠ΅ ΡΠ°Π±ΠΎΠ²ΠΈ Π½Π° ΡΡΠ΅ΠΊΠ²Π΅Π½ΡΠΈΡΠ°ΡΠ° Π½Π° ΡΠ°ΡΠΎΠ²Π½ΠΈΠΊΠΎΡ. ΠΠ²Π° Π·Π½Π°ΡΠΈ Π΄Π΅ΠΊΠ° Π²ΠΎ ΠΏΡΠΎΠ΅ΠΊΡ FPGA Π½Π΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΊΠΎΡΠΈΡΡΠΈΡΠ΅ 740 MHz, ΡΡΠΊΡ 370 MHz, Π½ΠΎ ΡΡΠ΅Π±Π° Π΄Π° ΠΊΠΎΡΠΈΡΡΠΈΡΠ΅ DDIO ΠΈΠ·Π»Π΅Π·Π½ΠΈ Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈ Π²ΠΎ FPGA. Π‘Π΅Π³Π° 370 MHz Π΅ Π²Π΅ΡΠ΅ ΡΠ΅Π»ΠΎΡΠ½ΠΎ Π΄ΠΎΡΡΠΈΠΆΠ½Π° ΡΡΠ΅ΠΊΠ²Π΅Π½ΡΠΈΡΠ°. ΠΠ° ΠΆΠ°Π», ΡΠ΅ΠΆΠΈΠΌΠΎΡ 1280x720 Π΅ Π³ΡΠ°Π½ΠΈΡΠ°. ΠΠ΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΏΠΎΡΡΠΈΠ³Π½Π΅ ΠΏΠΎΠ³ΠΎΠ»Π΅ΠΌΠ° ΡΠ΅Π·ΠΎΠ»ΡΡΠΈΡΠ° Π²ΠΎ Π½Π°ΡΠΈΠΎΡ Cyclone IV FPGA ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½ Π½Π° ΠΏΠ»ΠΎΡΠΊΠ°ΡΠ° Mars 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
ΠΠΎ, Π½Π°ΡΠ²Π΅ΡΠΎΡΠ°ΡΠ½ΠΎ Π½Π΅ΠΌΠ° Π΄Π° ΡΡΠ½ΠΊΡΠΈΠΎΠ½ΠΈΡΠ° Π½Π° ΡΠΎΡ Π½Π°ΡΠΈΠ½. Π’ΡΠ΅Π±Π° Π΄Π° ΡΠ° ΠΊΠΎΡΠΈΡΡΠΈΡΠ΅ ΠΌΠ΅Π³Π°ΡΡΠ½ΠΊΡΠΈΡΠ°ΡΠ° Π½Π° Alter ALTDDIO_OUT Π·Π° Π΄Π° Π³ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΠΈΡΠ΅ ΠΈΠ·Π»Π΅Π·Π½ΠΈΡΠ΅ Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈ DDIO. ΠΠΎΡΠΎΡ ΠΏΡΠΎΠ΅ΠΊΡ ΡΠ° ΠΊΠΎΡΠΈΡΡΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°ΡΠ° Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ° ALTDDIO_OUT.
Π‘Π΅ΡΠΎ ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠ·Π³Π»Π΅Π΄Π° ΠΌΠ°Π»ΠΊΡ Π½Π΅Π·Π³ΠΎΠ΄Π½ΠΎ, Π½ΠΎ ΡΡΠ½ΠΊΡΠΈΠΎΠ½ΠΈΡΠ°.
ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π³ΠΎ Π²ΠΈΠ΄ΠΈΡΠ΅ ΡΠ΅Π»ΠΈΠΎΡ ΠΈΠ·Π²ΠΎΡΠ΅Π½ ΠΊΠΎΠ΄ Π½Π°ΠΏΠΈΡΠ°Π½ Π²ΠΎ Verilog HDL
ΠΠΎΠΌΠΏΠ°ΡΠ»ΠΈΡΠ°Π½ΠΈΠΎΡ ΡΠΈΡΠΌΠ²Π΅Ρ Π·Π° FPGA ΡΠ΅ Π²ΠΊΠ»ΡΡΡΠ²Π° Π²ΠΎ ΡΠΈΠΏΠΎΡ EPCS ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½ Π½Π° ΠΏΠ»ΠΎΡΠΊΠ°ΡΠ° Mars Rover2rpi. Π’Π°ΠΊΠ°, ΠΊΠΎΠ³Π° Π½Π°ΠΏΠΎΡΡΠ²Π°ΡΠ΅ΡΠΎ ΡΠ΅ ΡΠ΅ ΠΏΡΠΈΠΌΠ΅Π½ΠΈ Π½Π° FPGA ΠΏΠ»ΠΎΡΠ°ΡΠ°, FPGA ΡΠ΅ ΡΠ΅ ΠΈΠ½ΠΈΡΠΈΡΠ°Π»ΠΈΠ·ΠΈΡΠ° ΠΎΠ΄ ΡΠ»Π΅Ρ ΠΌΠ΅ΠΌΠΎΡΠΈΡΠ°ΡΠ° ΠΈ ΡΠ΅ ΡΡΠ°ΡΡΡΠ²Π°.
Π‘Π΅Π³Π° ΡΡΠ΅Π±Π° Π΄Π° Π·Π±ΠΎΡΡΠ²Π°ΠΌΠ΅ ΠΌΠ°Π»ΠΊΡ Π·Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°ΡΠ° Π½Π° ΡΠ°ΠΌΠ°ΡΠ° ΠΠ°Π»ΠΈΠ½Π°.
ΠΡΠ°Π²Π°ΠΌ Π΅ΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΈ Π½Π° 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