11
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

FPGAでHDMI出力(Full-HD):その②エンコード/パラシリ変換

Last updated at Posted at 2017-10-11

FPGAでHDMI出力(Full-HD):その①のつづきです。

TMDSエンコーダ

エンコードの方法については、資料を参考にしており、これを回路化しました。

エンコーダをR、G、B各色にマルチインスタンスします。
このとき、同期信号はBlueのチャンネルにのみ入力します。

エンコーダを通すと8bitデータが10bitに変換されます。、。

HDMI_TX_ENCODE.vhd
----------------------------------------------------------------
--TMDSエンコーダモジュール
--	参考文献↓
--	http://www.hdmi-navi.com/tmds/
-----------------------------------------------------------------
	library	ieee;
	use		ieee.std_logic_1164.all;
	use		ieee.std_logic_unsigned.all;

	entity HDMI_TX_ENCODE is
		port(
		i_pclk		:in		std_logic						;--ピクセルクロック
		i_v_sync	:in		std_logic						;--垂直同期信号
		i_h_sync	:in		std_logic						;--水平同期信号
		i_ena		:in		std_logic						;--データイネーブル
		i_dat		:in		std_logic_vector(7 downto 0)	;--画素値
		o_dat		:out	std_logic_vector(9 downto 0)	);--エンコード出力
	end	entity;
	
architecture top of HDMI_TX_ENCODE is
	
	type typ_2BIT_ARY
		is array(integer range <>) of std_logic_vector(1 downto 0);
	
	---------------------------------------------
	--SIGNAL
	---------------------------------------------
	signal	sync		:typ_2BIT_ARY(1 to 3)			:=(others=>(others=>'0'))	;
	signal	ena			:std_logic_vector(1 to 3)		:=(others=>'0')			;
	
	signal	dat1		:std_logic_vector(7 downto 0)	:=(others=>'0')			;
	signal	bit_num		:std_logic_vector(3 downto 0)	:=(others=>'0')			;
	
	signal	enc_xnor	:std_logic_vector(8 downto 0)							;
	signal	enc_xor		:std_logic_vector(8 downto 0)							;
	signal	dat2_tm		:std_logic_vector(8 downto 0)	:=(others=>'0')			;

	signal	dat3		:std_logic_vector(8 downto 0)	:=(others=>'0')			;
	signal	n1			:integer range 0 to 8			:=0						;
	signal	dc			:integer range -8 to 8			:=0						;
	signal	disparity	:integer range -16 to 15		:=0						;
	signal	enc			:std_logic_vector(9 downto 0)	:=(others=>'0')			;

