Π’Ρ‚ΠΎΡ€ΠΈ HDMI ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ към Raspberry Pi3 Ρ‡Ρ€Π΅Π· DPI интСрфСйс ΠΈ FPGA ΠΏΠ»Π°Ρ‚ΠΊΠ°


Π’ΠΎΠ²Π° Π²ΠΈΠ΄Π΅ΠΎ ΠΏΠΎΠΊΠ°Π·Π²Π°: ΠΏΠ»Π°Ρ‚ΠΊΠ° 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 ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€Π° ΠΈΠΌΠ°Ρ‚ слСдното Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅:

Π’Ρ‚ΠΎΡ€ΠΈ HDMI ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ към Raspberry Pi3 Ρ‡Ρ€Π΅Π· DPI интСрфСйс ΠΈ FPGA ΠΏΠ»Π°Ρ‚ΠΊΠ°

Π’ΡƒΠΊ ΠΎΡ†Π²Π΅Ρ‚ΠΈΡ… RGB Ρ‰ΠΈΡ„Ρ‚ΠΎΠ²Π΅Ρ‚Π΅ Π½Π° ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€Π° ΡΡŠΠΎΡ‚Π²Π΅Ρ‚Π½ΠΎ Π² Ρ‡Π΅Ρ€Π²Π΅Π½ΠΎ, Π·Π΅Π»Π΅Π½ΠΎ ΠΈ синьо. Π”Ρ€ΡƒΠ³ΠΈ Π²Π°ΠΆΠ½ΠΈ сигнали са V-SYNC ΠΈ H-SYNC синхронизиращи сигнали, ΠΊΠ°ΠΊΡ‚ΠΎ ΠΈ CLK. Π’Π°ΠΊΡ‚ΠΎΠ²Π°Ρ‚Π° чСстота Π½Π° CLK Π΅ чСстотата, ΠΏΡ€ΠΈ която стойноститС Π½Π° пиксСлитС сС ΠΈΠ·Π²Π΅ΠΆΠ΄Π°Ρ‚ към ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€Π° ΠΈ зависи ΠΎΡ‚ избрания Π²ΠΈΠ΄Π΅ΠΎ Ρ€Π΅ΠΆΠΈΠΌ.

Π—Π° Π΄Π° ΡΠ²ΡŠΡ€ΠΆΠ΅Ρ‚Π΅ Ρ†ΠΈΡ„Ρ€ΠΎΠ² HDMI ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€, трябва Π΄Π° заснСмСтС DPI интСрфСйсни сигнали ΠΈ Π΄Π° Π³ΠΈ ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€Π°Ρ‚Π΅ Π² HDMI сигнали. Π’ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° сС Π½Π°ΠΏΡ€Π°Π²ΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° всяка FPGA ΠΏΠ»Π°Ρ‚ΠΊΠ°. ΠšΠ°ΠΊΡ‚ΠΎ сС ΠΎΠΊΠ°Π·Π°, ΠΏΠ»Π°Ρ‚ΠΊΠ°Ρ‚Π° Mars Rover2rpi Π΅ подходяща Π·Π° Ρ‚Π°Π·ΠΈ Ρ†Π΅Π». Π’ΡΡŠΡ‰Π½ΠΎΡΡ‚ основната опция Π·Π° ΡΠ²ΡŠΡ€Π·Π²Π°Π½Π΅ Π½Π° Ρ‚Π°Π·ΠΈ ΠΏΠ»Π°Ρ‚ΠΊΠ° Ρ‡Ρ€Π΅Π· спСциалСн Π°Π΄Π°ΠΏΡ‚Π΅Ρ€ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° Ρ‚Π°ΠΊΠ°:

Π’Ρ‚ΠΎΡ€ΠΈ HDMI ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ към Raspberry Pi3 Ρ‡Ρ€Π΅Π· DPI интСрфСйс ΠΈ FPGA ΠΏΠ»Π°Ρ‚ΠΊΠ°

