ααΈααα’αΌααααααα αΆαα ααααα Raspberry Pi3 αααααααΆααααΆαα½αααΆααΆααααα§αααααααααΆαα GPIO ααΊααΆααααα FPGA Mars Rover2rpi (Cyclone IV) ααααααΌααΈααα HDMI ααααΌαααΆαααααΆααα αααΌααΈαααααΈααΈαααααΌαααΆαααααΆααααΆααααα§αααααααααΆαα HDMI αααααααΆααα Raspberry Pi3 α α’αααΈααααααααΆαααααΎαααΆαααΆαα½αααααΆααΌα ααΆαααααααααααΌααΈαααααΈαα
αααααΆαααααα»αααΉαααααΆααα’αααααΈαααααααααΆααααΌαααΆαα’αα»ααααα
ααααα Raspberry Pi3 ααααααα·ααααΆαα§αααααααααΆαα GPIO αααα’αααα’αΆα ααααΆααααΆααααααΈαααααααα α§αααααα αΆαααααααΆ, LEDs, αααααα·ααΈαααααΆαααΌααα stepper αα·αα αααΎααααα αα»αααΆααα·αααααΆαααααααα»αααΈαα½αααα ααΎα§αααααααααΆααααΊα’αΆαααααααΎααΆαααααααα ααΆααααααααα αααα ααΆαααααααα ααΆαααααααα GPIO ALT2 α’αα»ααααΆαα±ααα’αααααααΌαα§αααααααααΆαααα ααααα ααα»α αααααΆαα DPI, αααα αΆαα ααα»α αααααΆαααααΆαααΆα‘ααα ααΆαααΆααααααΈααααααΆααααααΆαααααΌααΈααα VGA ααΆαααα DPI α αααααΆαααΆαααΆααααα ααΈαα½α αααΌααΈααα VGA αααααΆαααααααααααααΆααΌα HDMI αααα αΎα α αΎαααΈααΈα α ααα»α αααααΆααααΈααΈααααΊαααααΎαααΆα analogue ααΆααααααααΆααα ααΎαααΈααααα ααα 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 ααααΆααα
ααα ααΆααααΆαααα’ αα·αααααααααααα
ααΎααααΆαααΆα pinout αααααααΌαααααΆααΉα Raspberry α ααΌα
αααααααα»αα’αΆα
ααααα·αααααΆαααΆα 90 ααΊαααα α αΎααα
ααααααΆααααΆαα
raspberry αααααααα»α:
ααΆααΆααα·αααΆαα α’αααααΉαααααΌαααααΎαααααα·ααΈααααααααααα·ααΈ JTAG ααΆααααα
ααα»ααααααααα·ααααααΆαααα αΆααα
αα ααααΆααααα αΆααΌα αα½αα αα·ααααααΆαααααα»α FPGA α’αΆα ααααΌαααΆαααααΎααΆααΆααααα αΌαααΆα‘α·ααΆαααααα ααΆααααααα»ααα·ααααα½αα ααα½αααα»ααααααααα’αΆα ααααΎααΆααααααΆαααααααααααΆαααααα ααΌα ααααααΆααΆαααααααααΆααα ααΈαααααΆ GPIO_0 CLK signal αα·αααΆααααααΆααααα αΌα FPGA αααα’αΆα ααααΌαααΆαααααΎααΆααΆααααα αΌαααΆα‘α·ααΆ FPGA α ααΌα αααααααα»ααα ααααααΌαααΆαααααααα½ααα ααΎααααααΆα αααα»αααααΆαα GPIO_0 αα·ααααααΆ KEY[1] αααααααα»αααααΉααααΆαα·ααΆαα
α₯α‘αΌαααααααα»αααΉαααααΆααα’αααααααα·α
α’αααΈαααααα FPGA α ααΆαααααΆαα
αααααααα»αααΆααααααΎααααααΆ HDMI ααΊααααααααααααααΆααα ααααα·αααΎα’ααααααα‘ααααΎαα§αααααααααΆαα HDMI pinout α’αααα’αΆα
ααΎαααΎαααΆαααααΆ RGB α₯α‘αΌααααααΊααΆαααααΆααΈααααααααααααααααα
ααΆαααααΎααααΆαααααααΆααΈαααααααααααα’αα»ααααΆαα±ααα’αααααααα»ααααααααΆααααΉαααΆααααααααααααααα»αααααααΌαα
αα
ααΎαααααααααΌαα αααα»αααααΈααα ααΌαααααΆαααΈαααΈαααΎααααααααΆαααααΈαα½ααααααΌαααΆαααααααααα
ααΆ TMDS 10 αααΈα (ααΆααααααΌααααααΆααΈαααααααααααα’αααααααΆ)α αααααΊααΆαα·ααΈααΆααααααααααααΌααα·αααααΎααααΈαααααΆαααΆαα» DC α
ααααΈαααααΆ αα·αααΆαααααααααΆαααααΌααααααΆαααα»ααααααΆααααΈαααααααααααα αααααΆα 10 αααΈαα₯α‘αΌααααα
αΆαααΆα
αααααΌααααααΌαααΆααααααΆααααααααααααΆαααα½αααααααα ααΆααααααΆααααΏαααΆα‘α·ααΆαααααααααΌααααααααααΆα 10 ααααααααΏαααΆα‘α·ααΆααΈααααα ααααα·αααΎααΎαααα§ααΆα αααααααααΈααα’αΌ 1280x720 60Hz ααααααααααααΈαααααααααααααααΊ 74,25 MHz α ααααααα½αααααΆα 742,5 MHz α
ααΆα’αα»αα FPGAs ααααααΆαα·αααΆααααααααΆααααααα αααααΆαααΆαααΆααααα ααΆααααΆαααα’αααααΆαααα½αααΎα FPGA ααΆααααα»α DDIO ααααΆααααααΆαα½αα ααΆαααααααΊααΆααΆαααααα·ααααΆααααααΆααα½α αα α αΎαααΌα αααααΆααΊααΆ 2-to-1 serializers α αααααΊαα½αααα’αΆα αααα ααααΈααααΈαααΆαααααααΆαα ααΎαααααΎαα‘αΎα αα·αααααΆααα α»ααααααααααααΆα‘α·ααΆα αααααΆααααααΆαα αααα»ααααααα FPGA α’αααα’αΆα ααααΎαα·αααα 740 MHz ααααα»αααα 370 MHz ααα»ααααα’αααααααΌαααααΎααΆαα»αααααα DDIO αα αααα»α FPGA α α₯α‘αΌαααα 370 MHz ααΊααΆααααααααααα’αΆα αααααα ααΆαααΆαααααα»αα αΎαα ααΆα’αα»αα αααα 1280x720 ααΊααΆααααααααα αα»αααΆααααα αΆαααααααα·αα’αΆα αααααα ααΆααα αααα»α Cyclone IV FPGA ααααααΎααααααΆαααα‘αΎααα ααΎ Mars Rover2rpi boardα
ααΌα αααα αααα»αααΆααα ααΆ αααααααααΈαααααααα αΌα 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
ααα»ααααααΆααααααΆαα·αααααΎαααΆαααΌα αααααα α’αααααααΌαααααΎαα»αααΆα megafunction ALTDDIO_OUT αααα Alter ααΎααααΈααΎαααΆαα»αααααα DDIO αααΆααα·αααααΆααα αααααααααααααα»αααααΎαααΆαααΆαα»αααααΆααα ALTDDIO_OUT α
ααΆααα’αααααα’αΆα ααΎααα αα·ααΆαααααα·α ααα»ααααααΆααααΎαααΆαα
α’αααα’αΆα
ααΎαααΌααααααααΆααα’αααααααααααααα»α Verilog HDL
αααααα·ααΈαααααααααααΆαα ααααααααααΆαα FPGA ααααΌαααΆααααα αααα αααα»ααααααααΈα EPCS αααααΆαααα‘αΎααα ααΎααααΆα Mars Rover2rpiα ααΌα αααααα ααααααααΆαααααααΌαααΆαα’αα»αααααα αααα»αααααΉααααΆαα·ααΆα FPGA ααα FPGA ααΉαααααΌαααΆαα αΆααααααΎαααΈα’αααα αα αΆααααααΊ α αΎαα αΆααααααΎαα
α₯α‘αΌααααααΎαααααΌααα·ααΆαααααα·α α’αααΈααΆαααααααα ααΆαααααααααααα Raspberry αααα½αααΆααααΆααα
αααα»ααααα»αααααΎααΆααα·αααααααΎ Raspberry PI OS (32 bit) αααααα’ααααΎ Debian Buster, Version: August 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 ααΎααααΈααααΎαααΌααΈαααααΈααα ααΎ framebuffers ααΈα /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