begin
	
	--===================================================
	--同期信号とデータイネーブルをパイプラインレイテンシに
	--合わせて遅延
	--===================================================
	process(i_pclk)begin
		if(rising_edge(i_pclk))then
			--Stage1
			sync(1)(0)	<=i_h_sync	;
			sync(1)(1)	<=i_v_sync	;
			ena(1)		<=i_ena		;
			--Stage2
			sync(2)	<=sync(1)	;
			ena(2)	<=ena(1)	;
			--Stage3
			sync(3)	<=sync(2)	;
			ena(3)	<=ena(2)	;
		end if;
	end process;
			
			
	--===================================================
	--Transition Minimized :遷移回数削減処理
	--	8bit => 9bit変換
	--===================================================
	
	--Stage1----------------------------------------
	process(i_pclk)
		variable	tmp	:std_logic_vector(3 downto 0);
	begin
		if(rising_edge(i_pclk))then
			--タイミング合わせFF
			dat1	<=i_dat;
			
			--bitの立っている数を数える
			tmp:=(others=>'0');
			for i in 0 to 7 loop
				if(i_dat(i)='1')then
					tmp	:=tmp +1;
				end if;
			end loop;
			bit_num	<=tmp;
			
		end if;
	end process;
		
	--Stage2----------------------------------------

	--XNORプロセス:隣のbitと不一致なら0
	enc_xnor(0)	<=dat1(0);
	enc_xnor(1)	<=dat1(1) xnor enc_xnor(0);
	enc_xnor(2)	<=dat1(2) xnor enc_xnor(1);
	enc_xnor(3)	<=dat1(3) xnor enc_xnor(2);
	enc_xnor(4)	<=dat1(4) xnor enc_xnor(3);
	enc_xnor(5)	<=dat1(5) xnor enc_xnor(4);
	enc_xnor(6)	<=dat1(6) xnor enc_xnor(5);
	enc_xnor(7)	<=dat1(7) xnor enc_xnor(6);
	enc_xnor(8)	<='0';

	--XORプロセス:隣のbitと不一致なら1
	enc_xor(0)	<=dat1(0);
	enc_xor(1)	<=dat1(1) xor enc_xor(0);
	enc_xor(2)	<=dat1(2) xor enc_xor(1);
	enc_xor(3)	<=dat1(3) xor enc_xor(2);
	enc_xor(4)	<=dat1(4) xor enc_xor(3);
	enc_xor(5)	<=dat1(5) xor enc_xor(4);
	enc_xor(6)	<=dat1(6) xor enc_xor(5);
	enc_xor(7)	<=dat1(7) xor enc_xor(6);
	enc_xor(8)	<='1';
	
	process(i_pclk)begin
		if(rising_edge(i_pclk))then
			--TMデータ(Transmition Minimized)
			if	(bit_num >x"4") or						--5bit以上たっている。 
				( (bit_num=x"4")and(dat1(0)='0') )then	--4bit立っててかつbit0が0
				dat2_tm	<=enc_xnor;
			else
				dat2_tm	<=enc_xor;
			end if;
		end if;
	end process;
	
	--===================================================
	--DC-Balancing:0と1の割合を50%に近付ける
	--	9bit⇒10bit変換
	--===================================================
	
	--Stage3----------------------------------------
	process(i_pclk)
		variable	tmp_n1	:integer range  0 to 8;
		variable	tmp_dc	:integer range -8 to 8;
	begin
		if(rising_edge(i_pclk))then
			--タイミング合わせFF
			dat3	<=dat2_tm;
			
			--TMデータ下位8not中に含まれる1の数を数える
			tmp_n1:=0;
			for i in 0 to 7 loop
				if(dat2_tm(i)='1')then
					tmp_n1	:=tmp_n1 +1;
				end if;
			end loop;
			n1	<=tmp_n1;
			
			--TMデータ下位8not中DC成分(1の数-0の数)
			tmp_dc:=0;
			for i in 0 to 7 loop
				if(dat2_tm(i)='0')then
					tmp_dc	:=tmp_dc -1;
				else
					tmp_dc	:=tmp_dc +1;
				end if;
			end loop;
			
			dc	<=tmp_dc;
		end if;
	end process;
	
	--Stage4----------------------------------------
	process(i_pclk)begin
		if(rising_edge(i_pclk)) then
			if(ena(3)='0') then 
			---------------------
			--ブランク期間
			---------------------
				--データ:2b10b変換
				case(sync(3))is
					when "00" => enc <= "1101010100";
					when "01" => enc <= "0010101011";
					when "10" => enc <= "0101010100";
					when "11" => enc <= "1010101011";
					when others => null;
				end case;
				--ディスパリティ:ゼロクリア
				disparity <= 0;
			else
			---------------------
			--有効データ期間
			---------------------
				--詳しくは:https://eewiki.net/pages/viewpage.action?pageId=36569119
				if(disparity=0)or(n1=4) then
					if(dat3(8)='0') then
						enc(9)			<='1';
						enc(8)			<='0';
						enc(7 downto 0)	<=not dat3(7 downto 0);
						disparity 		<=disparity - dc;
					else
						enc(9)			<='0';
						enc(8)			<='1';
						enc(7 downto 0)	<=dat3(7 downto 0);
						disparity 		<=disparity + dc;
					end if;
				else
					if((disparity>0)and(n1>4))
					or((disparity<0)and(n1<4)) then
						
						if(dat3(8)='0') then
							enc(9)			<='1';
							enc(8)			<='0';
							enc(7 downto 0)	<=not dat3(7 downto 0);
							disparity		<=disparity - dc;
						else
							enc(9)			<='1';
							enc(8)			<='1';
							enc(7 downto 0)	<=not dat3(7 downto 0);
							disparity		<=disparity - dc + 2;
						end if;
					else
						if(dat3(8) = '0') then
							enc(9)			<='0';
							enc(8)			<='0';
							enc(7 downto 0)	<=dat3(7 downto 0);
							disparity 		<=disparity + dc - 2;
						else
							enc(9)			<='0';
							enc(8)			<='1';
							enc(7 downto 0)	<=dat3(7 downto 0);
							disparity 		<=disparity + dc;
						end if;
					end if;
				end if;
				
			end if;
		end if;
	end process;
	
	o_dat	<=enc;
	