Π’Π°Π·ΠΈ ΠΏΠ»Π°Ρ‚ΠΊΠ° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π° ΡƒΠ²Π΅Π»ΠΈΡ‡Π°Π²Π°Π½Π΅ Π½Π° броя Π½Π° GPIO ΠΏΠΎΡ€Ρ‚ΠΎΠ²Π΅Ρ‚Π΅ ΠΈ Π·Π° ΡΠ²ΡŠΡ€Π·Π²Π°Π½Π΅ Π½Π° ΠΏΠΎΠ²Π΅Ρ‡Π΅ ΠΏΠ΅Ρ€ΠΈΡ„Π΅Ρ€Π½ΠΈ устройства към ΠΌΠ°Π»ΠΈΠ½Π°Ρ‚Π°. Π’ ΡΡŠΡ‰ΠΎΡ‚ΠΎ Π²Ρ€Π΅ΠΌΠ΅ 4 GPIO сигнала с Ρ‚Π°Π·ΠΈ Π²Ρ€ΡŠΠ·ΠΊΠ° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ Π·Π° JTAG сигнали, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° ΠΎΡ‚ разпространСниСто Π΄Π° ΠΌΠΎΠΆΠ΅ Π΄Π° Π·Π°Ρ€Π΅Π΄ΠΈ Ρ„ΡŠΡ€ΠΌΡƒΠ΅Ρ€Π° Π½Π° FPGA Π² FPGA. ΠŸΠΎΡ€Π°Π΄ΠΈ Ρ‚ΠΎΠ²Π° Ρ‚Π°ΠΊΠ°Π²Π° Ρ€Π΅Π΄ΠΎΠ²Π½Π° Π²Ρ€ΡŠΠ·ΠΊΠ° Π½Π΅ ΠΌΠ΅ устройва, 4 DPI сигнали ΠΎΡ‚ΠΏΠ°Π΄Π°Ρ‚. Π—Π° щастиС, Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΈΡ‚Π΅ Π³Ρ€Π΅Π±Π΅Π½ΠΈ Π½Π° Π΄ΡŠΡΠΊΠ°Ρ‚Π° ΠΈΠΌΠ°Ρ‚ Ρ‰ΠΈΡ„Ρ‚ΠΎΠ²Π΅, ΡΡŠΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΈ с Raspberry. Π—Π° Π΄Π° ΠΌΠΎΠ³Π° Π΄Π° Π·Π°Π²ΡŠΡ€Ρ‚Ρ ΠΏΠ»Π°Ρ‚ΠΊΠ°Ρ‚Π° Π½Π° 90 градуса ΠΈ ΠΏΠ°ΠΊ Π΄Π° я ΡΠ²ΡŠΡ€ΠΆΠ° с моята ΠΌΠ°Π»ΠΈΠ½Π°:

Π’Ρ‚ΠΎΡ€ΠΈ HDMI ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ към Raspberry Pi3 Ρ‡Ρ€Π΅Π· DPI интСрфСйс ΠΈ FPGA ΠΏΠ»Π°Ρ‚ΠΊΠ°

Π Π°Π·Π±ΠΈΡ€Π° сС, Ρ‰Π΅ трябва Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ външСн JTAG ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚ΠΎΡ€, Π½ΠΎ Ρ‚ΠΎΠ²Π° Π½Π΅ Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ.

ВсС ΠΎΡ‰Π΅ ΠΈΠΌΠ° малък ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ. НС всСки Ρ‰ΠΈΡ„Ρ‚ Π½Π° FPGA ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΊΠ°Ρ‚ΠΎ Π²Ρ…ΠΎΠ΄ Π·Π° часовник. Има само няколко спСциални ΠΏΠΈΠ½Π°, ΠΊΠΎΠΈΡ‚ΠΎ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ Π·Π° Ρ‚Π°Π·ΠΈ Ρ†Π΅Π». Π’Π°ΠΊΠ° сС ΠΎΠΊΠ°Π·Π°, Ρ‡Π΅ GPIO_0 CLK ΡΠΈΠ³Π½Π°Π»ΡŠΡ‚ Π½Π΅ достига Π΄ΠΎ FPGA Π²Ρ…ΠΎΠ΄Π°, ΠΊΠΎΠΉΡ‚ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΊΠ°Ρ‚ΠΎ FPGA часовников Π²Ρ…ΠΎΠ΄. Π’Π°ΠΊΠ° Ρ‡Π΅ всС ΠΏΠ°ΠΊ Ρ‚Ρ€ΡΠ±Π²Π°ΡˆΠ΅ Π΄Π° Ρ…Π²ΡŠΡ€Π»Ρ Π΅Π΄Π½Π° публикация Π½Π° шал. Π‘Π²ΡŠΡ€Π·Π²Π°ΠΌ GPIO_0 ΠΈ KEY[1] сигнал Π½Π° ΠΏΠ»Π°Ρ‚ΠΊΠ°Ρ‚Π°:

Π’Ρ‚ΠΎΡ€ΠΈ HDMI ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ към Raspberry Pi3 Ρ‡Ρ€Π΅Π· DPI интСрфСйс ΠΈ FPGA ΠΏΠ»Π°Ρ‚ΠΊΠ°

Π‘Π΅Π³Π° Ρ‰Π΅ Π²ΠΈ Ρ€Π°Π·ΠΊΠ°ΠΆΠ° ΠΌΠ°Π»ΠΊΠΎ Π·Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π² FPGA. ΠžΡΠ½ΠΎΠ²Π½Π°Ρ‚Π° трудност ΠΏΡ€ΠΈ Ρ„ΠΎΡ€ΠΌΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ Π½Π° HDMI сигнали са ΠΌΠ½ΠΎΠ³ΠΎ високитС чСстоти. Π Π°Π·Π³Π»Π΅ΠΆΠ΄Π°ΠΉΠΊΠΈ Ρ€Π°Π·Π²ΠΎΠ΄ΠΊΠ°Ρ‚Π° Π½Π° HDMI ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€Π°, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡ‚Π΅, Ρ‡Π΅ RGB сигналитС Π²Π΅Ρ‡Π΅ са сСрийни Π΄ΠΈΡ„Π΅Ρ€Π΅Π½Ρ†ΠΈΠ°Π»Π½ΠΈ сигнали:

Π’Ρ‚ΠΎΡ€ΠΈ HDMI ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ към Raspberry Pi3 Ρ‡Ρ€Π΅Π· DPI интСрфСйс ΠΈ FPGA ΠΏΠ»Π°Ρ‚ΠΊΠ°

Π˜Π·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Π΄ΠΈΡ„Π΅Ρ€Π΅Π½Ρ†ΠΈΠ°Π»Π΅Π½ сигнал Π²ΠΈ позволява Π΄Π° сС справитС с ΡˆΡƒΠΌΠ° Π² ΠΎΠ±Ρ‰ Ρ€Π΅ΠΆΠΈΠΌ Π½Π° ΠΏΡ€Π΅Π΄Π°Π²Π°Ρ‚Π΅Π»Π½Π°Ρ‚Π° линия. Π’ Ρ‚ΠΎΠ·ΠΈ случай оригиналният осСм-Π±ΠΈΡ‚ΠΎΠ² ΠΊΠΎΠ΄ Π½Π° всСки Ρ†Π²Π΅Ρ‚Π΅Π½ сигнал сС ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ²Π° Π² 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 Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚ΡƒΠΊ Π² github.

ΠšΠΎΠΌΠΏΠΈΠ»ΠΈΡ€Π°Π½ΠΈΡΡ‚ Ρ„ΡŠΡ€ΠΌΡƒΠ΅Ρ€ Π·Π° 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, трябва Π΄Π°:

  1. Π΄Π΅Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€Π°ΠΉΡ‚Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° i2c, i2s, spi;
  2. Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€Π°Π½Π΅ Π½Π° DPI Ρ€Π΅ΠΆΠΈΠΌ с наслагванС dtoverlay=dpi24;
  3. Π·Π°Π΄Π°ΠΉΡ‚Π΅ Π²ΠΈΠ΄Π΅ΠΎ Ρ€Π΅ΠΆΠΈΠΌ 1280Γ—720 60Hz, 24 Π±ΠΈΡ‚Π° Π½Π° Ρ‚ΠΎΡ‡ΠΊΠ° Π½Π° DPI;
  4. посочСтС нСобходимия Π±Ρ€ΠΎΠΉ 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