end architecture;

#パラシリ変換

パラシリ変換部は10bitにエンコードされたデータをシリアルにして出力します。

  • シリアルデータ出力使用

  • LSBファースト

  • 差動信号に変換し出力

  • R,G,B,クロックの4ペア

  • クロックペアは、ピクセルクロック周波数(148.5MHz)と同じレート

  • データペアは、ピクセルクロックの10倍のレート(1.485Gbps)

  • Spartan6に実装する上でのポイント

    • データペアが1.485Gで動作するため、通常のロジック記述では性能が出ないため、SERDESEを使用する。
    • SERDESEは8:1のシリアライズまでしか対応していないため、一度5bitで×2倍のレートにし、5:1のSERDESEを使用する。

n対1 SERDESE

n対1にシリアライズするSERDESE部分です。
これを、各ペア分(4つ)マルチインスタンスします。

HDMI_TX_SERDESE.vhd
	library ieee;
	use ieee.std_logic_1164.all;
	use ieee.numeric_std.all;
	
	library UNISIM;
	use UNISIM.Vcomponents.all;

	entity HDMI_TX_SERDESE is
		generic ( SF : integer := 0 );
		port (
		ioclk           :in		std_logic						;
		gclk            :in		std_logic						;
		rst             :in		std_logic						;
		serdesstrobe_i  :in		std_logic						;
		data_i          :in		std_logic_vector(SF-1 downto 0)	;
		data_o          :out	std_logic						);
	end entity;

architecture rtl of HDMI_TX_SERDESE is
	signal cascade_di  : std_logic;
	signal cascade_do  : std_logic;
	signal cascade_ti  : std_logic;
	signal cascade_to  : std_logic;
	signal mdatain     : std_logic_vector(8 downto 0);
begin
	
	datir: for I in 0 to SF-1 generate
		mdatain(I) <= data_i(I);
	end generate;
	
	dati0: for I in SF to 8 generate
		mdatain(I) <= '0';
	end generate;

	oserdes_m: OSERDES2
	generic map
		(DATA_WIDTH		=>SF	-- SERDES word width.  This should match the setting is BUFPLL
		,DATA_RATE_OQ	=>"SDR"			-- <SDR>, DDR
		,DATA_RATE_OT	=>"SDR"			-- <SDR>, DDR
		,SERDES_MODE	=>"MASTER"		-- <DEFAULT>, MASTER, SLAVE
		,OUTPUT_MODE	=>"DIFFERENTIAL"
		)
	port map
		(OQ 		=>data_o
		,OCE		=>'1'
		,CLK0		=>ioclk
		,CLK1		=>'0'
		,IOCE		=>serdesstrobe_i
		,RST		=>rst
		,CLKDIV		=>gclk
		,D4			=>mdatain(7)
		,D3			=>mdatain(6)
		,D2			=>mdatain(5)
		,D1			=>mdatain(4)
		,TQ			=>open
		,T1			=>'0'
		,T2			=>'0'
		,T3			=>'0'
		,T4			=>'0'
		,TRAIN		=>'0'
		,TCE		=>'1'
		,SHIFTIN1	=>'1'			-- Dummy input in Master
		,SHIFTIN2	=>'1'			-- Dummy input in Master
		,SHIFTIN3	=>cascade_do	-- Cascade output D data from slave
		,SHIFTIN4	=>cascade_to	-- Cascade output T data from slave
		,SHIFTOUT1	=>cascade_di	-- Cascade input D data to slave
		,SHIFTOUT2	=>cascade_ti	-- Cascade input T data to slave
		,SHIFTOUT3	=>open			-- Dummy output in Master
		,SHIFTOUT4	=>open			-- Dummy output in Master
		);

	oserdes_s: OSERDES2
	generic map
		(DATA_WIDTH		=>SF			-- SERDES word width.  This should match the setting is BUFPLL
		,DATA_RATE_OT	=>"SDR"			-- <SDR>, DDR
		,DATA_RATE_OQ	=>"SDR"			-- <SDR>, DDR
		,SERDES_MODE	=>"SLAVE"		-- <DEFAULT>, MASTER, SLAVE
		,OUTPUT_MODE	=>"DIFFERENTIAL"
		)
	port map
		(OQ			=>open
		,OCE		=>'1'
		,CLK0		=>ioclk
		,CLK1		=>'0'
		,IOCE		=>serdesstrobe_i
		,RST		=>rst
		,CLKDIV		=>gclk
		,D4			=>mdatain(3)
		,D3			=>mdatain(2)
		,D2			=>mdatain(1)
		,D1			=>mdatain(0)
		,TQ			=>open
		,T1			=>'0'
		,T2			=>'0'
		,T3			=>'0'
		,T4			=>'0'
		,TRAIN		=>'0'
		,TCE		=>'1'
		,SHIFTIN1	=>cascade_di	-- Cascade input D from Master
		,SHIFTIN2	=>cascade_ti	-- Cascade input T from Master
		,SHIFTIN4	=>'1'			-- Dummy input in Slave
		,SHIFTIN3	=>'1'			-- Dummy input in Slave
		,SHIFTOUT1	=>open			-- Dummy output in Slave
		,SHIFTOUT2	=>open			-- Dummy output in Slave
		,SHIFTOUT3	=>cascade_do	-- Cascade output D data to Master
		,SHIFTOUT4	=>cascade_to	-- Cascade output T data to Master
		);
		
end architecture;

SERDESE エンコーダ ラッパー

エンコーダ×3 と SERDESE×4をインスタンスするラッパーモジュールです。
SERDESE用の×10クロックと、5bit化する際の ×2クロックの生成も行います。

HDMI_TX.vhd
	library	ieee;
	use		ieee.std_logic_1164.all;

	library	UNISIM;
	use		UNISIM.Vcomponents.all;

	entity HDMI_TX is
		port(
		i_clk		:in		std_logic						;--Pixl Clock
		i_rst		:in		std_logic						;--Reset High active
		i_img_vs	:in		std_logic						;--Vertical sync
		i_img_hs	:in		std_logic						;--Horizontal sync
		i_img_ena	:in		std_logic						;--Image data enable
		i_img_red	:in		std_logic_vector(7 downto 0)	;--Image data RED
		i_img_grn	:in		std_logic_vector(7 downto 0)	;--Image data GREEN
		i_img_blu	:in		std_logic_vector(7 downto 0)	;--Image data BLUE
		o_hdmi_clk_p:out	std_logic						;--HDMI clock+ 
		o_hdmi_clk_n:out	std_logic						;--HDMI clock-
		o_hdmi_red_p:out	std_logic						;--Red+
		o_hdmi_red_n:out	std_logic						;--Red-
		o_hdmi_grn_p:out	std_logic						;--Green+
		o_hdmi_grn_n:out	std_logic						;--Green-
		o_hdmi_blu_p:out	std_logic						;--Blue+
		o_hdmi_blu_n:out	std_logic						);--Blue-
	end	entity;
	
architecture top of HDMI_TX is
	constant	PLLX		:integer	:=10		;--PLL逓倍比
	constant	PLLD		:integer	:=1			;--PLL分周比
	constant	SER_FACT	:integer	:=5			;--シリアライズ係数 1..8
	constant	CLKIN_PERIOD:real		:=13.33		;--入力クロック周期(ns)
	
	type typ_ARY5BIT	is array(integer range <>) of std_logic_vector(4 downto 0);
	
	signal 	pll_lock	:std_logic						;--
	signal 	feedback	:std_logic						;--
	signal 	pll_clk		:std_logic_vector(0 to 1)		;--
	signal	pclk_x2		:std_logic						;--
	signal	pclk_x10	:std_logic						;--
	signal	ser_stb		:std_logic						;--
	signal	enc_r		:std_logic_vector(9 downto 0)	;--
	signal	enc_g		:std_logic_vector(9 downto 0)	;--
	signal	enc_b		:std_logic_vector(9 downto 0)	;--
	signal	flg			:std_logic						;--
	signal	enc_buf		:typ_ARY5BIT(0 to 3)			;--
	signal	sirial_dt	:std_logic_vector(0 to 3)		;--シリアルデータ(clk+RGB)
	
begin
	---------------------------------------------
	--10倍クロック生成
	---------------------------------------------
	u_HDMI_PLL:PLL_ADV
	generic map
	(BANDWIDTH			=>"OPTIMIZED"	-- "high", "low" or "optimized"
	,CLKFBOUT_MULT		=>PLLX			-- 逓倍比(1~64)
	,CLKFBOUT_PHASE		=>0.0			-- phase shift (degrees) of all output clocks
	,CLKIN1_PERIOD		=>CLKIN_PERIOD	-- clock period (ns) of input clock on clkin1
	,CLKIN2_PERIOD		=>CLKIN_PERIOD	-- clock period (ns) of input clock on clkin2
	,CLKOUT0_DUTY_CYCLE	=>0.5			--Duty cycle for clkout0 (0.01 to 0.99)
	,CLKOUT1_DUTY_CYCLE	=>0.5			--
	,CLKOUT2_DUTY_CYCLE	=>0.5			--
	,CLKOUT3_DUTY_CYCLE	=>0.5			--
	,CLKOUT4_DUTY_CYCLE	=>0.5			--
	,CLKOUT5_DUTY_CYCLE	=>0.5			--
	,CLKOUT0_PHASE		=>90.0			--phase shift (degrees) for clkout0 (0.0 to 360.0)
	,CLKOUT1_PHASE		=>0.0			--位相は90°が良かった。(SIMの話だが・・・)
	,CLKOUT2_PHASE		=>0.0			--
	,CLKOUT3_PHASE		=>0.0			--
	,CLKOUT4_PHASE		=>0.0			--
	,CLKOUT5_PHASE		=>0.0			--
	,CLKOUT0_DIVIDE		=>5				--分周比(1 to 128)
	,CLKOUT1_DIVIDE		=>1 			-- 
	,CLKOUT2_DIVIDE		=>10			-- 
	,CLKOUT3_DIVIDE		=>1				-- 
	,CLKOUT4_DIVIDE		=>1				-- 
	,CLKOUT5_DIVIDE		=>1				-- 
	,COMPENSATION		=>"INTERNAL"	-- "SYSTEM_SYNCHRONOUS", "SOURCE_SYNCHRONOUS", "INTERNAL", "EXTERNAL", "DCM2PLL", "PLL2DCM"
	,DIVCLK_DIVIDE		=>PLLD			-- 分周比 (1 to 52)
	,REF_JITTER			=>0.100			-- input reference jitter (0.000 to 0.999 ui%)
	)
	port map
	(CLKFBDCM			=>open			--DCMを駆動する場合のフィードバック
	,CLKFBOUT			=>feedback		--general output feedback signal
	,CLKIN1				=>i_clk			--primary clock input
	,CLKIN2				=>'0'			--セカンダリクロック(未使用)
	,CLKOUT0			=>pll_clk(0)	--PLLクロック
	,CLKOUT1			=>pll_clk(1) 	--
	,CLKOUT2			=>open			-- 
	,CLKOUT3			=>open			-- 
	,CLKOUT4			=>open			--
	,CLKOUT5			=>open			--
	,CLKOUTDCM0			=>open			-- DCMに接続できるクロック
	,CLKOUTDCM1			=>open			-- 
	,CLKOUTDCM2			=>open			-- 
	,CLKOUTDCM3			=>open			-- 
	,CLKOUTDCM4			=>open			-- 
	,CLKOUTDCM5			=>open			-- 
	,DO					=>open			-- dynamic reconfig data output (16-bits)
	,DRDY				=>open			-- dynamic reconfig ready output
	,LOCKED				=>pll_lock		-- PLLロックステータス
	,CLKFBIN			=>feedback		-- clock feedback input
	,CLKINSEL			=>'1'			-- selects '1' = clkin1, '0' = clkin2
	,DADDR				=>"00000"		-- dynamic reconfig address input (5-bits)
	,DCLK				=>'0'			-- dynamic reconfig clock input
	,DEN				=>'0'			-- dynamic reconfig enable input
	,DI					=>x"0000"		-- dynamic reconfig data input (16-bits)
	,DWE				=>'0'			-- dynamic reconfig write enable input
	,RST				=>i_rst			-- asynchronous pll reset
	,REL				=>'0'			-- used to force the state of the PFD outputs (test only)
	);
	
	---------------------------------------------
	--グローバルバッファ(x2クロック)
	---------------------------------------------
	u_BUFG_PCLK_X2:BUFG
	port map
	(I	=>pll_clk(0)
	,O	=>pclk_x2
	);

	---------------------------------------------
	--SERDESE用x10クロック生成
	---------------------------------------------
	u_BUFPLL:BUFPLL
	generic map
	(DIVIDE			=>SER_FACT		--シリパラ比(1 to 8)
	)
	port map
	(PLLIN			=>pll_clk(1)	-- PLL Clock input
	,GCLK			=>pclk_x2		-- Global Clock input
	,LOCKED			=>pll_lock		-- Clock0 locked input
	,IOCLK			=>pclk_x10 		-- Output PLL Clock
	,LOCK			=>open			-- PLLロックステータス(本当は見た方が良い)
	,SERDESSTROBE	=>ser_stb		-- Output SERDES strobe
	);
	
	
	--エンコード:RED
	u_HDMI_TX_ENCODE_RED:entity work.HDMI_TX_ENCODE
		port map
		(i_pclk		=>i_clk
		,i_v_sync	=>'0'
		,i_h_sync	=>'0'
		,i_ena		=>i_img_ena
		,i_dat		=>i_img_red
		,o_dat		=>enc_r
		);
	--エンコード:GREEN
	u_HDMI_TX_ENCODE_GRN:entity work.HDMI_TX_ENCODE
		port map
		(i_pclk		=>i_clk
		,i_v_sync	=>'0'
		,i_h_sync	=>'0'
		,i_ena		=>i_img_ena
		,i_dat		=>i_img_grn
		,o_dat		=>enc_g
		);
	--エンコード:BLUE
	u_HDMI_TX_ENCODE_BLU:entity work.HDMI_TX_ENCODE
		port map
		(i_pclk		=>i_clk
		,i_v_sync	=>i_img_vs
		,i_h_sync	=>i_img_hs
		,i_ena		=>i_img_ena
		,i_dat		=>i_img_blu
		,o_dat		=>enc_b
		);
	
	--10bit⇒5bit×2サイクル
	--	ここでPixlClockで来てるデータをpclk_x2で叩いている。
	--	一応動作はしているけど、本当は非同期渡しをきっちりやったほうが良い。
	process(pclk_x2,i_rst)begin
		if(i_rst='1')then
			flg		<='1';
			enc_buf	<=(others=>(others=>'0'));
		elsif(Rising_Edge(pclk_x2))then
			flg	<=not flg;
			if(flg='1')then
				enc_buf(0)	<="11111";
				enc_buf(1)	<=enc_r(4 downto 0);
				enc_buf(2)	<=enc_g(4 downto 0);
				enc_buf(3)	<=enc_b(4 downto 0);
			else
				enc_buf(0)	<="00000";
				enc_buf(1)	<=enc_r(9 downto 5);
				enc_buf(2)	<=enc_g(9 downto 5);
				enc_buf(3)	<=enc_b(9 downto 5);
			end if;
		end if;
	end process;
	
	--シリアライザ 5to1
	GEN_SERIALIZER:for i in 0 to 3 generate
		u_HDMI_TX_SERDESE: entity work.HDMI_TX_SERDESE
			generic map
			(SF	=> 5)
			port map
			(ioclk          =>pclk_x10
			,gclk           =>pclk_x2
			,rst            =>i_rst
			,serdesstrobe_i =>ser_stb
			,data_i         =>enc_buf(i)
			,data_o         =>sirial_dt(i)
			);
	end generate;
	
	--出力差動バッファ
	OBUFDS_CLK:OBUFDS port map(I =>sirial_dt(0) , O =>o_hdmi_clk_p , OB =>o_hdmi_clk_n);
	OBUFDS_RED:OBUFDS port map(I =>sirial_dt(1) , O =>o_hdmi_red_p , OB =>o_hdmi_red_n);
	OBUFDS_GRN:OBUFDS port map(I =>sirial_dt(2) , O =>o_hdmi_grn_p , OB =>o_hdmi_grn_n);
	OBUFDS_BLU:OBUFDS port map(I =>sirial_dt(3) , O =>o_hdmi_blu_p , OB =>o_hdmi_blu_n);
	
	
end architecture;

その③へつづく

11
8
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?